在动态库中定义了一个小函数extern "C" _declspec(dllexport) int Add(int i,int j);  然后在建立一个测试工程,在工程中我显式调用库中的函数,先定义一个函数指针 如下:
typedef int (* pFun)(int,int);

程序运行没有问题
后来我这样定义函数指针
typedef int (CALLBACK* pFun)(int,int);程序崩溃了。请问什么时候该加CALLBACK,什么时候不用加呢?

解决方案 »

  1.   

    加CALLBACK和不加在约定的参数调用方法不同,不加是默认的__cdecl方式,加了是__stdcall的,可以参考这个
    http://blog.csdn.net/guo_wei/archive/2007/10/18/1830394.aspx
      

  2.   

    调用约定不同。
    C++默认的调用约定是__cdcel,退出时由调用者恢复栈,这样,可以实现变参。
    CALLBACK是__stdcall,退出时,被调用者恢复栈。
    所以,崩溃就可以理解了,栈被试图恢复两次。
      

  3.   

    那为什么我在动态库中这样声明导出函数会报错:
    _declspec(dllexport) int  _stdcall  Add(int i,int j)

    return i+j;
    }
      

  4.   

    哪报错?
    dll还是应用程序?
      

  5.   

    dll报错。就是我单独编译dll时就会出错。是不是我的声明方式有问题?
      

  6.   

    我在dll中这样声明导出函数:
    _declspec(dllexport) int  _stdcall  Add(int i,int j) 
    {  
          return i+j; 
    }在.exe中这样声明函数指针:
    typedef int (_stdcall * pFun)(int,int); 
    ...
    可是运行总是通不过。
      

  7.   

    exe中需要声明称 _declspec(dllimport), 不然编译器会在你的源代码和静态库中查找Add函数的实现. 当然编译会失败了