【问题标题】:Python instance to COM ObjectPython 实例到 COM 对象
【发布时间】:2011-07-24 03:56:38
【问题描述】:

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

为了使用对象的实例作为 COM 对象的回调,我必须在 Python 中做这样的事情吗?

【问题讨论】:

  • 有趣的问题。 com 系统适用于标准的 python 数据类型(int、strings、unicode...)。是否可以创建一个解决方法,例如创建一个可以模仿 SetCallback 函数的监控类?

标签: python com ole


【解决方案1】:

AFAIK 对象需要符合 COM 标准。 老实说,我不知道开箱即用,但我们有一些类似的情况(在来自供应商的软件中),最终通过使用 ActiveState 的 ActivePython 来解决。

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

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

【讨论】:

    【解决方案2】:

    解决了!只需要制作我自己的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)
    

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多