Python实例到COM对象

时间:2011-03-28 02:13:51

标签: python com ole

我在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对象的回调。

2 个答案:

答案 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访问,反之亦然。 如果您没有许可和/或财务限制,可能值得一看。

如果有人可以在没有任何其他库的情况下打开它,那么期待回复。