需要帮助创建Windows dll
need help creating windows dll
我是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()
函数—我假设您已经这样做了。
相关文章:
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 从 Python 调用 Windows DLL 函数时出错
- C++UWP和经典桌面的通用Windows DLL
- 在特定 Windows DLL 模块中分配内存
- 清理跨越Windows DLL模块边界的堆分配资源时出现问题
- C++Windows DLL:不同函数中的异常处理
- Windows DLL 上的静态链接 libgcc
- Windows DLL实际上如何共享
- 使用Linux C代码和标头文件来编译Windows DLL
- windows DLL是否有可能在多个线程或进程之间使用相同的套接字编号
- 关于构建windows dll的建议
- Windows DLL 链接器错误与模板类
- 如何确定哪个 Windows DLL 用于函数调用
- 从C++ Windows DLL 文件中进行日志记录
- 将 mingw dll 与 Windows DLL 链接起来
- 其中 是 Windows DLL 中的字符串表
- C++ Windows DLL 使用 try-catch 块在内部失败
- Windows:DLL 中的元信息
- 在使用 CMake 构建 Windows DLL 期间运行单元测试
- windows DLL函数调用外部exe文件无效