Dll中全局钩子实现的问题,为什么有问题
为什么我写在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)。
的中断,这怎么搞啊!