J'ai un appareil qui enregistre des données spectroscopiques et est contrôlé par une application tierce. Pour l'automatisation, je veux utiliser l'interface COM de l'application pour récupérer les données en Python. Comme il n'y a pas de documentation adéquate pour l'utilisation de l'API de Python, je collectionnais le code suivant à partir de différentes sources Web, qui obtient avec succès la première image:Comment introspecter win32com wrapper?
comtypes.client.GetModule(('{1A762221-D8BA-11CF-AFC2-508201C10000}', 3, 11))
import comtypes.gen.WINX32Lib as WinSpecLib
win32com.client.pythoncom.CoInitialize()
doc = win32com.client.Dispatch("WinX32.DocFile")
buffer = ctypes.c_float()
frame = 1
spectrum = doc.GetFrame(frame, buffer)
Cependant, l'appel à GetFrame
est incompatible avec sa définition dans Visual de base, qui est fourni par le fabricant:
Sub GetFrame(frame As Integer, buffer As Variant)
GetFrame
copie les données d'un document dans un tableau Visual Basic. Sibuffer
est un Variant vide,GetFrame
crée un tableau de la taille et du type de données appropriés et définit le tampon pour qu'il pointe dessus avant de copier les données.
Cela signifie que dans Visual Basic est rempli la buffer
variable des données alors que la fonction GetFrame
n'a pas de valeur de retour, alors qu'en Python buffer
reste inchangé mais la fonction ne GetFrame
renvoyer les données réelles. Je ne m'intéresserais pas à de telles subtilités, si je n'avais pas observé les plantages aléatoires de mon programme en lançant un MemoryError
et en indiquant ainsi une fuite de mémoire à ce point précis du code. Donc, mon soupçon est que pour chaque appel à GetFrame
de la mémoire est allouée pour le tampon, mais jamais libéré, parce que win32com
en quelque sorte foiré l'emballage de l'API. Ce raisonnement m'amène à ma vraie question: comment puis-je introspecter cette enveloppe et comprendre ce qu'elle fait? Jusqu'à présent, je n'ai trouvé aucune indication que le code généré par win32com
est stocké dans un fichier, mais peut-être que je n'ai pas regardé les bons endroits.
En IPython j'ai essayé aussi d'obtenir des informations en utilisant doc.GetFrame??
, mais il n'a retourné aucun mise en œuvre:
Signature: doc.GetFrame(frame=<PyOleMissing object at 0x06F20BC8>, FrameVariant=<PyOleMissing object at 0x06F20BC8>)
Docstring: <no docstring>
File: c:\programming\python\src\<comobject winx32.docfile>
Type: method
Que puis-je essayer d'obtenir plus d'informations sur l'emballage API?