如何获得Excel版本和宏安全级别

时间:2010-08-17 21:43:46

标签: delphi excel excel-2010

Microsoft最近打破了我们的长期(并由他们正式推荐)代码来阅读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 Launcher“或sftdde.exe相关联。这个exe的版本号显然不是Excel的版本。

我的问题:

除了实际启动Excel并查询版本安全级别(使用OLE CreateOLEObject('Excel.Application'))之外,还有更清洁,更快,或者更可靠的方法来处理从Excel 2003开始的所有版本?

2 个答案:

答案 0 :(得分:4)

使用

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

据我所知,这种方法一直有效。

答案 1 :(得分:1)

  

使用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-named键等于 {00024500-0000-0000-C000-000000000046} - 将该索引获取到字符串变量。

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

如果该分支存在 - 获取未命名的“默认密钥”值以获得类似C:\PROGRA~1\MICROS~1\Office15\EXCEL.EXE /automation

的内容

最后一个结果是命令行。它以文件名开头(在此示例中未引用,但可能是引号),后跟可选命令行。 您不需要命令行,因此您必须提取引用或不引用的初始commanlind。

然后你必须检查这样的exe文件是否存在。如果是 - 您可以启动它,如果没有 - 检查注册表中的其他Excel版本。