2011-11-25 284 views
1

我正在使用UPnP對象方法IUPnPDeviceFinder :: [CreateAsyncFind][1]而第三個參數是回調函數。將函數作爲參數傳遞給COM對象函數

我試圖創建自己的COM對象,但該方法不回叫我的功能。這裏是我的代碼:

class Callback(): 
    _public_methods_ = ['DeviceAdded','DeviceRemoved', 'SearchComplete'] 
    _reg_progid_ = "UPnP.PythonCallback" 
    _reg_clsid_ = pythoncom.CreateGuid() 

    def DeviceAdded (device, UDN, calltype): 
     print (device, ": ", calltype, " UDN: ", UDN) 
     return 
win32com.server.register.UseCommandLine(Callback) 
callserver = Dispatch("UPnP.PythonCallback") 
deviceType = "urn:schemas-upnp-org:device:MediaServer:1" 
devices = finder.CreateAsyncFind(deviceType,0, callserver) 
finder.StartAsyncFind(devices) 

其實,我只是需要這樣的:

def DeviceAdded (device, UDN, calltype): 
    print (device, ": ", calltype, " UDN: ", UDN) 
    return 
deviceType = "urn:schemas-upnp-org:device:MediaServer:1" 
devices = finder.CreateAsyncFind(deviceType,0, DeviceAdded) 
finder.StartAsyncFind(devices) 

微軟的VBScript打了一個比方。這正是我想要在Python上執行的操作(http://msdn.microsoft.com/en-us/library/windows/desktop/aa381078(v=VS.85).aspx) 如何將函數作爲COM對象的參數?

回答

1

的一個問題(也許不是唯一一個)是DeviceAdded是一個類的方法,所以它需要一個self參數:

def DeviceAdded(self, device, UDN, calltype): 

我認爲你是在正確的軌道與你的第一個例子上,在與您提供的鏈接中的VBScript(和C++鏈接)相比,最少。

另外,每次註冊回調時都不應創建新的GUID。撥打pythoncom.CreateGuid一次並將結果粘貼到代碼中:

# Use "print pythoncom.CreateGuid()" to make a new one. 
_reg_clsid_ = "{41E24E95-D45A-11D2-852C-204C4F4F5020}" 
+0

是的。這裏的主要問題是連Callback都沒有被調用。做到這一點的「正確」方式是將設備添加爲參數,而不像Microsoft示例那樣使用類。但它返回錯誤「Python實例不能轉換爲COM對象」 – bruno

相關問題