2011-04-20 88 views
1

我有一個exe加載DLL。我寫了兩個。dllexported附加字符串已損壞

我是dllexporting函數foo返回一個std :: wstring。

它是所有說

的std :: wstring的廢話= L 「rgjwgfw」;

return blah.append(L"hey"); 

在exe文件中,我輸入foo時,字符串已損壞。只要我從我調用foo的函數返回,我就會得到失敗的斷言。有時我收到一條消息,稱Windows已經在foo.exe中觸發了一個斷點。這可能是由於堆的腐敗等原因造成的......這也可能是由於foo.exe具有焦點時用戶按f12。 etc ...

任何想法,爲什麼會發生這種情況?它不會發生,如果我從foo刪除追加線,並返回原始字符串,沒有問題。

謝謝

+0

你確定這兩個dll是用相同的選項編譯的(發佈版或調試版)嗎? STL模板可能有不同的大小 – 2011-04-20 17:26:15

回答

3

這是很常見的問題。您需要鏈接DLL和可執行文件以在DLL中使用標準庫。這樣他們就可以共享一個共同的標準庫。否則,最終可執行代碼將嘗試使用一個堆,並使用單獨的堆在DLL中進行編碼。當你幾乎通過任何使用動態分配的邊界時,每個都假定對象中的動態分配的緩衝區來自它自己的堆。幾乎所有的操作不僅可以破壞對象,還可以破壞整個堆。

+0

我不能這樣做,因爲我正在靜態鏈接mfc。使用DLL運行庫lib需要動態鏈接到mfc。 有沒有辦法做到這一點,而不是使函數的類型你調用兩次?一旦獲得緩衝區的長度,然後再次用數據實際填充緩衝區? – bdwain 2011-04-20 18:41:29

+0

我懷疑你可以做的那一點是使用一個不同的字符串類,它的所有代碼在DLL中(問題的產生主要是因爲分配器是一個模板參數,所以可執行文件和DLL中的實例化是分開的) 。 – 2011-04-20 18:55:17