2011-03-28 366 views
1

我在使用COM对象和Python时遇到了一些问题,并且遇到了一个小问题。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#同样的事情,我曾经让我的类定义中,查找这样的:

[ComVisible(True)] 
public class Callback 
{ 
    //some methods here 
} 

和方法调用与Python版本相同。

是否有这样的事情,我必须在Python中做,以便使用对象的实例作为COM对象的回调。

+0

有趣的问题。 com系统在标准的python数据类型(int,strings,unicode ...)下工作良好。是否有可能创建一个解决方法,比如创建一个可以模仿SetCallback函数的监视类? – 2011-04-06 17:02:09

回答

0

解决了它!只是需要使自己的COM服务器,并注册,然后通过调度创建对象:

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() 
在主

()

callback = Dispatch("mycomobject.PythonCallback") 
#callback.SetStatusText("Hello World") 
mycomobject.SetCallback(callback) 
0

AFAIK该对象需要符合COM标准。 我不太了解开箱即可,但我们在使用ActiveState的ActivePython时遇到了类似的情况(在供应商提供的软件中)。

两种方式都可以正常工作,调度程序会自动为COM访问包装COM兼容对象,反之亦然。 如果您没有许可和/或财务限制,可能值得一看。

如果有人能够在没有任何额外的库的情况下将其打开,期待这些回复。