我在Python中使用COM对象时遇到了一些麻烦,并遇到了一个小问题。
我正在使用的COM对象有一个名为SetCallback
的方法,它采用object
,方法如下:
[id(0x60010010)]
void SetCallback([in] IDispatch* callbackobject);
取自MS OLE / COM对象查看器
现在如果我在python中创建我的COM应用程序的实例,一切都很好,直到我尝试将对象的实例传递给此方法。
callback = Callback()
mycomobject.SetCallback(callback)
class Callback():
def SetStatusText(self,status):
print status
我在python窗口中遇到的错误是:TypeError: The Python instance can not be converted to a COM object
在C#中做同样的事情我曾经让我的类def看起来像这样:
[ComVisible(True)]
public class Callback
{
//some methods here
}
,方法调用与Python版本相同。
我是否需要在Python中使用对象的实例作为COM对象的回调。
答案 0 :(得分:1)
解决了!只需要创建我自己的COM服务器并注册它,然后通过Dispatch创建对象:
class Callback():
_public_methods_ = ['SetStatusText']
_reg_progid_ = "mycomobject.PythonCallback"
_reg_clsid_ = "{14EF8D30-8B00-4B14-8891-36B8EF6D51FD}"
def SetStatusText(self,status):
print status
if __name__ == "__main__":
print "Registering COM server..."
import win32com.server.register
win32com.server.register.UseCommandLine(Callback)
main()
在main()
中callback = Dispatch("mycomobject.PythonCallback")
#callback.SetStatusText("Hello World")
mycomobject.SetCallback(callback)
答案 1 :(得分:0)
AFAIK对象需要符合COM标准。 说实话,我不知道开箱即用,但我们有一个类似的情况(在供应商的软件中),通过使用ActiveState的ActivePython来解决它们。
两种方式都可以正常工作,调度程序可以自动包装COM兼容对象以进行python访问,反之亦然。 如果您没有许可和/或财务限制,可能值得一看。
如果有人可以在没有任何其他库的情况下打开它,那么期待回复。