题
微软最近打破了我们的长期(并正式推荐)代码,以阅读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版本。