python ctypes回调可能被忽略?

时间:2019-03-15 08:44:19

标签: python-3.x callback ctypes

我有一个带有以下原型的c回调:

typedef void(__stdcall *TUSR_ConnAckEvent)( long ReturnCode, LPCWSTR Description );

此回调函数应由用户定义

boolean USR_OnConnAck(TUSR_ConnAckEvent OnConnAct);

用户需要使用 USR_OnConnAck()注册回调函数,然后用户需要使用 USR_Connect()发起与服务器的连接。如果成功,则应使用回调函数工作,但不是,现在我很困惑。

我尝试过多种方式对回调进行原型制作:

1。

OnConnAck = WINFUNCTYPE(c_void_p, c_long, c_wchar_p)

@OnConnAck
def ConnAck_CBF(returnCode, description):
    print('Hello world')
    print(returnCode[0], description[0])

2。

OnConnAck = WINFUNCTYPE(c_void_p, c_long, c_wchar_p)
OnConnAct = OnConnAck(ConnAck_CBF)

为函数实例化正确的arg和restypes之后,但是永远不会调用回调。我希望有人可以指出任何可能的错误

现在这是我的代码:

(顺便说一下,我的python版本是3.6.5和32位)

dll = windll.LoadLibrary("UsrCloud.dll")
def ConnAck_CBF(returnCode, description):
    print('Hello world')
    print(returnCode[0], description[0])

OnConnAck = WINFUNCTYPE(c_void_p, c_long, c_wchar_p)
dll.USR_Init.argtypes = [c_wchar_p, c_ushort, c_long]
dll.USR_Connect.argtypes = [c_wchar_p, c_wchar_p]
dll.USR_OnConnAck.argtypes = [OnConnAck]
dll.USR_OnConnAck.restype = c_bool

OnConnAct = OnConnAck(ConnAck_CBF)

if __name__ == '__main__':
    host = "clouddata.usr.cn"
    port = 1883
    ver = dll.USR_GetVer()
    hadInit = c_bool(dll.USR_Init(host, port, ver))
    if hadInit.value:
        username = "sdktest"
        password = "sdktest"
        hadOnConn = c_bool(dll.USR_OnConnAck(OnConnAct))
        print(hadOnConn)
        if hadOnConn.value:
            dll.USR_Connect(username, password)

这是dll文件: UsrCloud.zip

这是我使用的所有功能原型:

typedef long(_stdcall *FN_USR_GetVer)();
typedef boolean(_stdcall *FN_USR_Init)(LPCWSTR Host, unsigned short Port, long Ver);
typedef void(_stdcall *TUSR_ConnAckEvent)(long ReturnCode, LPCWSTR Description);
typedef boolean(_stdcall *FN_USR_OnConnAck)(TUSR_ConnAckEvent OnConnAct);
typedef boolean(_stdcall *FN_USR_Connect)(LPCWSTR Username, LPCWSTR Password);

这是文档:

http://cloud.usr.cn/Public/sdk/dll/index.html

(这是一个中文网站,您可以使用GoolgeTranslate进行阅读。)

0 个答案:

没有答案