微软最近打破了我们的长期(并正式推荐)代码,以阅读Excel的版本及其当前的OmaCro安全级别。

曾经有什么用:

// Get the program associated with workbooks, e.g. "C:\Program Files\...\Excel.exe"
SHELLAPI.FindExecutable( 'OurWorkbook.xls', ...) 

// Get the version of the .exe (from it's Properties...)
WINDOWS.GetFileVersionInfo()

// Use the version number to access the registry to determine the security level
// '...\software\microsoft\Office\' + VersionNumber + '.0\Excel\Security'

(我总是很高兴的是,安全级别已有多年的注册表入境了多年...)

在Office 2010中,.XLS文件现在与“ Microsoft Application Virtualization DDE启动器”或sftdde.exe关联。此EXE的版本编号显然不是Excel的版本。

我的问题:

除了实际启动Excel和查询以外 版本安全 级别(使用ole createOleobject('excel.Application'),是否有更清洁,更快或更可靠的方法来执行此操作,可以从Excel 2003开始使用所有版本?

有帮助吗?

解决方案

采用

function GetExcelPath: string;
begin
  result := '';
  with TRegistry.Create do
    try
      RootKey := HKEY_LOCAL_MACHINE;
      if OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe', false) then
        result := ReadString('Path') + 'excel.exe';
    finally
      Free;
    end;
end;

要获取Excel.exe文件的完整文件名。然后使用 GetFileVersionInfo 照常。

据我所知,这种方法将永远起作用。

其他提示

使用Ole createOleobject('excel.Application'))

您可以使用此函数使用的同一注册表使用相同的注册表来获得Excel版本。基本上,您必须克隆该功能注册表代码的很大一部分。您可以通过类似的工具监视该功能调用 Microsoft Process Monitor 也可以准确查看Windows如何寻找已安装的Excel-然后以完全相同的方式进行操作。

您必须在 HKEY_CLASSES_ROOT\ 并列举所有的分支,其名称以“ Excel.Application”开头。

例如,在此我的工作站我只安装了Excel 2013,这对应于HKEY_CLASSES_ROOT excel.Application.15

但是在我的另一个工作站中,我安装了Excel 2003和Excel 2010,测试了这两个中的不同XLSX实现,因此我有两个注册表键。

hkey_classes_root excel.application.12 hkey_classes_root excel.application.14

因此,您必须用该名称,点和数字列举所有这些分支。

注意:键HKEY_CLASSES_ROOT excel.Application Curver将具有“默认” excel的名称,但是当安装了几个Excel时,“默认值”的含义是模棱两可的。如果您不在乎,您可以使用该默认值,或者可以决定自己选择什么,例如如果您想要最大的Excel版本或最低版本或其他内容。

然后,当每个特定的Excel分支时,您都应该阅读 默认键 其CLSID子分支。像 HKEY_CLASSES_ROOT\Excel.Application.15\CLSID nil名称等于{00024500-0000-0000-C000-000000000046} - 获取该索引到字符串变量。

然后进行第二次搜索 - 进入名为类似的分支 HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer (使用获取的索引)

如果该分支存在 - 获取nil名称为“默认键”值以获取类似的东西 C:\PROGRA~1\MICROS~1\Office15\EXCEL.EXE /automation

最后的结果是命令行。它从文件名开始(在此示例中未引用,但可能是在引用的),然后是可选命令行。您不需要命令行,因此您必须提取初始commanlind,无论是否引用。

然后,您必须检查此类EXE文件是否存在。如果这样做 - 您可以启动它,如果不是 - 如果不是 - 检查注册表中的其他Excel版本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top