我試圖使用的Visual Studio 2008 SP1創建DLL堆/堆棧腐敗(與公共語言運行庫支持啓用)內的代碼塊(使用MinGW的GCC下)。一些傳遞給dll的參數已被調用函數動態分配。我的問題是:上DLL調用
「可以的參數傳遞給DLL駐留在調用函數的堆是否安全做到這一點?」
在從DLL中調用函數被破壞的堆棧和試圖訪問這些回報,我得到的代碼塊內的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
這確實是一個可能的原因,修復它是微不足道的。 –