我有一个带有以下原型的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进行阅读。)