Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2010.01.10;
Скачать: [xml.tar.bz2];

Вниз

Как узнать версию 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.004 c
4-1226515228
АгатаКристи
2008-11-12 21:40
2010.01.10
Настройка TCP/IP


15-1257939671
Раиса
2009-11-11 14:41
2010.01.10
Как построить график функции (9 класс школы)


3-1232612594
MacroDenS
2009-01-22 11:23
2010.01.10
Структурирование данных


8-1202382479
DVM
2008-02-07 14:07
2010.01.10
Детектор расфокусированного изображения.


15-1257627991
Омлет
2009-11-08 00:06
2010.01.10
Убойная статистика





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский