Codeblocks(mingwの下でGCCを使用する)内でVisual Studio 2008 SP1で作成されたdll(共通言語ランタイムサポートが有効)を使用しようとしています。 dllに渡されている引数の一部は、呼び出し関数によって動的に割り当てられています。私の質問は次のとおりです:DLLコールのヒープ/スタック破損
"dllに渡される引数は、呼び出し元関数のヒープにありますか?これは安全ですか?"
dllから戻ってくると、呼び出し元の関数のスタックが破損し、それらにアクセスしようとすると、この問題をデバッグしようとするとcodeblocks内にSIGTRAPが発生します。
この理由は何ですか?
DLL関数のプロトタイプは次のようなものです。以下に示すように
int __cdecl myTesseractOCR(myOCRData* labels_for_ocr);
myOCRDaata定義は次のとおりです。すべてのように呼び出し元の関数のヒープ上にあるデータへ
typedef struct __ocr_data
{
char* arr_image [NUMOBJ_LIMIT_HIGH];
int start_x [NUMOBJ_LIMIT_HIGH];
int start_y [NUMOBJ_LIMIT_HIGH];
int width [NUMOBJ_LIMIT_HIGH];
int height [NUMOBJ_LIMIT_HIGH];
int widthstep [NUMOBJ_LIMIT_HIGH];
char number_plate_buff [2*NUMOBJ_LIMIT_HIGH];
int ocr_label_count;
} myOCRData;
arr_imageポイント上記の構造の他のメンバは、呼び出し関数のスタック上に存在します。スタックに存在するこれらのメンバーはすべて壊れ、プログラムはSIGTRAPを生成します。私はそのような問題がstackoverflow上のさまざまなスレッドで議論されているのを見ましたが、まだ具体的な解決策を見つけ出していません。
私は同意しません。 DLLからエクスポートされた関数に構造体を渡すことは完全にルーチンです。 Win32はこれに大いに依存しています。 –
@David Heffernan構造が同じにパックされている限り、それは動作します。 OPは2つのコンパイラを使用しているので、異なるパッキングが、彼が見ている破損の原因となる可能性があります。 – Praetorian
これは実際に起こりうる原因であり、修正するのは簡単ではありません。 –