我有一个设备,它记录光谱数据并由第 3 方应用程序控制。出于自动化目的,我想使用应用程序的 COM 接口来检索 Python 中的数据。由于没有使用 Python 的 API 的适当文档,我从不同的网络资源中收集了以下代码,成功获得了第一帧:
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)
Run Code Online (Sandbox Code Playgroud)
但是,对 的调用GetFrame与它在 Visual Basic 中的定义不一致,由制造商提供:
Run Code Online (Sandbox Code Playgroud)Sub GetFrame(frame As Integer, buffer As Variant)
GetFrame将文档中的数据复制到 Visual Basic 数组中。如果buffer是空 Variant,则GetFrame创建一个具有适当大小和数据类型的数组,并在复制数据之前将缓冲区设置为指向它。
这意味着在 Visual Basic 中,变量buffer填充了数据,而函数GetFrame没有返回值,而在 Python 中buffer保持不变,但函数GetFrame确实返回了实际数据。
如果我没有观察到我的程序随机崩溃抛出 aMemoryError并因此在代码的这一点指示内存泄漏,我就不会关心这些微妙之处。所以我的怀疑是,每次调用GetFrame某些内存时都会为缓冲区分配但从未释放过,因为win32com不知何故弄乱了 API 包装。 …