BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #32793同步于 2009/12/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于windows编程的问题,求高手解!

OdieHappy
2009/12/6镜像同步5 回复
大概的思路如下,首先自己制作一个叫KeyBoardHookLib的dll文件,然后在KeyBoardHookTest中调用dll中的SetHook函数。 以下是代码: /******************* Dll:KeyBoardHookLib.h *******************/ #define EXPORT extern "C" __declspec(dllexport) #pragma data_seg("shared") HHOOK hKeyBoard = NULL; HINSTANCE hDllInstance = NULL; #pragma data_seg() #pragma comment (linker, "/section:shared,rws") EXPORT BOOL WINAPI SetHook (BOOL isInstall); /****************** Dll:KeyBoardLib.cpp ******************/ #include <windows.h> #include "KeyBoardHookLib.h" #include <fstream> using namespace std; int WINAPI DllMain(HINSTANCE hInstance, DWORD fdsReason, PVOID pvReserved) { hDllInstance = hInstance; return true; } LRESULT CALLBACK KeyboardProc (int nCode, WPARAM wParam, LPARAM lParam) { EVENTMSG *keyMSG = (EVENTMSG*) lParam; if ((nCode == HC_ACTION) && (keyMSG->message == WM_KEYDOWN)) { TCHAR keyName[10]; ZeroMemory (keyName, 10); GetKeyNameText (lParam, keyName, 50); ofstream out("out.txt"); out << keyName; out.close(); } return CallNextHookEx (hKeyBoard, nCode, wParam, lParam); } EXPORT BOOL WINAPI SetHook (BOOL isInstall) { if (isInstall) { hKeyBoard = SetWindowsHookEx (WH_KEYBOARD, KeyboardProc, hDllInstance, 0); if (hKeyBoard != NULL) return true; } else { UnhookWindowsHookEx (hKeyBoard); hKeyBoard = NULL; hDllInstance = NULL; } return false; } /***************** exe:KeyBoardTest.cpp *****************/ #include <windows.h> #include <stdio.h> BOOL (WINAPI *useSetHook) (BOOL); int main() { HMODULE hKeyBoardHookLib = ::LoadLibrary (L"KeyBoardHookLib.dll"); useSetHook = (BOOL (__stdcall *)(BOOL))::GetProcAddress (hKeyBoardHookLib, "SetHook"); if (!useSetHook) { printf ("Failed!\n"); system("pause"); return 0; } char a; useSetHook(true); scanf ("%c",&a); system("pause"); return 0; } 我使用vs2008编译的。问题是,我已经把dll和lib文件都放到exe的debug目录下了,但exe只能载入dll文件,但找不到SetHook函数,也就是说 HMODULE hKeyBoardHookLib = ::LoadLibrary (L"KeyBoardHookLib.dll"); 一句没有问题,但下一句 useSetHook = (BOOL (__stdcall *)(BOOL))::GetProcAddress(hKeyBoardHookLib, "SetHook"); 的执行结果是useSetHook为零。 不知道是哪错了,哪位大牛能解答一下,谢谢!
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
jmpesp机器人#1 · 2009/12/6
(L"KeyBoardHookLib.dll"); ? 把L去掉就可以了 L是表示宽字符的意思
OdieHappy机器人#2 · 2009/12/6
额~~那条api要求参数是宽字符,去掉就编译不过了....... 【 在 jmpesp 的大作中提到: 】 : (L"KeyBoardHookLib.dll"); ? : 把L去掉就可以了 L是表示宽字符的意思
coolwc机器人#3 · 2009/12/6
在工程里添加 工程名.def 里面加入 EXPORTS SetHook
jmpesp机器人#4 · 2009/12/6
【 在 OdieHappy 的大作中提到: 】 : 额~~那条api要求参数是宽字符,去掉就编译不过了....... 那条api要求是宽字符? LoadLibrary有两个版本 一个是LoadLibraryA另一个是LoadLibraryW 你这代码配置设置对吗?
ReturnsMe机器人#5 · 2009/12/6
GetLastError();