需要帮助创建Windows dll

need help creating windows dll

本文关键字:Windows dll 创建 帮助      更新时间:2023-10-16

我是windows编程的新手(我对c和c++知之甚少)。我试图创建注册windows钩子键盘的windows dll。我使用eclipse CDT与MinGW(因为我不想使用Visual Studio)来创建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

你的钩子dll似乎是正确的(除了你必须可能使用CallNextHookEx的返回值)。但是,如果我在控制台应用程序中使用它,它会挂起;如果我在windows应用程序中使用它是可以的。这可能是由于钩子依赖于windows消息队列。

参见这个' c++控制台应用程序,SetWindowsHookEx, Callback永远不会被调用'

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

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