0

32 ビットと 64 ビットの実行可能ファイルがあります。どちらも同じビットの DLL をロードします。これは、64 ビット実行可能ファイルが 64 ビット dll をロードする場合と同様です。いずれにせよ、32 ビット DLL は完全に機能し、スレッドを作成し、Hello World メッセージボックスをポップします。ただし、64 ビット DLL では、そのコードは実行されません。createthread が失敗するようなものです。

    case DLL_PROCESS_ATTACH:
        myFunc();
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

void myFunc()
{

    HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&MyThread, NULL, 0, NULL);
}

DWORD WINAPI MyThread(LPVOID param)
{
    MessageBoxA(0, "HELLO 64", 0,0);
    ExitThread(0);
}

これらは、DLL からのいくつかのスニペットです。私はグーグルで調べましたが、思いつくことができるのは、スタックの配置が失敗しているということだけですか? それが理由である場合、CreateThread を適切に呼び出して機能させるにはどうすればよいですか? それが理由ではない場合、誰かが何が間違っているのか知っていますか?

事前に感謝します。

4

2 に答える 2

3

MyThread の署名が間違っています。キャストしないでください。関数が署名と一致することを確認する必要があります。正しいコードは次のようになります。

CreateThread(NULL, 0, MyThread, NULL, 0, NULL);

DWORD WINAPI MyThread(LPVOID param)
{
    // etc
}

それとは別に、@GSerg コメントとして DllMain で何もしないでください。そこにいる間はロックが保持されているためです。複雑なことをすると、別の DLL を誤ってロードしてデッドロックを引き起こす可能性があります。

代わりに、通常は、DLL をロードした後に呼び出し元のコードが呼び出すことができる別の初期化関数を DLL に用意します。

于 2012-08-17T23:16:43.747 に答える
0

解決は簡単でした。スレッドの終了が早すぎました。WaitForSingleObject(hThread, INFINITE); の追加 問題を解決しました。何らかの理由で 32 ビットでは必要ありませんでした。:)

于 2012-08-19T07:02:20.550 に答える