Обратный вызов потока DLL работает нормально, но вызывает нарушение прав доступа, когда обратный вызов вызывает InvokeHelper

Я создал DLL, которая запускает поток, который опрашивает USB-устройство, когда DLL получает сообщение от USB-устройства, которое вызывает функцию обратного вызова.

Использование этой dll в коде состоит из создания экземпляра класса из DLL, затем вызова метода указанного класса для установки функции обратного вызова, а затем запуска потока, так что обратный вызов происходит каждый раз, когда устройство USB что-то делает, поток работает, происходит обратный вызов (это устройство клавиатуры, поэтому оно просто отправляет нажатия клавиш в виде LPCSTR), но когда я передаю это значение нажатия клавиш внутренней функции, это вызывает нарушение прав доступа. Где, как и все остальное, вызов этой функции с теми же значениями работает просто отлично.

это линия, которая вызывает нарушение доступа

InvokeHelper(0x60030024, DISPATCH_METHOD, VT_VARIANT, (void*)&result, parms,
num, TheStr);

содержащая функция:

VARIANT C_BAXScreens::WriteToTextBox(short num, LPCTSTR TheStr)
{
VARIANT result;
static BYTE parms[] =
VTS_I2 VTS_BSTR;
InvokeHelper(0x60030024, DISPATCH_METHOD, VT_VARIANT, (void*)&result, parms,
num, TheStr);
return result;
}

DLL установил обратный вызов:

 void  WINAPI ThalesEPPv6::SetGoodKeyPadPressCallback(OnGoodKeyPadPressCallback func, LPVOID dialog) { OnGoodKeyPadPress = func;}

Начальная нить DLL:

 void ThalesEPPv6::startMessageThread()
{
OnCheckResponseOK("Message Thread Started.");
stopThread = false;
if(!connected)reconnect(this);
HANDLE hThread;
unsigned threadID;

hThread = (HANDLE)_beginthreadex( NULL, 0, messageThread,this, 0, &threadID );}

Сообщение DLL Тема:

unsigned int _stdcall ThalesEPPv6::messageThread(void* links)
{
ThalesEPPv6* link = (ThalesEPPv6*)links;
while(1)
{
link->send_Message(POLLIN,ENQ,MESSAGE_NOCOMMS);
link->send_Message(POLLIN,MSG,MESSAGE_NOCOMMS);
link->send_Message(POLLIN,EOT,MESSAGE_NOCOMMS);
//MESSAGE REPLY
link->send_Message(POLLIN,ACK,MESSAGE);
link->send_Message(POLLIN,ACK,MESSAGE_NOCOMMS);
Sleep(10);
if(stopThread)break;
}
// close USB handle
usb_close(usb_handle);
return 0;
}

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]