我做了一个全局钩子,调试时出现Debug Error:file:chkesp.c……大致是说声明的函数指针调用方式(calling convention)与调用函数的调用方式不同。我左看右看找不到问题,请高手指点!我用的是VC6,Win98.
Dll中:
头文件:
EXPORTMODE BOOL StartHook(HWND hDisWnd);
CPP:
EXPORTMODE BOOL StartHook(HWND hDisWnd)
{
BOOL bResult=false;
if (g_hInstance!=NULL)
{
g_hhook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,g_hInstance,0);
if ((g_hhook!=NULL) && (hDisWnd!=NULL))
{
g_hDisWnd=hDisWnd;
bResult=true;
}
}
return bResult;
}应用程序CPP中:
typedef BOOL (WINAPI  *PFNHOOK)(HWND hDisWnd);
PFNHOOK pfnHook;
pfnHook=(PFNHOOK)::GetProcAddress(hModule,(LPCTSTR)"StartHook")

解决方案 »

  1.   

    函数约定不对,结果造成压栈和出栈的错误。将接口声明为
    __declspec(dllexport) BOOL EventProcess (UINT msg, WPARAM wParam, LPARAM lParam)
    dll得编译环境中,把c/c++中的code generation里的call convention选为_cdcel,保证和主程序的设定一样。
      

  2.   

    我试过在Dll中把调用约定改为extern "C"就没有问题了,但这样就不能输出重载函数了,我不想这样,问题在哪阿,……
      

  3.   

    类的成员函数,参数中有隐藏的this参数,可能导致函数原形不一致 把该函数声明成静态的 或者全局函数 就行了 当然 调用方式也要一致才行
      

  4.   

    你的执行文件是否也是__Stdcall的方式。
    如果要用重载函数的话,建议用__cdcel的C++标准,把主程序和DLL的调用约定都设成_cdcel试试看