Python 实例到 COM 对象

问题描述 投票:0回答:3

我正在尝试在 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版本相同

为了使用对象的实例作为 COM 对象的回调,我必须在 Python 中执行类似的操作吗?

python com ole
3个回答
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()

在 main() 中

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

0
投票

据我所知,该对象需要符合 COM 标准。 说实话,我不知道开箱即用,但我们有一个有点类似的情况(在供应商的软件中),他们通过使用 ActiveState 的 ActivePython 解决了这个问题。

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

如果有人可以在没有任何额外库的情况下破解它,期待回复。


0
投票

如果你想避免注册,你可以简单地通过 win32com.server.util.wrap() 包装你的 Python 对象:

import win32com.server.util

callback = Callback()
mycomobject.SetCallback(win32com.server.util.wrap(callback))

class Callback():
    _public_methods_ = ['SetStatusText']
    def SetStatusText(self,status):
        print status
© www.soinside.com 2019 - 2024. All rights reserved.