Delphi通过Registry检测Word版本

时间:2011-07-20 10:59:20

标签: delphi ms-word operating-system registry

我刚刚添加了这个函数,它决定了使用哪种mailmerge方法。它似乎适用于XP和Windows 2000.它有什么理由不适用于NT,Vista,7和其他Windows版本?我认为注册表会出现问题吗?

function GetMSOfficeVersion: String;
var Reg: TRegistry;
begin
Result := 'Office Version Not Found';
// create the registry object
Reg := TRegistry.Create;
try
// set the root key
Reg.RootKey := HKEY_LOCAL_MACHINE;
// check for Office97
if Reg.OpenKey('\SOFTWARE\Microsoft\Office\8.0', False) then
begin
Result := 'Microsoft Office97';
end;
// check for Office2000
if Reg.OpenKey('\SOFTWARE\Microsoft\Office\9.0', False) then
begin
Result := 'Microsoft Office2000';
end;
// check for OfficeXP -- not sure if this is correct
// you have to verify the key on a machine with OfficeXP
if Reg.OpenKey('\SOFTWARE\Microsoft\Office\10.0', False) then
begin
Result := 'Microsoft OfficeXP(regkey10)';
end;
// check for 11.0
if Reg.OpenKey('\SOFTWARE\Microsoft\Office\11.0', False) then
begin
Result := 'Microsoft OfficeXP(regkey11)';
end;
// check for 12
if Reg.OpenKey('\SOFTWARE\Microsoft\Office\12.0', False) then
begin
Result := 'Microsoft Office2010';
end;
finally
// make sure we free the object we created
Reg.Free;
end;
end;

3 个答案:

答案 0 :(得分:6)

可能没有足够的特权。尝试使用OpenKeyReadOnly代替OpenKey

答案 1 :(得分:2)

除了确保以只读模式创建注册表之外,就像TOndrej建议的那样,您还需要修复该代码中的版本匹配,因为它是 错误 < / strong>即可。

以下是代码片段中事物变得阴暗的部分的正确数字:

10.0 = Office XP
11.0 = Office 2003
12.0 = Office 2007
13.0 - doesn't exist, obvious Microsoft/US numbering standards.
14.0 = Office 2010

答案 2 :(得分:1)

“有什么理由不起作用”

是的,单个产品可能会创建Software\Office\#.0条目,您应该检查特定版本密钥中的Word子项。即便如此,f.i。 “Word Viewer”可能创建了Word子项,该子项不会进行邮件合并。如果您真的想使用注册表,请更好地查找HKEY_CLASSES_ROOT中的Word.Application个键。除Word.Application.#个密钥外,Word.Application密钥本身还有一个CurVer子密钥。


(之前我建议如下,但我认为福克斯对这个问题的评论要好得多。)

我会直接尝试创建自动化对象,如果失败则该版本不可用,则回退到较低版本。或者......像:

function IsWord14: Boolean;
begin
  Result := True;
  try
    CreateOleObject('Word.Application.14');
  except on E:EOleSysError do
    if E.ErrorCode = HRESULT($800401F3) then  // invalid class string
      Result := False
    else
      raise;
  end;
end;