【问题标题】:need help creating windows dll需要帮助创建 Windows dll
【发布时间】:2011-08-02 09:51:53
【问题描述】:

我是 Windows 编程新手(我对 c 和 c++ 知之甚少)。我正在尝试创建为键盘注册 windows 挂钩的 windows dll。我正在使用 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

【问题讨论】:

    标签: c++ c windows winapi dll


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我添加了加载创建的 dll 的程序
      猜你喜欢
      • 2020-03-06
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 2013-03-27
      • 2019-06-12
      • 2010-12-11
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多