Я создал 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;
}
Задача ещё не решена.