1

私は UPnP Object Method IUPnPDeviceFinder::を使用して[CreateAsyncFind][1]おり、3 番目のパラメーターはコールバック関数です。

独自の 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 オブジェクトで?

4

1 に答える 1

1

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}"
于 2011-11-25T18:12:08.353 に答える