[英]How to determine the version number of a registered OCX in Delphi XE2
我在XE2中有一個ActiveX組件,該組件連接到數據庫以處理事務處理,並且它包括對照數據庫版本檢查其版本,以確定它們是否兼容。
與C#不同,在C#中,可以在運行時使用Application.ProductVersion屬性獲取AssemblyVersion屬性,而Delphi XE2沒有此類內置屬性來獲取項目選項中包含的版本信息,首選方法是使用GetFileVersionInfo,傳入程序或OCX的完整路徑。
最初,OCX始終安裝在Windows系統路徑中,但我們已更改了安裝過程,以便將OCX安裝到與使用它的可執行文件相同的文件夾中,該文件夾由用戶確定。
我需要的是一種一致的方法,我可以從OCX代碼中使用該方法從多個Windows環境中的注冊表中獲取安裝文件夾。 我認為這與_TLB.pas文件中定義的GUID有關。
您根本不需要查詢注冊表。 OCX可以通過將Delphi的全局HInstance
變量作為模塊句柄傳遞給Win32 API GetModuleFileName()
函數來獲取自己的文件名,然后可以將該文件名傳遞給GetFileVersionInfo()
。
雖然,對於OCX訪問自己的版本,無需采取更好的方式GetFileVersionInfo()
是用Find/Load/LockResource()
來訪問自己的版本資源直接,則不需要的文件名都沒有。 您可以將版本資源數據復制到臨時緩沖區中,並將其傳遞給VerQueryValue()
以檢索資源的VS_FIXEDFILEINFO
結構(從資源中檢索其他任何內容都比較棘手,因為GetFileVersionInfo()
准備了VerQueryValue()
然后使用的某些查找數據) 。
您當然不需要在這里使用注冊表。 尤其重要的是,由於要安裝到使用DLL的任何程序的可執行目錄中,因此計算機上可能存在DLL的多個版本。
您當然可以閱讀Remy描述的版本資源。 但是另一種選擇是在程序中包含一個編碼數據庫版本兼容性的常量。
const
DatabaseVersion = 1;
根據從數據庫讀取的值檢查此常量,如果不兼容則失敗。
對我來說,這更有意義,因為它將DLL的版本與數據庫的版本分開了。 兩者不一定鏈接。 您可以並且可能確實在不更改數據庫結構的情況下更新了DLL。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.