2009-10-06 11 views
0

Cela ressemble beaucoup à trouver une aiguille dans une pile de foin, mais voilà.La corruption de la pile d'appel entre les frontières

Je construis une application Windows Mobile 6.1. Plus précisément, j'essaie de porter sur le OpenCV framework. Après avoir compilé avec succès (de manière douteuse) OpenCV pour l'architecture ARM4I, je l'ai essayé dans une simple application de style hello. De mon WinCE. EXE j'appelle une fonction stockée dans un .dll OpenCV (cxcore200.dll). L'appel simple ressemble à ceci.

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

Des problèmes majeurs se posent lorsque je fais un pas en cvCreateImage. La signature de la méthode est la suivante:

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

Ainsi, lorsque je entre dans cette fonction, params profondeur et la taille sont égales à 320 et 240 respectivement (non 8 et 1 comme prévu).

Pour référence, CvSize est déclarée comme:

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

Ceci est clairement une sorte de corruption de pile d'appels qui a à voir avec le fait que je traverse les frontières dans une DLL peut-être pas correctement compilé.

La DLL et l'EXE compilent et lient sans erreur. Est-ce que quelqu'un a déjà vu quelque chose comme ça? Des idées sur la façon de déboguer cela?

+0

Recompilation avec quelques drapeaux différents semble avoir résolu le problème. – alyx

Répondre

0

Je ne connais pas votre environnement spécifique, mais je vous suggérerais de vérifier que vous utilisez la bonne convention d'appel lorsque vous appelez cvCreateImage. Voir this pour le matériel de référence.

Par ex, le C++ par défaut dans la convention d'appel VC++ est "thiscall", mais peut-être cvCreateImage attend __stdcall, __cdecl ou __fastcall.

+0

Bonne idée mais j'ai fait quelques recherches et apparemment l'architecture ARM ignore toutes les conventions d'appel et en utilise une par défaut. – alyx

0

Lorsque j'ai dû déboguer cela (il y a 15 ans, Win16), j'ai utilisé le démontage. Non-trivial à lire, mais il a rendu sans ambiguïté ce qui se passait précisément.

Questions connexes