Windows 如何在Delphi XE2中确定已注册OCX的版本号
我在XE2中有一个ActiveX组件,它连接到一个数据库来处理事务处理,它包括一个对照数据库版本的检查,以确定它们是否兼容 与C#不同,C#可以在运行时使用Application.ProductVersion属性获取AssemblyVersion属性,Delphi XE2没有用于获取项目选项中包含的版本信息的内置属性,首选方法是使用GetFileVersionInfo,传递程序的完整路径,或者在本例中是OCX 最初OCX始终安装在Windows系统路径,但我们已更改了安装过程,以便将OCX安装到与使用它的可执行文件相同的文件夹中,该文件夹由用户确定Windows 如何在Delphi XE2中确定已注册OCX的版本号,windows,delphi,registry,delphi-xe2,ocx,Windows,Delphi,Registry,Delphi Xe2,Ocx,我在XE2中有一个ActiveX组件,它连接到一个数据库来处理事务处理,它包括一个对照数据库版本的检查,以确定它们是否兼容 与C#不同,C#可以在运行时使用Application.ProductVersion属性获取AssemblyVersion属性,Delphi XE2没有用于获取项目选项中包含的版本信息的内置属性,首选方法是使用GetFileVersionInfo,传递程序的完整路径,或者在本例中是OCX 最初OCX始终安装在Windows系统路径,但我们已更改了安装过程,以便将OCX安装到
我需要的是一个一致的方法,我可以在OCX代码中使用该方法从注册表跨多个Windows环境获取安装文件夹。我假设它与_TLB.pas文件中定义的GUID有关。您根本不需要查询注册表。OCX可以通过将Delphi的global
HInstance
变量作为模块句柄传递给Win32 APIGetModuleFileName()
函数来检索自己的文件名,然后它可以将该文件名传递给GetFileVersionInfo()
虽然OCX访问自己的版本的更好方法是使用
Find/Load/LockResource()
,而不必求助于GetFileVersionInfo()
,直接访问自己的版本资源,那么根本不需要文件名。您可以将版本资源数据复制到临时缓冲区中,并将其传递到VerQueryValue()
以检索资源的VS_FIXEDFILEINFO
结构(从资源中检索任何其他内容会变得有点棘手,因为GetFileVersionInfo()
准备了VerQueryValue()
然后使用的特定查找数据).您当然不需要在此处使用注册表。不仅仅是因为机器上可能有多个版本的DLL,因为您正在安装到使用DLL的任何程序的可执行目录
您当然可以阅读Remy描述的版本资源。但另一种选择是在程序中包含一个常量,用于编码数据库版本兼容性
const
DatabaseVersion = 1;
对照从数据库读取的值检查此常量,如果不兼容,则失败
对我来说,这更有意义,因为它将DLL的版本与数据库的版本分开。这两者不一定有联系。您可以,而且可能会,在不更改数据库结构的情况下更新DLL