Передайте функцию в COM-функцию объекта в качестве параметра - PullRequest
1 голос
/ 25 ноября 2011

Я использую метод объекта UPnP IUPnPDeviceFinder :: [CreateAsyncFind][1], а третий параметр является функцией обратного вызова.

Я пытался создать свой собственный 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)

Microsoft сделала пример на VBScript.Это именно то, что я хочу сделать на Python (http://msdn.microsoft.com/en-us/library/windows/desktop/aa381078(v=VS.85).aspx) Как я могу передать функцию в качестве параметра для COM-объекта?

1 Ответ

1 голос
/ 25 ноября 2011

Одна проблема (возможно, не единственная) заключается в том, что 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}"
...