すべてのユーザー インタラクションをキャプチャするプロジェクトに取り組んでいます。MSDN は (これ)を伝えます
SetWindowsHookEx を使用して、DLL を別のプロセスに挿入できます。32 ビット DLL を 64 ビット プロセスに挿入することはできず、64 ビット DLL を 32 ビット プロセスに挿入することもできません。アプリケーションが他のプロセスでフックを使用する必要がある場合、32 ビット アプリケーションは SetWindowsHookEx を呼び出して 32 ビット DLL を 32 ビット プロセスに挿入し、64 ビット アプリケーションは SetWindowsHookEx を呼び出して 64 ビット DLL を挿入する必要があります。 DLL を 64 ビット プロセスに変換します。
私の質問は、アプリケーションが に対して構築された場合はどうなるかということですAny CPU
。SetWindowsHookEx
に対してビルドされた DLLから呼び出す必要がありますかAny CPU
。
HookFunctions_32.dll (x86 の両方) をロードする HookLogger_32.exe と、HookFunctions_64.dll (x64 の両方) の設定WH_CBT
とWH_MOUSE
グローバル (特定のスレッドではない) をロードする HookLogger_64.exe を作成しました。
HookLogger_32.exe、HookLogger_64.exe、HookFunctions_32.dll、および HookFunctions_64.dll は C++ で記述されています。
に対してビルドされた .NET アプリケーションをクリックするとAny CPU
、これらの DLL が ( を介してSetWindowHookEx
) 挿入されます。Windows OS がハングアップし、マシンを強制的に再起動する必要があります。
同じ .NET アプリケーションが x86 または x64 に対してビルドされ、HookLoggers (32 ビットと 64 ビットの両方) が開始された後にアプリケーションをクリックすると、すべて正常に動作します。
この未定義の動作の理由。
私が作業しているプラットフォームは 64 ビット マシンです。