Dll中全局钩子实现的问题,为什么有问题

tlxyzabc 2010-05-03 12:06:52
为什么我写在Dll中的钩子调用总会出现下面类似的错误,但是不调用dll中的钩子,调用其他函数体的话却没有任何错误。这是为什么!
GlobalHookDllCall.exe 中的 0x0012f45e 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
GlobalHookDllCall.exe 中的 0x0012f45e 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
程序“[2900] GlobalHookDllCall.exe: 本机”已退出,返回值为 0 (0x0)。

钩子函数头文件 KeyBoardHook.h

#pragma once

#ifndef __AFXWIN_H__
#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#endif

#include "resource.h" // 主符号

#ifndef KEYBOARDHOOK_H
#define KEYBOARDHOOK_H
#endif
class CKeyBoardHook:public CObject
{
public: CKeyBoardHook ();
public: ~CKeyBoardHook ();
public: BOOL startHook();
public: BOOL stopHook();

public: static LRESULT KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);

}

KeyBoardHook.cpp

#include "stdafx.h"
#include "KeyBoardHook.h"
#include "GlobalHookDll.h"
;
extern CGlobalHookDllApp theApp;

HHOOK hook;
HINSTANCE hin;
//LRESULT KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
CKeyBoardHook::CKeyBoardHook()
{
//TRACE("------------BEGIN-----------------------\n");
}
CKeyBoardHook::~CKeyBoardHook()
{
stopHook();

}
BOOL CKeyBoardHook::startHook()
{
//TRACE("-----------------HELLO-------------------\n");
hook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,m_hInstance,0);
//TRACE("-----------------hookstart--------------------\n");
TRACE("%d",GetCurrentThreadId());
if(hook==NULL) return false;
else return true;

}
BOOL CKeyBoardHook::stopHook()
{
hook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,NULL,::GetCurrentThreadId());
if(UnhookWindowsHookEx(hook)) return true;
else return false;
}

LRESULT CKeyBoardHook::KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
TRACE("----------------CALBACK FUNCTION-----------------");
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{ switch(wParam) //键盘按键标识
{
case '1':TRACE("it is 1 !"); break;
case '2':TRACE("it is 2 !"); break;
case '3':TRACE("it is 3 !"); break;
case '4':TRACE("it is 4 !"); break;
default: TRACE("others !"); break;
}
}
LRESULT RetVal = CallNextHookEx(hook, nCode, wParam, lParam );
TRACE("----------------CALBACK FUNCTION over-----------------");
return RetVal;

}


声明导出函数体:global.cpp

#include "stdafx.h"
#include "KeyBoardHook.h"
#include "GlobalHookDllDlg.h"
;

CKeyBoardHook ckbh;
extern "C" _declspec(dllexport) void hookstart(void)
{
ckbh.startHook();
}

extern "C" _declspec(dllexport) void hookstop(void)
{
ckbh.stopHook();
}
extern "C" _declspec(dllexport) void getDialog(void)//这个是项目内一个dialog的
{
GlobalHookDllDlg ghdd;
ghdd.DoModal();
}



在应用程序中导出 getDial0g()完全没问题
但是导出hookstop()或者hookstart()就成问题了。

钩子会运行一遍,然后就出现
GlobalHookDllCall.exe 中的 0x0012f45e 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
GlobalHookDllCall.exe 中的 0x0012f45e 处未处理
异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
程序“[2900] GlobalHookDllCall.exe: 本机”已退出,返回值为 0 (0x0)。

的中断,这怎么搞啊!
...全文
137 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mcaok 2010-05-04
  • 打赏
  • 举报
回复
#pragma data_seg("MySec")
//放在这里
#pragma data_seg()
#pragma comment(linker,"/section:MySec,RWS")
oyljerry 2010-05-04
  • 打赏
  • 举报
回复
ckbh 这个全局数据要放到data_seg 全局共享数据段中
wuhuwy 2010-05-04
  • 打赏
  • 举报
回复
楼上正解
coolwuya 2010-05-04
  • 打赏
  • 举报
回复
HOOK中需要启用一个全局共享数据段以供其他所有调用实例程序共享,网上的HOOK例子很多,可以参考一下。

15,473

社区成员

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

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