0

私は(WH_KEYBOARD)msword(OpusApp)でローカルフックを使用しています。まあ、私が知る限り、32ビットアプリはで32bit DLLのみ動作する必要があり32bit target applicationsます。奇妙なことに、このプログラムは64ビットアプリでしか動作しません!!! それだけ64bits APPSです!たとえば、it works with IE 64 but not with IE 32! アプリdllは32ビットでコンパイルされてradstudio XE2おり、バージョンをPEヘッダーに確認しました。32ビットOSでは、アプリとdllは機能しません。

私はネット上で解決策を見つけられず、この奇妙な問題を解決するための出発点も見当たりません。

DLLコード:

// Exported functions

extern "C" __declspec(dllexport)bool __stdcall InstallMouseHook(unsigned long, void *);

extern "C" __declspec(dllexport)bool __stdcall RemoveMouseHook();

// Callback Procedure Declaration

LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam);

// Global variables

HHOOK HookHandle;
HINSTANCE DllInstance;
typedef void (__stdcall *CALLIT)(int,WPARAM,LPARAM);
CALLIT callIt = NULL;

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
  DllInstance=hinst;
  return 1;
}

bool __stdcall InstallMouseHook(unsigned long pid, void *function)
{

     callIt = ( CALLIT ) function;

     if (function == NULL) {

        ShowMessage("function is null!");

     } else if (callIt == NULL) {

        ShowMessage("callIt is null!");

     }  

     HookHandle=SetWindowsHookEx(WH_KEYBOARD ,reinterpret_cast<HOOKPROC> (HookProc),DllInstance,pid);

    if (HookHandle==NULL)return false;

    else return true;

}

bool __stdcall  RemoveMouseHook()
{
  if(UnhookWindowsHookEx(HookHandle)==0)
  {
    return false;
  }
  else return true;
}

LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
{
    if (code<0) {
        return CallNextHookEx(HookHandle,code,wParam,lParam);
    }

    if (callIt != NULL) {
        callIt(code,wParam,lParam);
    } else {
        ShowMessage("HookProc - no function to execute OR 32/64 bits problem!");
    }

  //Call the next hook in the chain
  return CallNextHookEx(HookHandle,code,wParam,lParam);
}

EXE呼び出しコード:

void __fastcall TfrmMouseHook::btnHookAppDllClick(TObject *Sender)
{
    HWND hWindow;
    unsigned long pid;

    String s = "MouseHookDLL.dll";
    DllHandle=LoadLibrary(s.w_str());
    MOUSEHOOKFCT_2 InstHook=reinterpret_cast<MOUSEHOOKFCT_2> (GetProcAddress(DllHandle,"InstallMouseHook"));

    hWindow = FindWindow(ComboBox1->Text.w_str(),NULL);

    if (!hWindow) {
        msg("hWindow fail");
        return;
    }

    pid = GetWindowThreadProcessId(hWindow ,0);
    if (!pid) {
       msg("pid fail");
       return;
    }

    if(!InstHook(pid, (void *) callIt )) {
        msg("Unable to install  hook!");
    } else {
        msg(" #### hook INSTALLED! ####");
    }


}

CALLIT callIt(code,wParam,lParam) {
    frmMouseHook->msg("hook callit: code="+IntToStr(code) +" wparam="+IntToStr(wParam)+" lparam="+IntToStr(lParam) );
}



   Call IT is a function pointer to a hooker app function.

    Any ideas will be very wellcome!
4

2 に答える 2

1

32ビットアプリが32ビットフックDLLをインストールし、64ビットプロセスで実行することは物理的に不可能です。32ビットDLLを64ビットプロセスに挿入することはできません。限目。MSDNは、 SetWindowsHookEx()のドキュメントを含め、複数の場所でこれを述べています。

SetWindowsHookExを使用して、DLLを別のプロセスに挿入できます。32ビットDLLを64ビットプロセスに挿入することはできません。また、64ビットDLLを32ビットプロセスに挿入することもできません。アプリケーションで他のプロセスでフックを使用する必要がある場合は、32ビットアプリケーションでSetWindowsHookExを呼び出して32ビットDLLを32ビットプロセスに挿入し、64ビットアプリケーションでSetWindowsHookExを呼び出して64ビットを挿入する必要があります。 DLLを64ビットプロセスに変換します。32ビットDLLと64ビットDLLの名前は異なる必要があります。

フックはアプリケーションのコンテキストで実行されるため、アプリケーションの「ビットネス」と一致する必要があります。32ビットアプリケーションが64ビットWindowsにグローバルフックをインストールする場合、32ビットフックは各32ビットプロセスに挿入されます(通常のセキュリティ境界が適用されます)。64ビットプロセスでは、スレッドは引き続き「フック」としてマークされます。ただし、32ビットアプリケーションはフックコードを実行する必要があるため、システムはフックアプリのコンテキストでフックを実行します。具体的には、SetWindowsHookExを呼び出したスレッドで。これは、フックアプリケーションがメッセージを送り続ける必要があることを意味します。そうしないと、64ビットプロセスの通常の機能がブロックされる可能性があります。

64ビットアプリケーションが64ビットWindowsにグローバルフックをインストールする場合、64ビットフックは各64ビットプロセスに挿入されますが、すべての32ビットプロセスはフックアプリケーションへのコールバックを使用します。

アプリとDLLが32ビットOSバージョンで機能しないという事実は、フックコードに欠陥があることを示しています。しかし、あなたはそれをいずれかの方法で診断するのに十分なコードを示していません。

于 2012-09-20T22:51:57.653 に答える