0

これは、干し草の山から針を見つけるのとよく似ていますが、これで終わりです。

Windows Mobile 6.1 アプリケーションを構築しています。具体的には、 OpenCV フレームワークに移植しようとしています。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 の両方がエラーなしでコンパイルおよびリンクされます。誰もこのようなものを見たことがありますか?これをデバッグする方法についてのアイデアはありますか?

4

2 に答える 2

0

これをデバッグする必要があったとき (15 年前、Win16)、逆アセンブリを使用しました。読むのは簡単ではありませんが、正確に何が起こっているのかを明確にしました。

于 2009-10-07T11:55:09.740 に答える
0

私はあなたの特定の環境に精通していませんが、 を呼び出すときに正しい呼び出し規則を使用していることを再確認することをお勧めしますcvCreateImage。参考資料はこちらをご覧ください。

たとえば、VC++ のデフォルトの C++ 呼び出し規約は「thiscall」ですが、おそらくcvCreateImage__stdcall__cdeclまたは__fastcall.

于 2009-10-06T21:47:05.340 に答える