2010-10-01 19 views
3

我已經重載全局新建/刪除(和新[] /刪除[])來填充和檢查保護塊。工作正常。現在我鏈接到傳遞由DLL填充或修改的STL-Container實例的C++ DLL。在破壞這些容器時,我遇到了一個錯誤,因爲它們沒有使用我的重載新操作符分配,反之亦然,釋放使用我重載的新創建的容器元素時,dll會生成錯誤。如何讓C++ DLL調用我的重載全局新運算符?

我怎樣才能使DLL的調用我的新的運營商? 對於某些DLL我有源,對於其他我沒有它。

必須有作爲,即一個全面的方法在Visual Studio運行時的DLL MSVCP * .DLL叫我重載運算符。我怎樣才能讓其他DLL也打電話給我的操作員呢?

a)用具有DLL的來源是什麼? 和檢查 b)沒有DLL的來源?

+0

是你的exes和dll使用相同的運行時? – Chubsdad 2010-10-01 11:21:19

+0

到目前爲止:是的,所有人都使用相同的。 – 2010-10-01 15:30:02

回答

0

我認爲你需要把新的/在DLL中刪除代碼,並確保該EXE和你額外的DLL的調用這個共同的代碼兩者。

即使這種方法也有問題,所以對我來說是更好地確保該建築所分配的內存塊的模塊是刪除它在同一個模塊然而,這不是一個簡單的要求是很多的情況。

2

的DLL,你可以編譯,你可以讓他們通過

  1. 確保調用代碼包括頭定義你的重載
  2. 通過指定它們導出從您的DLL那些重載打電話給你的重載方法一個導出文件

這裏是導出(使用mangled名稱,從來沒有找到另一種方式來做到這一點)新/刪除/新[] /刪除[],拋出版本。

86:

EXPORTS 
    [email protected]@Z 
    [email protected]@Z 
    [email protected]@Z 
    [email protected]@Z 

64:

EXPORTS 
    [email protected][email protected] 
    [email protected]@Z 
    [email protected][email protected] 
    [email protected]@Z 

我不認爲這個工程,你沒有自己編譯的DLL但(當時他們建立了鏈接已經採取了小心尋找對這些方法的參考);要做到這一點,你可能不得不使用相當骯髒的技巧,如鉤住你的過程的crt。

編輯對於其他方式,您可以將分配器從主機應用程序傳遞到dll,並確保dll只使用這些分配器來分配,而不是新建/刪除。 Havee tho alloactors依次調用你的超載新/刪除。這有點麻煩,但應該工作,也可以使用STL,因爲您可以爲這些容器指定分配器;但是,如果你想使用你的界限檢查代碼來分配你沒有代碼的dll,這並不能解決任何問題。

+0

我認爲這並不完全,我不會這樣做:我想調用DLL中的應用程序中的代碼。出口做相反的事情,但帶來不同的問題。我將在Dll中擁有重載的運算符。一般情況下可以從Dll調用主機中的代碼而不調用函數來註冊它等等? – 2010-10-04 09:33:57

+0

抱歉,我不明白你的意思。你能提供一些代碼示例嗎?你也可以重新翻譯'我想調用代碼':你的意思是'主程序想調用函數'嗎?或者你是否意味着像'dll wnats訪問主程序中分配的數據(對象)'? – stijn 2010-10-04 11:47:44

+0

該DLL應該有一些'導入',這決定在主機應用程序中編碼 - 所以該dll應該調用宿主應用程序中的函數。這不僅屬於新的運營商等,我實際上不知道這是否可能。看起來不像。 – 2010-10-04 14:10:35