调用边界之间的堆栈损坏

时间:2009-10-06 21:23:17

标签: c++ stack opencv call windows-ce

这感觉就像在干草堆中找到针一样,但这里就好了。

我正在构建Windows Mobile 6.1应用程序。具体来说,我正试图移植OpenCV framework。成功(怀疑地)为ARM4I架构编译OpenCV后,我在一个简单的hello world样式应用程序中尝试它。

从我的WinCE .EXE我调用存储在OpenCV .DLL(cxcore200.dll)中的函数。简单的调用看起来像这样。

IplImage *src = cvCreateImage(cvSize(320,240), 8, 1);

当我进入cvCreateImage时会出现重大问题。方法签名是:

IplImage * cvCreateImage( CvSize size, int depth, int channels ){ ... }

因此,当我进入此功能时,深度和大小参数分别等于320和240(不是预期的8和1)。

作为参考,CvSize声明为:

typedef struct
{
    int width;
    int height;
}
CvSize;

这显然是某种类型的调用堆栈损坏,这与我跨越边界可能是错误编译的DLL这一事实有关。

DLL和EXE都编译和链接没有错误。 有没有人见过这样的东西?关于如何调试这个的任何想法?

2 个答案:

答案 0 :(得分:0)

我不熟悉您的具体环境,但我建议您仔细检查以确保在呼叫cvCreateImage时使用正确的呼叫约定。有关参考资料,请参阅this

,例如,VC ++中的默认C ++调用约定是“thiscall”,但可能cvCreateImage期望__stdcall__cdecl__fastcall

答案 1 :(得分:0)

当我不得不调试这个(15年前,Win16)时,我使用了反汇编。阅读非常重要,但它确切地说明了究竟发生了什么。