我有一個設備,它記錄光譜數據,並由第三方應用程序控制。爲了實現自動化,我想使用應用程序的COM接口來檢索Python中的數據。由於沒有用於使用從Python中API沒有適當的文檔,我收集來自不同網絡資源下面的代碼,它成功地獲得第一幀:如何反思win32com包裝?
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)
然而,呼叫到GetFrame
是與其在視覺定義不一致基本的,這是由製造商提供:
Sub GetFrame(frame As Integer, buffer As Variant)
GetFrame
拷貝從一個文檔的數據到Visual Basic陣列。如果buffer
是空變量,則GetFrame
將創建一個具有適當大小和數據類型的數組,並在複製數據之前將緩衝區設置爲指向它。
這意味着,在Visual Basic中的變量buffer
填充數據,而功能GetFrame
沒有返回值,而在Python buffer
保持不變,但功能GetFrame
不會返回的實際數據。
我不會在乎這種微妙之處,如果我沒有觀察到我的程序隨機崩潰,拋出一個MemoryError
,從而表明在代碼的這一點上內存泄漏。所以我的懷疑是,每次調用GetFrame
一些內存被分配給緩衝區,但從未釋放,因爲win32com
莫名其妙地搞砸了API包裝。
這種推理將我引向我的實際問題:我如何反思這個包裝並理解它的作用?到目前爲止,我找不到任何提示win32com
生成的代碼存儲在任何文件中,但也許我只是沒有看到正確的位置。
在IPython中我也試圖讓使用doc.GetFrame??
信息,但它並沒有返回任何實現:
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
我還能嘗試獲得有關API的封裝器的更多信息?