0

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;
}
4

0 に答える 0