//64位的DLL
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (DLL_PROCESS_ATTACH==ul_reason_for_call)//32位的EXE进程是不会进入这里的
{
char szPID[1024] = {0};
sprintf(szPID, "PID:%d(In DllMain)", GetCurrentProcessId());
OutputDebugString(szPID);
}
return TRUE;
}
//32位、64位的EXE都会进入这里的,即使EXE没有进入DllMain
LRESULT CALLBACK CSecureCRTAudit::KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
char szPID[1024] = {0};
sprintf(szPID, "PID:%d(In KeyboardProc)", GetCurrentProcessId());
OutputDebugString(szPID);
}在64位系统下安装64位全局DLL键盘钩子,所有的32位程序第一次促发键盘事件时不会调用我的DllMain,而是会直接进入KeyboardProc,所以钩子虽然安装成功了,但是在DllMain中的初始化工作未必都能完成。32位的全局DLL键盘钩子安装在64位的系统下也会出现类似的问题。64位的EXE只能调用64位的DLL,32位的EXE只能调用32位的DLL,安装Widnows钩子的时候相关EXE会加载DLL,即使没有进入DllMain,也会照样执行钩子函数的。
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (DLL_PROCESS_ATTACH==ul_reason_for_call)//32位的EXE进程是不会进入这里的
{
char szPID[1024] = {0};
sprintf(szPID, "PID:%d(In DllMain)", GetCurrentProcessId());
OutputDebugString(szPID);
}
return TRUE;
}
//32位、64位的EXE都会进入这里的,即使EXE没有进入DllMain
LRESULT CALLBACK CSecureCRTAudit::KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
char szPID[1024] = {0};
sprintf(szPID, "PID:%d(In KeyboardProc)", GetCurrentProcessId());
OutputDebugString(szPID);
}在64位系统下安装64位全局DLL键盘钩子,所有的32位程序第一次促发键盘事件时不会调用我的DllMain,而是会直接进入KeyboardProc,所以钩子虽然安装成功了,但是在DllMain中的初始化工作未必都能完成。32位的全局DLL键盘钩子安装在64位的系统下也会出现类似的问题。64位的EXE只能调用64位的DLL,32位的EXE只能调用32位的DLL,安装Widnows钩子的时候相关EXE会加载DLL,即使没有进入DllMain,也会照样执行钩子函数的。
解决方案 »
- 今天在学习用内存DC画图,终于有了初步了解。现将收集的关于内存DC介绍及其相关操作的资料贴出来共享一下。
- 水晶报表问题!!有请高人帮助
- 多线程分发服务器转发问题
- ADO方式下,执行_ConnectionPtr::Open打开数据库,如果登陆密码错误会怎么样?
- 瑞星防火墙导致VC不能编译的问题解决了吗?
- 在DLL中能添加自己定义的类吗,为什么我在DLL调用中调用类的函数总出错呀,救救我!!
- 如何修改CToolBar中按钮的Tip提示信息?救命
- !请教高手,怎么把长字节流存入到数据库中?
- 我做的OCX,在IE里运行良好,但是关闭IE时,会出现IE的“崩溃”窗口
- 我的窗口是继承FormView的,但我不想让它有滚动条,不想让它最大化(包括双击Title),我该怎么办呢?
- VC++图像处理开头搞得我好晕啊
- 求一个带按钮的combobox
case DLL_PROCESS_ATTACH:
HookApi();
break;
case DLL_PROCESS_DETACH: //进程卸载Dll
UnHookApi();
break;