(天热,请大家帮忙看完) 代码不长,不多说了,直接看:下面这个是Hook.cpp文件的代码,最后生成Hook.dll文件的#include <windows.h>HHOOK g_hMouse;
HINSTANCE g_hInst;BOOL WINAPI DllMain( HINSTANCE hModule,DWORD dwReason,LPVOID lpvReserved )
{
g_hInst=hModule; //dll被加载时会传递一个该模块的句柄hModule
}LRESULT CALLBACK MouseProc( //鼠标钩子过程
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
return 1; //返回非0值表示已经处理,无须向下传递了。
}void SetHook()
{
g_hMouse = ::SetWindowsHookEx(WH_MOUSE,MouseProc,g_hInst,0);//最后个参数0表示此钩子过程与运行在同一桌面下的所有线程相关了,即全局钩子。
}接下来是模板定义文件Hook.def的内容,用于在dll中导出函数LIBRARY "Hook"EXPORTS
SetHook接着生成了Hook.dll,就开始调用了。下面是HookTestDlg.cpp中调用dll函数的代码:#include "stdafx.h"
#include "HookTest.h"
#include "HookTestDlg.h"#pragma comment(lib, "..\\Release\\Hook.lib") //链接引入库文件#ifdef _DEBUG
#define new DEBUG_NEW
#endif......_declspec(dllimport) void SetHook(); //函数声明,_declspec(dllimport)表示来自外部dll文件BOOL CHookTestDlg::OnInitDialog()
{
CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE); // TODO: 在此添加额外的初始化代码 SetHook(); //调用dll中的函数。 编译没问题, 为什么运行到这里就失败了呢?弹出一个框,提示:应用程序初始化(0xc0000142)失败。 return TRUE;
}
问题就在SetHook();那行。不知道什么原因,请高手释疑,谢谢。
HINSTANCE g_hInst;BOOL WINAPI DllMain( HINSTANCE hModule,DWORD dwReason,LPVOID lpvReserved )
{
g_hInst=hModule; //dll被加载时会传递一个该模块的句柄hModule
}LRESULT CALLBACK MouseProc( //鼠标钩子过程
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
return 1; //返回非0值表示已经处理,无须向下传递了。
}void SetHook()
{
g_hMouse = ::SetWindowsHookEx(WH_MOUSE,MouseProc,g_hInst,0);//最后个参数0表示此钩子过程与运行在同一桌面下的所有线程相关了,即全局钩子。
}接下来是模板定义文件Hook.def的内容,用于在dll中导出函数LIBRARY "Hook"EXPORTS
SetHook接着生成了Hook.dll,就开始调用了。下面是HookTestDlg.cpp中调用dll函数的代码:#include "stdafx.h"
#include "HookTest.h"
#include "HookTestDlg.h"#pragma comment(lib, "..\\Release\\Hook.lib") //链接引入库文件#ifdef _DEBUG
#define new DEBUG_NEW
#endif......_declspec(dllimport) void SetHook(); //函数声明,_declspec(dllimport)表示来自外部dll文件BOOL CHookTestDlg::OnInitDialog()
{
CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE); // TODO: 在此添加额外的初始化代码 SetHook(); //调用dll中的函数。 编译没问题, 为什么运行到这里就失败了呢?弹出一个框,提示:应用程序初始化(0xc0000142)失败。 return TRUE;
}
问题就在SetHook();那行。不知道什么原因,请高手释疑,谢谢。
有VS08的朋友可以帮测试下 很短的代码
郁闷ing
不要这么绝对吧,我看一定是.dll位置错了
我将Dll放到Release目录和当前目录下都试过了 还是那个问题耶
是的 I'm sure.各位看看 我代码没什么问题吧?~
其次若正常将SetHook()置为空函数()
若仍会出现上述问题, 可能dll加载有问题, 尝试一下动态链接(Loadlibrary)
若正常将SetWindowsHookEx换成别的API试试,
你可以动态载入试试,这样容易观察哪步出错
你没生成.lib 是因为你没写模板定义文件
我是写的,所以生成dll同时 有.lib文件
你这个办法 我很赞同 我也试过1.不是exe问题,这个Test只是雕了下dll函数,别的什么都没做2.将Test程序中的SetHook()注释掉,没有任何问题3.SetHook()函数体中什么都不写,也没问题,写个MessageBox也没问题4.用Loadlibrary动态加载dll,也出现这个问题5.SetWindowsHookEx的问题? 不是吧? 我按书上来的. 视频上用的VC6.0演示的 也没问题
.SetHook()函数体中什么都不写,也是有这个问题的,写个MessageBox也有问题
必须去掉DllMain函数方可终于有些眉目,但不知何解???
你建的是MFC的dll工程吗?这工程自带了DllMain
我找到问题所在了,现告诉大家:注意看我的DllMain函数,是不是少了个return语句啊~ 哈哈一个小疏漏居然折腾到现在,要命的是这个错误VS居然编译不报出来汗呐~那个书上也没有return 再汗各位引以为戒啊~ 别像我这么粗心谢谢各位 100分散给全部
怎么写的?g_hMouse = ::SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,g_hInst,0);
只是个全局钩子的小测试程序,没写Hook.h 就一个Hook.cpp
{}