如何获得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。