2011-03-28 109 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兼容對象,反之亦然。 如果您沒有許可和/或財務限制,可能值得一看。

如果有人能夠在沒有任何額外的庫的情況下將其打開,期待這些回覆。