![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать версию Office? [D6, WinXP]
Валера © (2009-01-26 14:34:00)Версию узнаю нормально, через реестр. Но может кто подскажет какая именно установлена;
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-27 15:16:00) [1]Хотя в ситуации как у автора я бы поступил проще: приказ под роспись, что каждый проверил на своей машине в свойствах ворда какой он и номер лицензии. И если что не так или "дяди в погонах" найдут другой софт - то виноват тот, кто использует, контора "прикрывать" не будет.
Хотя, это в программерских конторах так делалось у нас; в "бухгалтерских" - может и правда проще "тихо". Правда не страхует от случая не по месту умного бухгалтера, в отличии от приказа.
KSergey (2009-01-27 15:12:00) [2]> Anatoly Podgoretsky © (27.01.09 13:47) [7]
> То что видно через "установка/удаление программ" очень не надежный источник.
Смотря что за задача. Например, по прошлой работе ставили свой продукт, который требовал наличия других продуктов. В setup проверяли как раз наличие необходимых компонент MSI.
Понятно, что тот прудукт мог и не работать (кончилась лицензия, пользователь потер половину exe-файлов и т.д.), но все ж некие precondition проверялись. Остальное отлавливалось во время работы своего приложения.
Anatoly Podgoretsky (2009-01-27 13:47:00) [3]> KSergey (27.01.2009 9:10:03) [3]
То что видно через "установка/удаление программ" очень не надежный источник.
Валера (2009-01-27 12:23:00) [4]
> PS
> А вы не из отдела по борьбе с пиратством, случайно?
=)
Нет просто в порядок организацию приводим
KSergey (2009-01-27 11:57:00) [5]> Валера (27.01.09 11:49) [4]
> Но как перебирать реестр??
TRegistry.GetValueNames
Ну и вапще посмотрите методы TRegistry, много полезного.
К стати, т.к. вам требуется только читать из реестра - открывайте его только на чтение. А то ваша поделка взорвется в первом же случае нормально настроенных прав.
PS
А вы не из отдела по борьбе с пиратством, случайно?
Валера (2009-01-27 11:49:00) [6]Задача узнать какой офис установлен и узнать какой ключ!
Делаю я это через реестр. Все получилось нормуль.
Но впроге был обнаружен такой баг как к примеру:
Если на комп ставили офис 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 09:10:00) [7]А какая вообще задача-то? Она именно проверить установленность через рест?
А вообще, т.к. офис вполне себе нормальная система и устанавливается в систему грамотно - то, думаю, правильный путь искать установленные программы и их компоненты. Да да, то, что видно через установка/удаление программ.
Функций для енумерирования MSI-компонент с лету не подскажу, ну да разыщется, думаю.
Валера (2009-01-27 06:27:00) [8]Одинаков ли <GUID> для разных установлк - не знаю.
<GUID> разный но как его переберать перебором реестра???
Одной версии?? Так не бывает.
Бывает на компе стоял ломанный Proffesional, его удалили и поставили Basic Edition. При удалении он реестр не трогает и остаются ветви
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Registration\ {90120000-0030-0000-0000-0000000FF1CE}
KSergey (2009-01-26 16:54:00) [9]> Валера (26.01.09 14:34)
> Proffesional
> Standart
> Basic Edition
А офис сам об этом знает? Строчка в реестре - есть, текстовая, локализованная в Office\Registration\<GUID>\ProductName (и ProductNameBrand). Одинаков ли <GUID> для разных установлк - не знаю. Вариант только поустанавливать разные редакции и посмотреть, может что будет. Но так ли важно на самом деле? Что за задача?
А вот проверить установленность конкретной компоненты, нужной для работы вашей программы - это можно, но это другой вопрос.
> Еще проблема если установлено два одинаковых офиса (Proffesional и Basic Edition), как находить оба.
Одной версии?? Так не бывает.
Ну т.е. можно накатать, наверное, но это ж будет каша и лажа, зачем ее определять?