在ocx编程过程中,由于BSTR是一个字符数组,为了在python与组件间传递BSTR类型的参数,一般来说需要:
1.在组件中,写如下类型的IDispatch接口
BSTR Class::ReturnBSTR()
{
BSTR ret = ::SysAllocString("test str value");
return ret;
}
2.然后在python的comtypes包内调用该函数
import comtypes.client as cc
test = cc.CreateObject("test.ocx");
str = test.ReturnBSTR
根据MSDN的说法,SysAllocString会分配系统内存,需要调用者对应调用SysFreeString, 为了探究comtypes是否进行了string的释放,我查看了comtypes的源码,发现在comtypes/automation.py at master · enthought/comtypes · GitHub中有如下代码,说明comtypes会对分配的内存通过VARIANT类的__del__函数进行内存回收
def Invoke(self, dispid, *args, **kw):
"""Invoke a method or property."""
# Mem