代码之家  ›  专栏  ›  技术社区  ›  RobertFrank Picarus

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

  •  3
  • RobertFrank Picarus  · 技术社区  · 15 年前

    微软最近破译了我们长期(并被他们正式推荐)的代码来读取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'
    

    (多年来,在一个不安全的注册表条目中,安全级别一直让我感到好笑…)

    在Office2010中,.xls文件现在与“Microsoft应用程序虚拟化DDE启动程序”或sftdde.exe关联。此exe的版本号显然不是Excel的版本。

    我的问题:

    除了实际启动Excel并查询它 版本 安全 级别(使用ole createoleobject(“excel.application”))是否有一种更干净、更快或更可靠的方法来执行此操作,该方法适用于从excel 2003开始的所有版本?

    2 回复  |  直到 9 年前
        1
  •  4
  •   Andreas Rejbrand    15 年前

    使用

    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 像往常一样。

    据我所知,这种方法总是有效的。

        2
  •  1
  •   Arioch 'The    9 年前

    使用OLE CreateOleObject(“excel.application”))

    您可以使用此函数使用的相同注册表位置来获取已安装的Excel版本。 基本上,您必须克隆该函数注册表代码的大部分。 您可以通过类似于 Microsoft Process Monitor 也可以确切地看到Windows如何查找已安装的Excel,然后以完全相同的方式进行查找。

    您必须在打开注册表 HKEY_CLASSES_ROOT\ 并枚举所有分支,其名称以“excel.application”开头。

    例如,在我的工作站上,我只安装了Excel 2013,它对应于hkey_classes_root\excel.application.15。

    但在另一个工作站上,我安装了Excel2003和Excel2010,在这两个工作站中测试不同的XLSX实现,所以我有两个注册表项。

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

    所以,您必须用这个名称、点和数字枚举所有这些分支。

    注意:关键字hkey_classes_root\excel.application\curver的名称为“default”excel,但在安装多个excel时,“default”的含义不明确。如果您不在乎,您可以使用这个默认值,或者您可以根据自己的想法来决定选择什么,比如如果您想要最大的Excel版本或者最小的版本或者其他什么版本。

    然后,对于每个特定的Excel分支,您应该阅读 默认密钥 它的CLSID支行。 喜欢 HKEY_CLASSES_ROOT\Excel.Application.15\CLSID 无命名密钥等于 {00024500-0000-0000-C000-000000000046} -将该索引提取到字符串变量。

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

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

    最后一个结果是命令行。它以文件名开头(本例中不带引号,但可以用引号括起来),后面跟着可选的命令行。 您不需要命令行,所以您必须提取初始的逗号ind,引用与否。

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