1

チュートリアルベースのプログラムを作成していますが、コードを特定のアプリにフックして、チュートリアルをアプリと相互作用させることができるようにしたいと考えています。

私のフックコードは、グーグルクロームを除くほとんどのアプリで機能します。コードを次のように削除したので、コードがうまくいかないことがわかります。

Main.cpp

#include <Windows.h>
#include <iostream>
#include <psapi.h>
#include <Tlhelp32.h>

unsigned long GetProcId( const std::string& name )
{
    unsigned long res = 0 ;

    HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    PROCESSENTRY32 processInfo ;
    processInfo.dwSize=sizeof(PROCESSENTRY32W);

    if( !Process32First( hSnapShot, &processInfo ) )
    {
        CloseHandle( hSnapShot ); 
        return res ;
    }

    do 
    {
        if( NULL != ( strstr ( strlwr ( processInfo.szExeFile ), name.c_str() ) ) )
        {               
            res = processInfo.th32ProcessID ;
            break ;
        }
    } while(Process32Next( hSnapShot,&processInfo ));

    CloseHandle( hSnapShot ) ;
    return res ;
}

typedef LRESULT (CALLBACK *DllHookProc)(int nCode, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
               LPSTR lpCmdLine, int nCmdShow)
{
    unsigned int processid = GetProcId( "chrome.exe" ) ;

    if (processid == 0)
    {
        return 0 ;
    }

    HINSTANCE dllInstance = LoadLibrary("mydll.dll") ;

    if (dllInstance == NULL)
    {
        return 0 ;
    }

    DllHookProc hookProc = (DllHookProc)::GetProcAddress(dllInstance, "HookProc");

    if ( hookProc == NULL) 
    {
        FreeLibrary(dllInstance);
        return 0 ;
    }

    HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)hookProc,
        dllInstance, processid );

    if (hook == NULL)
    {
        FreeLibrary(dllInstance);
        return 0 ;
    }

    return 0 ;
}

Dllのテスト(mydll.dll)

LRESULT CALLBACK HookProc (int nCode, WPARAM wParam, LPARAM lParam )
{
    //Pass to the next chain in the process list
    return CallNextHookEx( 0, nCode, wParam, lParam);
}

BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
    return TRUE;
}

定義ファイル

LIBRARY "MYDLL"
EXPORTS
HookProc @1

SetWindowsHookExまではすべて正常に機能し(processIdの取得、ライブラリとgetprocaddressのロードを含む)、エラーコード87(無効なパラメーター)でNULLを返します。

と私のコードは両方ともchrome.exe32ビットです。

これは他の誰かのために機能しますか、それとも誰かがそれが機能しないことを知っていますか?

ありがとう

4

2 に答える 2

2

Chromeはマルチプロセスモデルを使用していることに気づきましたか?連携している多くのChromeインスタンスがあり、それらの一部にはイベントキューがない場合があります。

GetProcId一致するプロセスが1つしか見つからないため、コードがchromeで機能しないことは間違いありません。

于 2011-05-17T12:41:14.810 に答える
0

考えられる問題の1つは、64ビットコードをビルドしているが、chrome.exe32ビット(またはその逆)である場合です。[コメントと更新を参照してください。これは当てはまりません。]


コードで疑わしいことの1つは、呼び出していないことです。これProcess32Firstは必須のようです。例:スナップショットの作成とプロセスの表示を参照してください。


最後の提案:プロセスIDをに渡していますがSetWindowsHookEx、これにはスレッドIDが必要です。

于 2011-05-17T11:27:21.083 に答える