почему функция обратного вызова не вызывается в программе ctypes Python - PullRequest
0 голосов
/ 18 июня 2020

Здесь я использую GoVCL , который является кроссплатформенной библиотекой GUI. Заголовок C и демонстрацию CPP можно найти здесь

Я пытаюсь вызвать библиотеку Dynami c через ctypes, форма и кнопка могут быть созданы правильно, однако когда я нажимаю кнопку, диалоговое окно с сообщением не появляется, поэтому я думаю, что функция обратного вызова не вызывалась. Я думаю, что проблема в функции Button_SetOnClick, но я не могу найти, где глючит. Так что спасибо, если вы можете указать, в чем проблема.

Кстати, я извлек несколько кодов из C заголовочного файла и поместил их в следующий CPP код.

Это код CPP

#include <iostream>
#include "liblcl.h"


//~ #ifdef _WIN32
    //~ #include<Windows.h>
    //~ #define LCLAPI __stdcall
//~ #else
    //~ #include <dlfcn.h>

    //~ #define LCLAPI __cdecl
//~ #endif
void LCLAPI btnClick(TObject sender) {
    DShowMessage("Hello world!");
}

int main(){
    if (load_liblcl("liblcl.dll")) {
        Application_Initialize(Application);

        auto form = Application_CreateForm(Application, false);

        // typedef void* TButton;
        // void* pButton_Create;
        // TButton Button_Create(TComponent AOwner) {
        // GET_FUNC_ADDR(Button_Create)
        // return (TButton)MySyscall(pButton_Create, 1, COV_PARAM(AOwner));
        // }
        auto btn = Button_Create(form);

        //~ void* pButton_SetOnClick;
        //~ void Button_SetOnClick(TButton AObj, uintptr_t AEventId) {
            //~ GET_FUNC_ADDR(Button_SetOnClick)
            //~ MySyscall(pButton_SetOnClick, 2, COV_PARAM(AObj), COV_PARAM(AEventId));

        //~ #define MAKE_EVENT_ID(fn) (uintptr_t)&fn
        Button_SetOnClick(btn, MAKE_EVENT_ID(btnClick));

        Application_Run(Application);

        close_liblcl();
    }
}

А вот код Python, который может отображать кнопку в форме, но функция обратного вызова не обрабатывается.

import ctypes

def  _btnClick(sender):
    vcl.DShowMessage("Hello world!".encode('utf8'))
btnClick = ctypes.CFUNCTYPE(None, ctypes.c_void_p)(_btnClick)

def main():
    vcl = ctypes.CDLL('liblcl.dll')

    Application = vcl.Application_Instance()
    vcl.Application_Initialize(Application)

    form = vcl.Application_CreateForm(Application, False);   

    btn = vcl.Button_Create(form);
    vcl.Button_SetParent(btn, form);

    Button_SetOnClick = vcl.Button_SetOnClick # I think the problem lies in this functions's argtypes
    Button_SetOnClick.restype = None
    Button_SetOnClick.argtypes = ctypes.c_void_p, ctypes.POINTER(ctypes.c_uint)
    Button_SetOnClick(btn, ctypes.cast(btnClick, ctypes.POINTER(ctypes.c_uint)));

    vcl.Application_Run(Application);

main()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...