Здесь я использую 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()