2009-07-30 48 views
8

首先,我指的是Windows環境和VC++編譯器。如何更新C++ DLL而無需使用lib文件重新鏈接exe文件?

我希望能夠做的是重建一個VC DLL並保持與已被鏈接到lib exe文件的兼容性,而無需重建exe文件或加載動態使用的LoadLibrary的DLL。換句話說,有沒有辦法給dll添加類和方法(但不能刪除任何),並確保現有的入口點保持不變?

回答

8

如果您使用DEF文件和手動指定序號導出功能,你應該能夠做到這一點。

參考

http://msdn.microsoft.com/en-us/library/d91k01sh(VS.80).aspx

+5

我想添加引用 HTTP: //msdn.microsoft.com/en-us/library/900axts6(VS.80).as px 這只是一個點擊從上面的超鏈接,並討論了使用def文件的原因和利弊。 – Rich 2009-07-30 18:09:38

0

只要你不添加任何導出的符號,該序號不會改變。如果通過標準的dllexport機制添加導出的符號,那麼這將很難控制。如果你使用老式的.xpf符號文件,你可能可以控制lib中符號的排列順序(儘管我不確定這一點 - 它可能仍然會對它們進行重新排序),但是要做到這一點很困難C++符號這種方式。

0

我認爲序很少被使用到了解決DLL進口 - 我認爲你必須使用.DEF文件來獲取連接使用它們。因此,只要您不更改導出函數的名稱或簽名,則.exe應該可以正常工作。

8

這要看你的EXE從DLL使用的類。添加新類不應影響現有的入口點。但除此之外,以下任何情況都會影響對象大小和/或佈局,因此會導致客戶端的更改(請注意,這在技術上是VC特有的,但其中大部分適用於任何理智的實現):

  • 卸下場(偶數私人)從類
  • 添加新的字段(甚至私人)到類
  • 從已經存在的類中添加新的基類到現有的類
  • 卸下基類
  • 添加新的虛擬方法之前現有的虛擬方法(現有的後添加新的虛擬方法是好的,除了在下一個點所描述的情況),其在相同的DLL用作基類被另一個類
  • 在一個類中添加一個新的虛擬方法,其也有虛擬方法現有字段
  • 更改的現有方法
  • 製作一個虛擬方法非虛擬簽名的
  • 轉變類型,反之亦然
+0

我認爲這是一個很好的答案,但我會改變一件事:以任何方式改變班級中的虛擬方法都是值得懷疑的。我不認爲你可以指望虛擬函數具有與源文件中顯示的順序相同的順序。 – 2009-07-30 17:40:11

相關問題