Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何在Delphi XE2中确定已注册OCX的版本号_Windows_Delphi_Registry_Delphi Xe2_Ocx - Fatal编程技术网

Windows 如何在Delphi XE2中确定已注册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安装到

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

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

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


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

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


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

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

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

const
  DatabaseVersion = 1;
对照从数据库读取的值检查此常量,如果不兼容,则失败

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