VC++中调用动态链接库函数报错
VC++中调用动态链接库函数出错
原委:
想用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) 里面,仅仅是源代码翻译出的汇编码。而且问题也不一定出在调用约定上。
原委:
想用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) 里面,仅仅是源代码翻译出的汇编码。而且问题也不一定出在调用约定上。