USB デバイスをポーリングするスレッドを起動する DLL を作成しました。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;
}