2010-06-01 141 views
3

我確實有三個dll。向後兼容性dll

  • A.DLL - 發佈多年前
  • B.DLL - 發行不這麼多年
  • c.dll - 發佈不久

各包含相同的功能 - 可惜的是用不同的參數。 所以我有以下方法

aMethod(param1) 
aMethod(param1, param2) 
aMethod(param1, param2, param3) 

我的任務就是讓一個新的DLL(或新的DLL)至極是向後兼容。 但據我從Google瞭解到,不可能在DLL中重載方法。

有沒有人有一個提示,我可以如何優雅地解決這個問題?

回答

1

您可以重載DLL中的函數簽名。但是,從DLL導出的函數名稱必須是唯一的 - 這是Windows要求,而不是Delphi要求。因此,在Delphi中將你的函數聲明爲重載,但要確保它們是用你定義的特定唯一名稱導出的。從新的一體化DLL導入的客戶端需要使用您定義的唯一名稱進行導入。

Delphi中的默認行爲是導出的函數通過函數的名稱導出,非常簡單。如果你想做重載,你需要更多地參與並自己定義導出名稱。

但是,請注意,這不會產生一個DLL,可以放入一箇舊的應用程序,期望您的a.dll。該解決方案向後兼容源代碼,但不能向後兼容二進制文件。

您很可能無法創建與以前的所有三個DLL版本二進制兼容的新DLL,因爲舊的exe二進制文件引用相同的函數名稱,但期望不同的行爲(不同的參數列表) 。

還要注意,如果你的三個dll版本實際上有不同的文件名(a,b,c),那麼這個點有點沒有意義 - 靜態函數綁定綁定到dll名稱和函數名。如果你想讓你的新DLL和舊版本一起工作,你打算將新的dll拷貝三次到文件名a,b和c嗎?這看起來很奇怪,適得其反。與睡覺的狗一樣,讓舊的DLL說謊。除非你絕對必須修復一些重要的bug,否則不要擔心。

+0

最後,使用cmd比較庫的所有版本的符號列表:「dumpbin/EXPORTS .dll」。列表「c」應包含列表「b」,列表「b」應包含列表「a」。在運行dumpbin命令(通常放置在C:\ Microsoft Visual Studio 9.0 \ Common7 \ Tools \\)之前,應該運行vsvars32.bat。 – aponomarenko 2011-01-14 21:31:21

0

直到我知道你可以使用方法重載,你只需要在同一個DLL中實現以前和新版本。在Delphi中,你需要使用過載指令。請參閱此鏈接:

http://delphi.about.com/od/objectpascalide/a/overloading.htm

+0

當函數被導出到dll(stdcall;)時,這也起作用嗎?在dll中允許超載嗎?因此,我可以有兩個函數(在Delphi中)可以從phu調用,假設C a函數(a,b:Integer,c:PChar):WORD; stdcall; (a,b:整數):WORD; stdcall; – Michael 2010-06-01 13:48:46

0

使這個方法更通用的 - 將其更改爲類似的東西 - 我不熟悉德爾福,所以這個例子是在C#:

aMethod(int version, object args) 

或C:

aMethod (int version, void** args) 

然後根據版本,你可以使用鑄造。請注意,參數也可以是一個集合對象。

HTH。

+0

在德爾福everthing工作正常 - 儘可能好: - /。 我的問題是 - 據我所知 - 這是不允許甚至可能在DLL中有重載的方法。 – Michael 2010-06-01 13:51:39