2011-04-10 84 views
1

我是新來的Windows編程(我知道一點關於c和c + +)。我正在試圖創建Windows DLL註冊windows鍵鉤鍵盤。我用MinGW(因爲我不想使用Visual Studio)使用Eclipse CDT來創建dll.I能夠創建以下程序(copied from here)的dll,但是當我嘗試從另一個程序加載它,它掛起沒有任何錯誤信息。需要幫助創建窗口dll

#include <windows.h> 
#include <iostream> 
#include <stdio.h> 
#include<windef.h> 
#ifdef __MINGW32__ 
# define __in 
# define __in_z 
# define __in_z_opt 
#endif 
#define WIN32_LEAN_AND_MEAN 
#include <d3d9.h> 


HINSTANCE hinst; 
HHOOK hhk; 


LRESULT CALLBACK wireKeyboardProc(int code,WPARAM wParam,LPARAM lParam) { 
FILE * fileLog = fopen("C:\\try.txt", "a+"); 
fprintf(fileLog,"OK"); 
CallNextHookEx(hhk,code,wParam,lParam); 
fclose(fileLog); 
return 0; 
} 

extern "C" __declspec(dllexport) void install() { 
hhk = SetWindowsHookEx(WH_KEYBOARD, wireKeyboardProc, hinst, NULL); 
} 
extern "C" __declspec(dllexport) void uninstall() { 
UnhookWindowsHookEx(hhk); 
} 

BOOL WINAPI DllMain( __in HINSTANCE hinstDLL, 
     __in DWORD fdwReason, 
     __in LPVOID lpvReserved 
) { 

hinst = hinstDLL; 
return TRUE; 
} 

這是MinGW的問題嗎?任何幫助表示讚賞。謝謝。 下面是加載dll的測試程序。

#include <iostream> 
#include <stdio.h> 
#include <windows.h> 
#include<windef.h> 
#define WIN32_LEAN_AND_MEAN 
#include <d3d9.h> 


int main() 
{ 

HINSTANCE hinst = LoadLibrary("libTestHook.dll"); 
if (hinst == NULL) 
{ 
    printf("null hinst"); 
} 
typedef void (*Install)(); 
typedef void (*Uninstall)(); 

Install install = (Install) GetProcAddress(hinst, "install"); 
Uninstall uninstall = (Uninstall) GetProcAddress(hinst, "uninstall"); 


install(); 
int foo; 
std::cin >> foo; 

uninstall(); 
return 0; 

} 

libTestHook.dll是創建DLL

回答

-1

我不認爲這掛起。鍵盤鉤子通常做的是處理「主事件循環」,直到程序關閉。在這種情況下,我假設這是正好是發生了什麼事情。你的程序正在運行,從dll調用所需的例程,然後DLL不斷處理事件。這就是說,windows似乎在終端和mingw上做了一些奇怪的事情。更具體地說,它使用MSVS時的效果並不好。也許這也可能是你的問題的原因 - MinGW編譯的東西或多或少像海灣合作委員會那樣,然而MSVS的cls把奇怪的聲明打開終端並打印到他們等等等。

當然,請注意在有一點你需要在你的代碼中調用install()uninstall()函數 - 我假設你已經完成了。

+0

我加入節目 – hnm 2011-04-10 08:51:38

0

你的鉤子DLL似乎是好的(除了你必須使用CallNextHookEx的返回值)。但是,如果我在控制檯應用程序中使用它,它會掛起;如果我在Windows應用程序中使用它,那就沒問題。這可能是由於掛鉤取決於Windows消息隊列。

又見加載DLL創建這個「C++ Console app, SetWindowsHookEx, Callback is never called