我刚刚添加了这个函数,它决定了使用哪种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;
答案 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;