Ms office 需要通过编程检测安装了哪个版本的MS Office而没有误报/否定

Ms office 需要通过编程检测安装了哪个版本的MS Office而没有误报/否定,ms-office,version,inno-setup,Ms Office,Version,Inno Setup,我需要一种一直有效的方法,而不仅仅是大多数时候 到目前为止,我一直在使用检查“HKLM\Software\Microsoft\Office\14.0\Word\InstallRoot”注册表项是否存在的方法(此处14.0代表Word 2010) 然而,我最近有一个假阴性,一个安装了Word 2010但没有密钥的用户。他的注册表有HKLM\Software\Microsoft\Office\14.0\Word,但没有HKLM\Software\Microsoft\Office\14.0\Word\

我需要一种一直有效的方法,而不仅仅是大多数时候

到目前为止,我一直在使用检查“HKLM\Software\Microsoft\Office\14.0\Word\InstallRoot”注册表项是否存在的方法(此处14.0代表Word 2010)

然而,我最近有一个假阴性,一个安装了Word 2010但没有密钥的用户。他的注册表有HKLM\Software\Microsoft\Office\14.0\Word,但没有HKLM\Software\Microsoft\Office\14.0\Word\InstallRoot。这导致我的程序安装了一个旧版本的工具栏,该工具栏没有针对功能区界面进行优化

我也有一个误报,一个用户以前安装了Word 2007,但后来卸载了它,并用Word 2003替换了它。但Office 2007中的注册表项到处都是,这愚弄了我的安装程序,它安装了一个工具栏,该工具栏针对功能区进行了优化,但在Word 2003中根本无法加载

那么,有没有更好的方法来检测Office的版本呢?

获取Word的“活动”版本的一种方法是请求当前注册的自动化服务器的版本,而不考虑以前的安装/不完整的安装

[Code]
function WordVer(dummy: String): String;
var
  Obj: Variant;
begin
  try
    Obj := CreateOleObject('Word.Application');
    Result := Obj.Version;
    Obj.Quit(False);
  except
    RaiseException('not installed');
  end;
end;

使用脚本常量
{code:WordVer}
获取版本字符串(
12.0
等)。

只有一个问题,文档中说CreateOleObject可能会引发异常,但我不知道Inno设置中如何处理异常,或者如果没有异常会发生什么。我应该担心这种情况吗?如果出现错误,RaiseException应该停止安装,您可以使用无效的progid进行测试<代码>CreateOleObject('Cheese.Cake')