Повреждение стека вызовов между границами - PullRequest
0 голосов
/ 07 октября 2009

Это похоже на поиск иголки в стоге сена, но здесь все в порядке.

Я создаю приложение для Windows Mobile 6.1. В частности, я пытаюсь портировать через OpenCV framework . Успешно (с сомнением) скомпилировав OpenCV для архитектуры ARM4I, я опробую его в простом приложении в стиле world hello.

Из моего 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 голосов
/ 07 октября 2009

Когда мне пришлось отлаживать это (15 лет назад, Win16), я использовал разборку. Нетривиально читать, но это сделало однозначным, что именно происходило.

0 голосов
/ 07 октября 2009

Я не знаком с вашей конкретной средой, но я бы посоветовал дважды проверить, чтобы убедиться, что вы используете правильное соглашение о вызовах при вызове на cvCreateImage. См. этот справочный материал.

Например, соглашение о вызовах C ++ по умолчанию в VC ++ - "thiscall", но, возможно, cvCreateImage ожидает __stdcall, __cdecl или __fastcall.

...