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

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

什么曾经工作:

// Get the program associated with workbooks, eg "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' 

(我总是感到有趣的是,在一个不安全的registry项中安全级别是多年的…)

在Office 2010中,.xls文件现在与“”Microsoft Application Virtualization DDE Launcher“或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'))

您可以使用相同的registry位置来获取已安装的Excel版本,即此函数使用的位置。 基本上你必须克隆functionregistry代码的很大一部分。 你可以通过像Microsoft Process Monitor这样的工具来监视这个函数调用,看看Windows如何查找已安装的Excel,然后以完全相同的方式执行。

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

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

但在另一个工作站上,我安装了Excel 2003和Excel 2010,testing了这两个不同的XLSX实现,所以我有两个registry项。

HKEY_CLASSES_ROOT \ Excel.Application.12 HKEY_CLASSES_ROOT \ Excel.Application.14

所以,你必须枚举所有那些名字,点号和数字的分支。

注意:关键HKEY_CLASSES_ROOT \ Excel.Application \ CurVer将具有“默认”Excel的名称,但是当安装多个Excels时,“default”意思是不明确的。 如果你不在意,你可以采取这个默认值,或者你可以根据自己的想法决定select什么,比如你想要最大的Excel版本还是最小的。

然后,当为每个特定的Excel分支,你应该读取其CLSID子分支的默认密钥 。 像HKEY_CLASSES_ROOT\Excel.Application.15\CLSID具有等于{00024500-0000-0000-C000-000000000046}键 – 将该索引提取到stringvariables。

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

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

最后的结果是命令行。 它以一个文件名开始(在这个例子中不用引号,但可以用引号括起来),然后是可选的命令行。 你不需要命令行,所以你必须提取最初的commanlind,引用或不。

然后你必须检查是否存在这样的exe文件。 如果确实如此 – 则可以启动它,如果不是,则检查其他Excel版本的registry。