你能澄清你所在的環境嗎?現在,由於您已經提到了獲取模塊句柄,因此我假定您正在使用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#,解決方案要簡單得多。希望這有助於...
答案取決於細節(所以他們*是*相關)。鑑於這裏提供的信息,我可以良心良心地辯護這兩起案件。 (我也懷疑沒有明確的答案,這只是設計決定的問題。) – atzz
我認爲任何一種方法都可以,儘管GetFileVersionInfo()是通用的,並且可以用於任何DLL。唯一的問題是你需要確保版本信息是準確的;理想情況下,這應該由您的構建系統自動完成。 – Luke
使每個DLL負責報告自己的版本意味着相同的代碼在每個DLL中重複,這違反了DRY。由於版本標記是標準化的,因此除非您打算在將來更改爲非標準版本標記方案,否則封裝沒有真正的好處。 –