2012-09-06 69 views
1

我有一個在合規情況下使用的DLL(其細節無關緊要)。重要的一點是主可執行必須顯示DLL版本號。我的解決方案是,DLL有一個函數來返回它自己的版本 - 即從它自己的版本資源中獲取它並將其作爲字符串返回。軟件設計:如何獲得DLL版本號

我的評論者說主程序應該算出DLL版本號。他甚至給了我一些代碼來獲取DLL模塊的句柄,並使用它來提取版本。

我的問題是,這是一個更好的設計,爲什麼?我的感覺是,使用面向對象的原則,我應該問DLL的版本號。這樣做意味着主程序需要知道版本信息是如何存儲的,因此與實現更緊密地耦合。

請注意,我確切知道如何從DLL中提取版本信息。我的問題是關於執行此操作的代碼的最佳位置。

+0

答案取決於細節(所以他們*是*相關)。鑑於這裏提供的信息,我可以良心良心地辯護這兩起案件。 (我也懷疑沒有明確的答案,這只是設計決定的問題。) – atzz

+0

我認爲任何一種方法都可以,儘管GetFileVersionInfo()是通用的,並且可以用於任何DLL。唯一的問題是你需要確保版本信息是準確的;理想情況下,這應該由您的構建系統自動完成。 – Luke

+0

使每個DLL負責報告自己的版本意味着相同的代碼在每個DLL中重複,這違反了DRY。由於版本標記是標準化的,因此除非您打算在將來更改爲非標準版本標記方案,否則封裝沒有真正的好處。 –

回答

2

你能澄清你所在的環境嗎?現在,由於您已經提到了獲取模塊句柄,因此我假定您正在使用C++並調用一些Win32函數(GetModuleHandle,LoadLibrary等)之一。

首先,我會在太寬泛的背景下應用面向對象的原則。面向對象的範例可以幫助您以更易於維護和易於理解的方式構建您的軟件,您所描述的問題聽起來像是可能延伸到應用程序邊界之外。如果您想獲取有關單獨資源(如DLL)的信息,則應考慮使用標準方法來實現此目的,以確保您的代碼與需要檢查的項目分離。

如果在DLL中引入一個函數以將版本號返回給主應用程序,那麼您已經在主應用程序和任何需要提供版本信息的DLL之間創建了緊密耦合(通過定義一個定製的API或接口爲此)。

您應該考慮使用標準的,平臺範圍的功能來檢索信息。這將允許您的應用程序版本化可以獲取句柄的任何DLL。

假設您對DLL的HMODULE(和你用C++),調用以下函數來獲取的版本...

GetModuleFileNameEx(得到,如果你的DLL的完整路徑和文件名使用此文件名已經不知道這一點) http://msdn.microsoft.com/en-us/library/windows/desktop/ms683198(v=vs.85).aspx

,叫

GetFileVersionInfoSize(看這些了MSDN上)

這會告訴你一些關鍵的信息n關於文件的版本元數據(有多少信息,如果有的話)。假設這個函數成功,調用

GetFileVersionInfo

這將加載所有的文件信息的元數據到緩衝區中,然後調用

VerQueryValue

供應「\」作爲lpSubBlock參數來獲取標準文件信息元數據(包括版本號)

上述函數將允許您編寫代碼以獲取您的代碼可以處理的任何模塊的版本號。

當然,如果您使用C#,解決方案要簡單得多。希望這有助於...