Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.10;
Скачать: CL | DM;

Вниз

Как узнать версию Office?   Найти похожие ветки 

 
Валера   (2009-01-26 14:34) [0]

Версию узнаю нормально, через реестр. Но может кто подскажет какая именно установлена;
Proffesional
Standart
Basic Edition


Еще проблема если установлено два одинаковых офиса (Proffesional и Basic Edition), как находить оба.


function IS_OXP_Installed: Boolean;
var
 Reg: TRegistry;
begin
 Reg := TRegistry.Create;
 try
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   Result      := Reg.KeyExists("SOFTWARE\MICROSOFT\Office\10.0\Registration");
 finally
   Reg.CloseKey;
   Reg.Free;
 end;
 DN  := ""; // Holds the Office XP Product Display Name
 PID := ""; // Holds the Office XP Product ID
end;

function View_OXP_Key: string;
begin
 try
   Reg         := TRegistry.Create;
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   KeyName     := "SOFTWARE\MICROSOFT\Office\10.0\Registration\";
   Reg.OpenKeyReadOnly(KeyName);
   temp := TStringList.Create;
   Reg.GetKeyNames(temp); // Enumerate and hold the Office XP Product(s) Key Name(s)
   Reg.CloseKey;
   SubKeyName  := temp.Strings[0]; // Hold the first Office XP Product Key Name
   Reg         := TRegistry.Create;
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   KeyName2    := "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\";
   Reg.OpenKeyReadOnly(KeyName2 + SubKeyName);
   DN := (Reg.ReadString("DisplayName"));
   Reg.CloseKey;
 except
   on E: EStringListError do
     Exit
 end;
 try
   if Reg.OpenKeyReadOnly(KeyName + SubKeyName) then
   begin
     if Reg.GetDataType("DigitalProductId") = rdBinary then
     begin
       PID        := (Reg.ReadString("ProductID"));
       binarySize := Reg.GetDataSize("DigitalProductId");
       SetLength(HexBuf, binarySize);
       if binarySize > 0 then
       begin
         Reg.ReadBinaryData("DigitalProductId", HexBuf[0], binarySize);
       end;
     end;
   end;
 finally
   FreeAndNil(Reg);
 end;
 Result := "";
 Result := DecodeProductKey(HexBuf);
end;

function IS_O2K3_Installed: Boolean;
var
 Reg: TRegistry;
begin
 Reg := TRegistry.Create;
 try
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   Result      := Reg.KeyExists("SOFTWARE\MICROSOFT\Office\11.0\Registration");
 finally
   Reg.CloseKey;
   Reg.Free;
 end;
 DN  := ""; // Holds the Office 2003 Product Display Name
 PID := ""; // Holds the Office 2003 Product ID
end;

function View_O2K3_Key: string;
begin
 try
   Reg         := TRegistry.Create;
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   KeyName     := "SOFTWARE\MICROSOFT\Office\11.0\Registration\";
   Reg.OpenKeyReadOnly(KeyName);
   temp := TStringList.Create;
   Reg.GetKeyNames(temp);
   // Enumerate and hold the Office 2003 Product(s) Key Name(s)
   Reg.CloseKey;
   SubKeyName  := temp.Strings[0]; // Hold the first Office 2003 Product Key Name
   Reg         := TRegistry.Create;
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   KeyName2    := "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\";
   Reg.OpenKeyReadOnly(KeyName2 + SubKeyName);
   DN := (Reg.ReadString("DisplayName"));
   Reg.CloseKey;
 except
   on E: EStringListError do
     Exit
 end;
 try
   if Reg.OpenKeyReadOnly(KeyName + SubKeyName) then
   begin
     if Reg.GetDataType("DigitalProductId") = rdBinary then
     begin
       PID        := (Reg.ReadString("ProductID"));
       binarySize := Reg.GetDataSize("DigitalProductId");
       SetLength(HexBuf, binarySize);
       if binarySize > 0 then
       begin
         Reg.ReadBinaryData("DigitalProductId", HexBuf[0], binarySize);
       end;
     end;
   end;
 finally
   FreeAndNil(Reg);
 end;
 Result := "";
 Result := DecodeProductKey(HexBuf);
end;

function IS_O27_Installed: Boolean;
var
 Reg: TRegistry;
begin
 Reg := TRegistry.Create;
 try
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   Result      := Reg.KeyExists("SOFTWARE\MICROSOFT\Office\12.0\Registration");
 finally
   Reg.CloseKey;
   Reg.Free;
 end;
 DN  := ""; // Holds the Office 2000 Product Display Name
 PID := ""; // Holds the Office 2000 Product ID
end;

function View_O27_Key: string;
begin
 try
   Reg         := TRegistry.Create;
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   KeyName     := "SOFTWARE\MICROSOFT\Office\12.0\Registration\";
   Reg.OpenKeyReadOnly(KeyName);
   temp := TStringList.Create;
   Reg.GetKeyNames(temp);
   // Enumerate and hold the Office 2000 Product(s) Key Name(s)
   Reg.CloseKey;
   SubKeyName  := temp.Strings[0]; // Hold the first Office 2003 Product Key Name
   Reg         := TRegistry.Create;
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   KeyName2    := "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\";
   Reg.OpenKeyReadOnly(KeyName2 + SubKeyName);
   DN := (Reg.ReadString("DisplayName"));
   Reg.CloseKey;
 except
   on E: EStringListError do
     Exit
 end;
 try
   if Reg.OpenKeyReadOnly(KeyName + SubKeyName) then
   begin
     if Reg.GetDataType("DigitalProductId") = rdBinary then
     begin
       PID        := (Reg.ReadString("ProductID"));
       binarySize := Reg.GetDataSize("DigitalProductId");
       SetLength(HexBuf, binarySize);
       if binarySize > 0 then
       begin
         Reg.ReadBinaryData("DigitalProductId", HexBuf[0], binarySize);
       end;
     end;
   end;
 finally
   FreeAndNil(Reg);
 end;
 Result := "";
 Result := DecodeProductKey(HexBuf);
end;



   Begin
     if not IS_OXP_Installed then
   Begin
       if not IS_O2K3_Installed then
           Begin
             if not IS_O27_Installed then
             else
             Edit11.Text := View_O27_Key;
             Edit8.Text := DN;
           End
       else
           Edit11.Text := View_O2K3_Key;
           Edit8.Text := DN;
        end
     else
      Edit11.Text := View_OXP_Key;
      Edit8.Text := DN;
    end;


 
KSergey ©   (2009-01-26 16:54) [1]

> Валера   (26.01.09 14:34)  
> Proffesional
> Standart
> Basic Edition

А офис сам об этом знает? Строчка в реестре - есть, текстовая, локализованная в Office\Registration\<GUID>\ProductName (и ProductNameBrand). Одинаков ли <GUID> для разных установлк - не знаю. Вариант только поустанавливать разные редакции и посмотреть, может что будет. Но так ли важно на самом деле? Что за задача?
А вот проверить установленность конкретной компоненты, нужной для работы вашей программы - это можно, но это другой вопрос.

> Еще проблема если установлено два одинаковых офиса (Proffesional и Basic Edition), как находить оба.

Одной версии?? Так не бывает.
Ну т.е. можно накатать, наверное, но это ж будет каша и лажа, зачем ее определять?


 
Валера   (2009-01-27 06:27) [2]

Одинаков ли <GUID> для разных установлк - не знаю.
<GUID> разный но как его переберать перебором реестра???

Одной версии?? Так не бывает.
Бывает на компе стоял ломанный Proffesional, его удалили и поставили Basic Edition. При удалении он реестр не трогает и остаются ветви
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Registration\{90120000-0030-0000-0000-0000000FF1CE}


 
KSergey ©   (2009-01-27 09:10) [3]

А какая вообще задача-то? Она именно проверить установленность через рест?

А вообще, т.к. офис вполне себе нормальная система и устанавливается в систему грамотно - то, думаю, правильный путь искать установленные программы и их компоненты. Да да, то, что видно через установка/удаление программ.
Функций для енумерирования MSI-компонент с лету не подскажу, ну да разыщется, думаю.


 
Валера   (2009-01-27 11:49) [4]

Задача узнать какой офис установлен и узнать какой ключ!
Делаю я это через реестр. Все получилось нормуль.
Но впроге был обнаружен такой баг как к примеру:
Если на комп ставили офис Proffesional, затем его удалили и поставили такой же офис только Basic Edition.
То прога выдает офис Proffesional

Все это происходит из за повторяющегося ключа, точнее из за части выделенной черным.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Registration\{90120000-0030-0000-0000-0000000FF1CE}
То есть появляются две записи как {90120000-0030-0000-0000-0000000FF1CE}

Пришел к одному варианту перебирать ветку HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Registration и искать параметр DigitalProductID (ключ продукта).
Но как перебирать реестр?? Или организовать поиск параметра DigitalProductID в указанной ветке??


 
KSergey ©   (2009-01-27 11:57) [5]

> Валера   (27.01.09 11:49) [4]
> Но как перебирать реестр??

TRegistry.GetValueNames

Ну и вапще посмотрите методы TRegistry, много полезного.
К стати, т.к. вам требуется только читать из реестра - открывайте его только на чтение. А то ваша поделка взорвется в первом же случае нормально настроенных прав.

PS
А вы не из отдела по борьбе с пиратством, случайно?


 
Валера   (2009-01-27 12:23) [6]


> PS
> А вы не из отдела по борьбе с пиратством, случайно?


=)
Нет просто в порядок организацию приводим


 
Anatoly Podgoretsky ©   (2009-01-27 13:47) [7]

> KSergey  (27.01.2009 9:10:03)  [3]

То что видно через "установка/удаление программ" очень не надежный источник.


 
KSergey ©   (2009-01-27 15:12) [8]

> Anatoly Podgoretsky ©   (27.01.09 13:47) [7]
> То что видно через "установка/удаление программ" очень не надежный источник.

Смотря что за задача. Например, по прошлой работе ставили свой продукт, который требовал наличия других продуктов. В setup проверяли как раз наличие необходимых компонент MSI.
Понятно, что тот прудукт мог и не работать (кончилась лицензия, пользователь потер половину exe-файлов и т.д.), но все ж некие precondition проверялись. Остальное отлавливалось во время работы своего приложения.


 
KSergey ©   (2009-01-27 15:16) [9]

Хотя в ситуации как у автора я бы поступил проще: приказ под роспись, что каждый проверил на своей машине в свойствах ворда какой он и номер лицензии. И если что не так или "дяди в погонах" найдут другой софт - то виноват тот, кто использует, контора "прикрывать" не будет.

Хотя, это в программерских конторах так делалось у нас; в "бухгалтерских" - может и правда проще "тихо". Правда не страхует от случая не по месту умного бухгалтера, в отличии от приказа.



Страницы: 1 вся ветка

Текущий архив: 2010.01.10;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
2-1258031503
kyn66
2009-11-12 16:11
2010.01.10
Строку в объект


15-1257800866
Алекс77
2009-11-10 00:07
2010.01.10
Вопрос про сериализацию...


15-1257707340
SergP
2009-11-08 22:09
2010.01.10
Реклама. Яндекс Директ и пр...


1-1233071230
harisma
2009-01-27 18:47
2010.01.10
Скролл в TreeView


2-1258407251
котэ
2009-11-17 00:34
2010.01.10
Рисование на окне полноэкранного приложения