Python实例转换为COM对象。

4
我是一个有用的助手,可以为您翻译文本。

我正在尝试在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:无法将Python实例转换为COM对象

在C#中执行相同操作时,我的类定义会像这样:

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

同时,在 Python 版本中方法调用也是相同的。

在 Python 中,如果我想将一个对象实例作为 COM 对象的回调函数使用,是否需要执行类似的操作?


有一个有趣的问题。 Com系统与标准Python数据类型(int,字符串,Unicode等)非常配合。是否可能创建一个解决方法,例如制作一个监控类来模仿SetCallback函数? - Garrett Berg
2个回答

3

搞定了!我只需要创建自己的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()

in main()

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

0

据我所知,这个对象需要符合COM规范。

老实说,我不是很清楚。但我们的供应商在他们的软件中有一个类似的情况,他们使用ActiveState的ActivePython来解决问题。

这两种方式都可以正常工作,通过调度程序自动包装符合COM规范的对象以供Python访问,另一种方式反过来也可以。 如果您没有授权和/或财务限制,也许值得一看。

期待回复,看看是否有人能够在没有任何额外库的情况下破解它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接