簡體   English   中英

如何確定在Delphi XE2中注冊的OCX的版本號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM