SetWindowsHookEx 调用失败,求大侠解疑!

一路飘过 2011-05-14 09:00:59

DLL代码如下:

#include "stdafx.h"
DWORD WINAPI aThreadProc(LPVOID lpParameter);
LRESULT CALLBACK foo(int nCode,WPARAM wParam,LPARAM lParam)
{
return 0;
}

BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
if(ul_reason_for_call==DLL_PROCESS_ATTACH)
{
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)aThreadProc,0,0,NULL);
}
return TRUE;
}

DWORD WINAPI aThreadProc(LPVOID lpParameter)
{
HANDLE hProcessSnapshot;
MODULEENTRY32 me;

hProcessSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,GetCurrentProcessId());
me.dwSize=sizeof(MODULEENTRY32);
Module32First(hProcessSnapshot,&me);

if(!strcmp(me.szModule,"iexplore.exe"))
{
MessageBox(NULL,me.szModule,"ModuleName",MB_OK);
}

return 0;
}

调用DLL的代码:

#include "stdafx.h"

int main(int argc, char* argv[])
{
HMODULE hHookdll;
HOOKPROC foo;
HHOOK hookid;
hHookdll=LoadLibraryA("popDialog.dll");
if(hHookdll==NULL)
printf("load fail!\r\n");
else
printf("load success!\r\n");
foo=(HOOKPROC)GetProcAddress(hHookdll,"foo");
hookid=SetWindowsHookEx(WH_KEYBOARD,foo,hHookdll,0);
if(hookid)
printf("Set HOOK success!\r\n");
else
printf("Set HOOK fail!\r\n");
Sleep(30*1000);
UnhookWindowsHookEx(hookid);
return 1;
}


运行exe后,控制台总是打印“load success!,Set HOOK fail!”
...全文
168 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
一路飘过 2011-05-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiaoc1026 的回复:]
GetLastError(); 看看错误代码先
[/Quote]

得到的错误代码为:1427
怎么会是无效的挂接程序呢?
见习学术士 2011-05-14
  • 打赏
  • 举报
回复
GetLastError(); 看看错误代码先
海盗医生 2011-05-14
  • 打赏
  • 举报
回复
SetWindowsHookEx 是这么用的吗?

进程调用SetWindowsHookEx,回调函数缺是DLL的!

SetWindowsHookEx 和 回调 都放到DLL中
一路飘过 2011-05-14
  • 打赏
  • 举报
回复
自己先顶一下,别沉了
一路飘过 2011-05-14
  • 打赏
  • 举报
回复
帖子石沉大海了,我顶!

更改后的DLL代码:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

HINSTANCE h_dll;

#pragma data_seg(".MySec")
HWND h_wnd=NULL;
HHOOK gg_hHook=NULL;
#pragma data_seg()
#pragma comment(linker,"/section:.MySec,RWS")

BOOL APIENTRY DllMain( HINSTANCE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
h_dll=hModule;
return TRUE;
}

LRESULT CALLBACK my_test(int nCode,WPARAM wParam,LPARAM lParam)
{
MessageBox(NULL,"hello","hello",0);
return CallNextHookEx(gg_hHook,nCode,wParam,lParam);
}

extern "C" _declspec(dllexport) void SetHook(HWND hwnd)
{
h_wnd=hwnd;
gg_hHook=SetWindowsHookEx(WH_KEYBOARD,my_test,h_dll,0);
DWORD dwError=GetLastError();
if(gg_hHook)
{
printf("Set HOOK success!\r\n");
}
else
{
printf("ErrorNum:%ld Set HOOK fail!\r\n",dwError);
}
return ;
}


加载dll的exe程序代码:
#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>

typedef void (*pfunc)(HWND);

int main(int argc, char* argv[])
{
HINSTANCE hmod;
pfunc setHook;
hmod=LoadLibrary("..\\..\\release\\testHook.dll");
DWORD dwError=GetLastError();
if(hmod!=NULL)
{
printf("load success!\r\n");
setHook=(pfunc)GetProcAddress(hmod,"SetHook");
setHook(NULL);
}
else
{
printf("Error:%ld load fail!\r\n",dwError);
}
Sleep(30*10000);
return 0;
}


这次显示“Set HOOK success!”,但是没有跳出对话框啊,求解?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧