Сценарий:
У меня есть c ++ DLL.
В этой DLL я создал рабочий поток.
В рабочем потоке у меня есть цикл, который ожидает ввода пользователя через аппаратное USB-устройство.
Цикл заканчивается только тогда, когда пользовательский ввод на USB-устройстве соответствует некоторым критериям.
Кроме того, мне необходимо в реальном времени отображать отзывы пользователей об использовании устройства USB для отображения на экране.
Для обратной связи используется графический интерфейс Delphi.
Когда пользователь использует устройство USB, система Windows выполняет функцию обратного вызова. Эта функция обратного вызова записана в том же файле DLL C ++ и передана в качестве параметра в функцию инициализации USB-устройства.
Я использовал глобальную переменную в DLL в качестве флага, чтобы определить, когда этот цикл должен завершиться.
Я также загружаю эту библиотеку C ++ из библиотеки Delphi.
Delphi DLL -> C ++ DLL
Дисплей обратной связи взят из библиотеки Delphi.
По сути, проблема, с которой я сейчас сталкиваюсь, заключается в том, что функция ptr, funcptr, вообще не может быть вызвана. Там нет обратной связи в режиме реального времени на экране. Это функция в Delphi DLL.
Это строка кода:
(*(reinterprete_cast<FUNCPTR>(funcPtr)))("this is the feedback msg displayed on Delphi GUI");
У кого-нибудь есть решение для этого?
Я новичок и ценю любые ответы вообще. Спасибо за помощь.
//Global variable
BOOL flag = TRUE;
//A function type in Delphi calling app
typedef void (__stdcall *FUNCPTR)(PCHAR);
//Functions start here.....
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
do {} while (flag);
}
function_1st_CalledFromDelphiDLL(FUNCPTR funcPtr)
{
Initialize_USBDevice(handleUSBDeviceEvent_callback, funcPtr);
}
function_2nd_CalledFromDelphiDLL()
{
DWORD threadID;
HANDLE hWorkerThread;
hWorkerThread = CreateThread(NULL,0,ThreadProc, 0, 0 , &threadID);
if (hWorkerThread!=NULL)
{
WaitForSingleObject(hWorkerThread, 30000);
}
}
//This is the callback function, called by Windows system when user meddles with the USB device
handleUSBDeviceEvent_callback(void *funcPtr)
{
flag = FALSE; //so loop in ThreadProc can exit
//The following code cannot be executed at all. Even when i Try MessageBox( NULL,L"msg",NULL,NULL), the message box doesn't popup too. But, I can write something to a filestream here.
(*(reinterprete_cast<FUNCPTR>(funcPtr)))("this is the feedback msg displayed on Delphi GUI");
}