2011-05-17 79 views
1

我正在製作一個基於教程的程序,並希望能夠將我的代碼掛接到某些應用程序中,以使教程與應用程序進行交互。SetWindowsHookEx因谷歌瀏覽失敗。錯誤代碼87無效參數

我的鉤子代碼適用於除谷歌瀏覽器以外的大多數應用程序。我已經將我的代碼剝離到下面,以便您可以看到它出錯。

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 

一切工作正常(包括獲取進程ID和裝載庫和GetProcAddress)直到SetWindowsHookEx返回NULL,錯誤代碼爲87(無效參數)。

chrome.exe和我的代碼都是32位。

這是否適用於其他人或是否有人知道它不起作用?

感謝

回答

0

一個可能的問題是,如果你正在構建64位代碼,但chrome.exe是32位(或者反過來)。 [見註釋&更新,這是情況並非如此。在你的代碼


一個可疑的事情是,你不打電話Process32First,這似乎是必需的。例如參見:Taking a Snapshot and Viewing Processes


最後一個建議:你傳遞一個進程ID SetWindowsHookEx,但預計線程ID。

+0

感謝您的回覆,但他們都是32位 – Clive 2011-05-17 11:29:11

+0

與Process32First的好位置。我修復了代碼,但不幸的是仍然是同樣的問題。再次感謝 – Clive 2011-05-17 12:07:42

+0

非常感謝!然而,鉻可能有很多線程在運行,所以有沒有辦法找到主要的GUI線程,所以我知道我的dll不會被卸載,直到它們退出chrome?再次感謝您的幫助 – Clive 2011-05-17 12:51:54

2

你意識到chrome使用多進程模型,對吧?有很多合作的chrome實例,其中一些可能沒有事件隊列。

當然,您的GetProcId代碼不適用於chrome,因爲它只能找到一個匹配的進程。

相關問題