Delphi Detect Word версия через реестр - PullRequest
1 голос
/ 20 июля 2011

Я только что добавил эту функцию, которая определяет, какой метод 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 ]

6 голосов
/ 20 июля 2011

Возможно, недостаточно прав.Попробуйте использовать OpenKeyReadOnly вместо OpenKey.

2 голосов
/ 20 июля 2011

Помимо необходимости создания реестра в режиме только для чтения, как предлагает TOndrej, вы также захотите исправить совпадение версий в этом коде, поскольку оно неверно .

Вот правильные числа для частей, где вещи становятся неясными в вашем фрагменте кода:

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
1 голос
/ 20 июля 2011

«Есть ли причина, по которой это не сработает»

Да, отдельные продукты могут создавать запись Software\Office\#.0, вы должны проверить наличие ключа Word в ключе конкретной версии. Даже тогда, например «Word Viewer», возможно, создал подраздел Word, который не будет выполнять слияние почты. Если вы действительно хотите пойти с реестром, лучше поищите ключи Word.Application в HKEY_CLASSES_ROOT. Помимо клавиш 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;
...