【问题标题】:Pass a function to a COM Object Function as a parameter将函数作为参数传递给 COM 对象函数
【发布时间】:2011-11-25 16:03:27
【问题描述】:

我使用的是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)

微软在 VBScript 上做了一个例子。这正是我想在 Python 上做的 (http://msdn.microsoft.com/en-us/library/windows/desktop/aa381078(v=VS.85).aspx) 如何将函数作为参数传递给 COM 对象?

【问题讨论】:

    标签: python com upnp


    【解决方案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}"
    

    【讨论】:

    • 是的。这里的主要问题是,甚至 Callback 都没有被调用。做到这一点的“正确”方法是将添加的设备作为参数传递,而不像 Microsoft 示例那样使用类。但它返回错误“无法将 Python 实例转换为 COM 对象”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 2013-01-27
    • 2020-07-18
    • 1970-01-01
    • 2015-11-22
    • 2019-08-29
    相关资源
    最近更新 更多