我有一个设备,它记录光谱数据,并由第三方应用程序控制。为了实现自动化,我想使用应用程序的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的封装器的更多信息?