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开始的所有版本?
答案 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版本。