C++ DLL线程回调工作正常,但在回调调用InvokeHelper时会导致访问冲突
我已经创建了一个DLL,它启动一个线程轮询usb设备,当DLL从usb设备获取消息时,它调用回调函数 在代码中使用此dll包括从dll创建类的实例,然后调用所述类的方法来设置回调函数,然后启动线程,以便每次USB设备执行某项操作时都会发生回调,线程工作,回调发生(这是一个键盘设备,所以它只是以LPCSTR的形式发送按键),但是当我将这个按键值传递给一个内部函数时,它会导致访问冲突。而其他任何调用这个函数的方法都可以使用相同的值 这是导致访问冲突的行C++ DLL线程回调工作正常,但在回调调用InvokeHelper时会导致访问冲突,c++,multithreading,com,access-violation,idispatch,C++,Multithreading,Com,Access Violation,Idispatch,我已经创建了一个DLL,它启动一个线程轮询usb设备,当DLL从usb设备获取消息时,它调用回调函数 在代码中使用此dll包括从dll创建类的实例,然后调用所述类的方法来设置回调函数,然后启动线程,以便每次USB设备执行某项操作时都会发生回调,线程工作,回调发生(这是一个键盘设备,所以它只是以LPCSTR的形式发送按键),但是当我将这个按键值传递给一个内部函数时,它会导致访问冲突。而其他任何调用这个函数的方法都可以使用相同的值 这是导致访问冲突的行 InvokeHelper(0x60030024
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;
}
代码添加了更多的位??注意:STR不是BSTR。你不能调试调用的方法吗?另外:你是为UNICODE构建的吗?这不是我的程序,所以我不确定这个功能到底在做什么。我所知道的是,当从不同的设备用相同的值调用它时,它工作正常,至于调试调用方法,我会遇到访问冲突在那一行,然后它进入汇编。我不知道你的其他调试是什么意思?也不知道unicode。你必须将一个真正的
BSTR
传递给InvokeHelper
。在你的环境中LPCTSTR
的typedef
是什么?它依赖于char
还是wchar\t
?