我想变一个系统钩子,但变异是报如下错误:
error C2440: “类型转换” : 
无法从“overloaded-function”转换为“HOOKPROC”
请问这是什么原因???????
出错位置为下面代码段的(HOOKPROC) MyCBTHookProc处:
void CBlockHookApp::InstallCBTHook(DWORD hookDest=0)
{

  m_hook = SetWindowsHookEx(WH_CBT,          (HOOKPROC) MyCBTHookProc, theApp.m_hInstance, hookDest);
。。}
程序代码如下:
// BlockHook.h : BlockHook DLL 的主头文件
//#pragma once#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif#include "resource.h" // 主符号
// CBlockHookApp
// 有关此类实现的信息,请参阅 BlockHook.cpp
//class CBlockHookApp : public CWinApp
{
public:
CBlockHookApp();// 重写
public:
virtual BOOL InitInstance(); DECLARE_MESSAGE_MAP()
void InstallCBTHook(DWORD hookDest);
void UninstallCBTHook(void);
LRESULT CALLBACK MyCBTHookProc(int nCode, WPARAM wparam, LPARAM lparam);
HHOOK m_hook;
};
// BlockHook.cpp : 定义 DLL 的初始化例程。
//#include "stdafx.h"
#include "BlockHook.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif//
// 注意!
//
// 如果此 DLL 动态链接到 MFC
// DLL,从此 DLL 导出并
// 调入 MFC 的任何函数在函数的最前面
// 都必须添加 AFX_MANAGE_STATE 宏。
//
// 例如:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 此处为普通函数体
// }
//
// 此宏先于任何 MFC 调用
// 出现在每个函数中十分重要。这意味着
// 它必须作为函数中的第一个语句
// 出现,甚至先于所有对象变量声明,
// 这是因为它们的构造函数可能生成 MFC
// DLL 调用。
//
// 有关其他详细信息,
// 请参阅 MFC 技术说明 33 和 58。
//// CBlockHookAppBEGIN_MESSAGE_MAP(CBlockHookApp, CWinApp)
END_MESSAGE_MAP()
// CBlockHookApp 结构CBlockHookApp::CBlockHookApp()
{
// TODO: 在此添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}
// 唯一的 CBlockHookApp 对象CBlockHookApp theApp;
// CBlockHookApp 初始化BOOL CBlockHookApp::InitInstance()
{
CWinApp::InitInstance(); return TRUE;
}void CBlockHookApp::InstallCBTHook(DWORD hookDest=0)
{

  m_hook = SetWindowsHookEx(WH_CBT, //钩子类型
(HOOKPROC) MyCBTHookProc, //钩子处理函数指针
 theApp.m_hInstance,  hookDest); if(m_hook==NULL)
MessageBox( NULL,"钩子安装失败","错误!",MB_OK);}void CBlockHookApp::UninstallCBTHook(void)
{
UnhookWindowsHookEx(m_hook);
}LRESULT CALLBACK CBlockHookApp::MyCBTHookProc(int nCode, WPARAM wparam, LPARAM lparam)
{
//添加钩子处理代码 //switch语句
switch (nCode) {
case HCBT_CREATEWND:
break;//处理完成,跳出switch语句
}
//switch语句结束
//函数来传递参数给在下一个钩子链中安装的钩子。
//我极力推荐这种方法是因为如果不使用它,就会引起不可预知的系统行为和系统锁定。
return (CallNextHookEx(m_hook,nCode,wparam,lparam));
}

解决方案 »

  1.   

    add static modifier to MyCBTHookProc
      

  2.   

    static LRESULT CALLBACK MyCBTHookProc(int nCode, WPARAM wparam, LPARAM lparam);
      

  3.   

    static LRESULT CALLBACK MyCBTHookProc(int nCode, WPARAM wparam, LPARAM lparam);
      

  4.   

    //example:
    cbtHook=SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,hins,0);
    LRESULT __declspec(dllexport)__stdcall  CALLBACK CBTProc(
                                int nCode, 
                                WPARAM wParam, 
                                LPARAM lParam);
      

  5.   

    MyCBTHookProc(int nCode, WPARAM wparam, LPARAM lparam)
    因为你是在类中定义该回调函数,所以应该是静态函数才对。