2011-07-26 29 views
0

我試圖使用的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的各個線程中討論了所有這些問題,但還沒有找到具體的解決方案。

回答

0

這是完全合理的DLL來訪問駐留在調用應用程序堆內存。如果你不能這樣做,那麼DLL本質上是無用的。

你的問題必須在其他地方。很可能你沒有正確設置調用DLL的參數。

1

我建議你儘可能使你的DLL接口爲flat;即避免通過結構,即使它們是POD。由於您使用2種不同的編譯器,所以這一點尤爲重要。如果您決定傳遞結構,請確保在兩個編譯器下都明確定義了結構的包裝。

+1

我不同意。將結構傳遞給從DLL導出的函數是完全常規的。 Win32廣泛依賴於此,它工作得很好。 –

+1

@David Heffernan只要結構包裝一樣,它就可以工作。由於OP正在使用2個編譯器,所以不同的包裝可能是他看到的腐敗的原因。 – Praetorian

+0

這確實是一個可能的原因,修復它是微不足道的。 –

0

可以交叉檢查GCC和DLL約定VS2kSP1 CLR

0

調用約定標誌堆不屬於一個功能。在模塊中分配內存並將其傳遞給另一個模塊非常好,只需確保分配內存的模塊是釋放內存的模塊即可。
麻煩的第二個來源可能是不同的調用轉換。爲所有導出的函數指定調用約定。