如何在Delphi XE2中确定已注册的OCX的版本号

时间:2014-07-15 22:12:32

标签: windows delphi registry delphi-xe2 ocx

我在XE2中有一个ActiveX组件连接到数据库来处理事务处理,它包括检查其版本与数据库的版本,以确定它们是否兼容。

与C#不同,可以使用Application.ProductVersion属性在运行时获取AssemblyVersion属性,Delphi XE2没有用于获取项目选项中包含的版本信息的内置属性,首选方法是使用GetFileVersionInfo ,传递给程序的完整路径,或者在这种情况下传递给OCX。

最初OCX始终安装在Windows系统路径中,但我们更改了安装过程,以便将OCX安装到与使用它的可执行文件相同的文件夹中,这是用户确定的位置。

我需要的是一种一致的方法,我可以在OCX代码中使用该方法从多个Windows环境中的注册表中获取安装文件夹。我认为它与_TLB.pas文件中定义的GUID有关。

2 个答案:

答案 0 :(得分:2)

您根本不需要查询注册表。 OCX可以通过将Delphi的全局HInstance变量作为Win32 API GetModuleFileName()函数的模块句柄传递来检索自己的文件名,然后它可以将该文件名传递给GetFileVersionInfo()。 / p>

虽然,OCX访问自己的版本而不诉诸GetFileVersionInfo()的更好方法是使用Find/Load/LockResource()直接访问自己的版本资源,然后根本不需要文件名。您可以将版本资源数据复制到临时缓冲区并将其传递给VerQueryValue()以检索资源的VS_FIXEDFILEINFO结构(从资源中检索任何其他内容会变得有点棘手,因为{{1}准备GetFileVersionInfo()然后使用的某些查找数据。

答案 1 :(得分:1)

您当然不需要在此处使用注册表。尤其是因为机器上可能存在多个版本的DLL,因为您正在安装到使用DLL的任何程序的可执行目录中。

你当然可以阅读Remy描述的版本资源。但另一种方法是在程序中包含一个编码数据库版本兼容性的常量。

const
  DatabaseVersion = 1;

根据从数据库读取的值检查此常量,如果不兼容则失败。

对我来说,这更有意义,因为它将DLL的版本与数据库的版本分开。这两者不一定有联系。您可以并且可能在不更改数据库结构的情况下更新DLL。