LibHOOK.h文件中
extern "C"
{
  __declspec(dllexport) void __stdcall SetHook(void);
}
LibHook.CPP中
__declspec(dllexport) void __stdcall SetHook(void)
{
MessageBox(NULL,"HOOK,HOOK,HOOK","Hook Dll",MB_OK);
}
这样的话动态调用,GetProcAdress()函数就找不到SetHook函数了
但是我不用LibHOOK.h文件中的声明,而用DEF文件指定
;lib.def
LIBRARY "LibHook"
EXPORTS 
SetHook @1
这样的话,就可以找到了,调用成功。

解决方案 »

  1.   

    但是静态调用的时候用在
    LibHOOK.h文件中加
    extern "C"
    {
      __declspec(dllexport) void __stdcall SetHook(void);
    }
    的方法又是对的,调用正确。
    困惑
      

  2.   

    叫你个折中的办法,首先把.h和.cpp中的__declspec(dllexport)去掉,然后,.def中继续保留SetHook @1不变。搞定!兄弟切记,__stdcall影响的只是编译器对函数参数的入/出栈的顺序和负责者,至于函数的符号名称一般是不会受到它的影响的(也可能会有,但要看是谁家的编译器了)。
      

  3.   

    看下《Windows核心编程》471页你就明白了。可以用
    #pragma comment(linker,"/exprot:SetHook=_SetHook@4")
      

  4.   

    http://blog.csdn.net/lixiaosan/archive/2006/04/29/697647.aspx
      

  5.   

    当你使用__stdcall(WINAPI)将C函数输出时,microsoft编译器会改变函数名,设置一个前导下划线,再加上一个@符号,后面还要一个数字.