Возможно, обратный вызов Python Ctypes игнорируется? - PullRequest
1 голос
/ 15 марта 2019

У меня есть обратный вызов 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, чтобы прочитать его.)

...