需要帮助创建Windows DLL

时间:2011-04-10 08:37:02

标签: c++ c windows winapi dll

我是Windows编程新手(我对c和c ++知之甚少)。我正在尝试创建windows dll,它注册了用于键盘的Windows钩子。我使用eclipse CDT与MinGW(因为我不想使用Visual Studio)来创建dll。我能够为下面的程序创建dll(copied from here ),但是当我尝试从另一个程序加载它时,它会挂起任何错误消息。

#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

2 个答案:

答案 0 :(得分:0)

您的hook dll似乎没问题(除非您必须使用CallNextHookEx的返回值)。但是,如果我在控制台应用程序中使用它,它会挂起;如果我在Windows应用程序中使用它就可以了。这可能是因为挂钩依赖于Windows消息队列。

另请参阅此“C++ Console app, SetWindowsHookEx, Callback is never called

答案 1 :(得分:-1)

我不认为挂起。键盘钩通常做的是处理“主事件循环”直到程序关闭。在这种情况下,我认为这是完全正在发生的事情。你的程序正在运行,从dll调用所需的例程,然后dll不断处理事件 话虽如此,windows似乎对终端和mingw做了一些奇怪的事情。更具体地说,它不像在使用MSVS时那样好玩。也许这也可能是你的问题的原因 - MinGW或多或少像gcc那样编译东西,但是MSVS的cl会把奇怪的声明放到打开的终端并打印到它们等等。

当然,请注意,您需要在某些时候调用代码中的install()uninstall()函数 - 我假设您已经完成了这些函数。

相关问题