VC++中调用动态链接库函数报错

VC++中调用动态链接库函数出错
本帖最后由 aiyoushang521 于 2014-04-30 17:46:22 编辑
原委:
      想用Matlab命令GCC将.m文件编译成C++动态链接库,在VS2005MFC项目中调用生成的函数:recognition,其声明如下:
      extern void recognition(int nargout, mwArray& result, const mwArray& path);  //在 “recognition.h"头文件中,它就是要调用的由.m生成的函数

调用代码如下:
        double buf[4];
        mwArray pPath("G:/C语言/算法/FaceRecognition/yale/test/s22.bmp");  
        mwArray pResult(1,1,mxDOUBLE_CLASS);

       recognition(1,pResult,pPath);  //执行到此处时程序崩溃!!!
       pResult.SetData(buf,1);

崩溃提示:
       FaceRecognition.exe 中的 0x7538812f 处未处理的异常: Microsoft C++ 异常: 内存位置 0x0012f2cc 处的 mwException。
反汇编后:
        recognition(1,pResult,pPath);

        0041BFD4  lea         eax,[ebp-4Ch] 
        0041BFD7  push        eax  
        0041BFD8  lea         ecx,[ebp-5Ch] 
        0041BFDB  push        ecx  
        0041BFDC  push        1    
        0041BFDE  call        recognition (411A5Ah)     //执行到此处崩溃!!!! 
        0041BFE3  add         esp,0Ch 
        
        pResult.SetData(buf,1);

备注:程序编译无措。

请帮忙指点一下错误的原因,抑或告诉我下一步调试的的方法?谢谢!!
  
------解决方案--------------------
 extern void recognition
没有调用约定?   谁清理堆栈? 即:

__cdecl   ?
__stdcall ?
------解决方案--------------------
用__stdcall函数调用阅读
------解决方案--------------------
从反汇编的代码来看,调用时是采用 _stdcall 调用约定的,那么,若要程序正常运行,定义函数时也应该加上 _stdcall 。
------解决方案--------------------
最好使用跟dll相同的调用方式,从汇编代码看,是调用者清的栈,但这段代码跟源代码几乎没什么不同,没有进入recognition (411A5Ah) 里面,仅仅是源代码翻译出的汇编码。而且问题也不一定出在调用约定上。