У меня есть обратный вызов 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 для функции, однако обратный вызов никогда не вызывается. Я надеялся, что кто-то может указать мне на возможные ошибки
вот мой код сейчас:
(кстати, у моего питона версия 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, чтобы прочитать его.)