Форум: "Прочее";
Текущий архив: 2015.04.12;
Скачать: [xml.tar.bz2];
ВнизТек. версия для OLE-объекта. Как определить? Найти похожие ветки
← →
ТимоховДА (2014-08-27 13:43) [0]Здравствуйте!
Я все с екселем борюсь. В частности, с определением версии.
1. Суть. Есть машина у пользователя, где стоит Excel 2003 и 2010, но
ключ [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Excel.Application\CurVer] равен Excel.Application.11, что значит, что Excel.Application соответствует объекту от 2003 версии.
2. Вопрос. Есть ли в Windows какая-то функция, которая возвратит для имени класса Excel.Application какому конкретно классу этот класс соответствует?
(понимаю, что можно в реестр залезть, но, может, без реестра как-то?).
Спасибо!
← →
junglecat (2014-08-27 14:01) [1]App.Version ?
← →
ТимоховДА (2014-08-27 18:23) [2]
> junglecat (27.08.14 14:01) [1]
> App.Version ?
А это где?
← →
junglecat (2014-08-27 18:30) [3]у объекта ExcelApplication разве нету такого?
← →
Rouse_ © (2014-08-27 19:41) [4]
> 2. Вопрос. Есть ли в Windows какая-то функция, которая возвратит
> для имени класса Excel.Application какому конкретно классу
> этот класс соответствует?
Дич, зря ты в реестр лезешь - гиблый путь, сам столько шишек на нем набил. Работай примерно так:function TSysInfoOSData.GetOfficesVersions: string;
procedure Add(const Value: string);
begin
if Result = "" then
Result := " - " + Value
else
Result := Result + sLineBreak + " - " + Value;
end;
var
V, V1: Variant;
begin
Result := "";
CoInitialize(nil);
try
V := CreateOleObject("Excel.Application");
Add("Microsoft Excel " + V.Version + " установлен корректно.");
except
Add("Microsoft Excel отсутствует.");
end;
V := 0;
try
V := CreateOleObject("Word.Application");
Add("Microsoft Word " + V.Version + " установлен корректно.");
except
Add("Microsoft Word отсутствует.");
end;
V := 0;
try
V := CreateOleObject("com.sun.star.ServiceManager");
V1 := V.CreateInstance("com.sun.star.frame.Desktop");
Add("Open Office установлен корректно.");
except
Add("Open Office отсутствует.");
end;
end;
← →
ТимоховДА (2014-08-27 19:41) [5]Ну, для этого его надо создать. Не хотелось бы. При запуске морей Программы надо определить версию Excel. Получается, надо каждый раз при старте создавать объект Excel. Как бы, можно. Но не хотелось бы. Наверняка из темы COM/OLE есть что-то из штатных функций Windows.
Накрайняк полезу в реестр.
← →
Rouse_ © (2014-08-27 19:42) [6]
> Накрайняк полезу в реестр.
ЗЫ: ну а реньше я эту беду вот так получал (говнокод как есть)//function TSysInfoOSData.GetOfficesVersions: string;
//const
// Masks: array [0..9] of string =
// ("{????????-6000-*",
// "{????????-78E1-*",
// "{????????-0011-*",
// "{????????-0012-*",
// "{????????-0013-*",
// "{????????-0014-*",
// "{????????-002E-*",
// "{????????-002F-*",
// "{????????-0030-*",
// "{????????-00CA-*");
// OO = "{5C2F4253-6243-45CD-BE1D-C80409788370}";
//var
// TmpName, TmpVer: string;
// KeyNames: TStringList;
// I, A: Integer;
//begin
// Result := "";
// KeyNames := TStringList.Create;
// try
// with TRegistry.Create do
// try
// RootKey := HKEY_LOCAL_MACHINE;
// if OpenKeyReadOnly("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\") then
// GetKeyNames(KeyNames)
// else
// Exit;
// finally
// Free;
// end;
//
// for I := 0 to KeyNames.Count - 1 do
// for A := 0 to 9 do
// if MatchesMask(KeyNames.Strings[I], Masks[A]) then
// begin
// with TRegistry.Create do
// try
// RootKey := HKEY_LOCAL_MACHINE;
// if OpenKeyReadOnly("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + KeyNames.Strings[I]) then
// begin
// TmpName := ReadString("DisplayName");
// if Pos("update", LowerCase(TmpName)) > 0 then
// Continue;
// TmpVer := ReadString("DisplayVersion");
// if Trim(TmpVer) <> "" then
// Result := Result + sLineBreak + " - " + TmpName + ", версия " + TmpVer
// else
// Result := Result + sLineBreak + " - " + TmpName;
// end;
// finally
// Free;
// end;
// end;
// finally
// KeyNames.Free;
// end;
//
// // OO
// with TRegistry.Create do
// try
// RootKey := HKEY_LOCAL_MACHINE;
// if OpenKeyReadOnly("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + OO) then
// begin
// TmpName := ReadString("DisplayName");
// TmpVer := ReadString("DisplayVersion");
// if Trim(TmpVer) <> "" then
// Result := Result + sLineBreak + " - " + TmpName + ", версия " + TmpVer
// else
// Result := Result + sLineBreak + " - " + TmpName;
// end;
// finally
// Free;
// end;
//
// if Result = "" then
// Result := sLineBreak + " - Не установленны.";
//end;
← →
junglecat (2014-08-27 19:44) [7]> из темы COM/OLE есть что-то из штатных функций Windows
ну а как можно узнать версию ком-сервера, не спрашивая у него самого?
только залезть в реестр, либо вытащить версию соответствующей dll
← →
ТимоховДА (2014-08-27 19:46) [8]
> Дич, зря ты в реестр лезешь - гиблый путь, сам столько шишек
> на нем набил. Работай примерно так:
В общем, придется создавать объект Excel.
Шишки Розыча признаю своими))))
ЗЫ. Я с этим екселем офигел уже. Раньше тему создавал, что чтение долгое. Вот оказывается, какая-то с..ка создает этот файл (контрагент седьмого колена наших партнеров - т.е. источник не найдешь). И фиг поймешь - почему конкретный файл XLSX так тормозит. Пересохранил - все летает. Чудны пути Excel.
ЗЗЫ
Я бы утопил программиста за использование Result от вышестоящей функции в процедуре.procedure Add(const Value: string);
begin
if Result = "" then
Result := " - " + Value
else
Result := Result + sLineBreak + " - " + Value;
end;
Лично!
← →
ТимоховДА (2014-08-27 19:48) [9]
> junglecat (27.08.14 19:44) [7]
> > из темы COM/OLE есть что-то из штатных функций Windows
>
> ну а как можно узнать версию ком-сервера, не спрашивая у
> него самого?
> только залезть в реестр, либо вытащить версию соответствующей
> dll
Я просто предположил, что если CreateOleObject как-то просасывает какой конкретно объект создавать (Excel.Application.11 или 14), то может быть есть функция, которая для generic-имени дает конкретное имя. Вот.
← →
Rouse_ © (2014-08-27 19:58) [10]
> Я бы утопил программиста за использование Result от вышестоящей
> функции в процедуре.
Стандартный подход, темболе мыж строку возвращаем - а это тупо удобство для накопилки резалта :)
> Лично!
Приезжай - утопи меня :) Мне хейнекен, если че :)
← →
brother © (2014-08-27 20:32) [11]> Я бы утопил программиста за использование Result от вышестоящей
> функции в процедуре.
да вроде ниче страшного не вижу... съэкономили на оной локальной переменной...
← →
Jeer © (2014-08-27 20:36) [12]>Приезжай - утопи меня :)
Я тоже приеду :)
← →
Rouse_ © (2014-08-27 20:43) [13]Удалено модератором
← →
ТимоховДА (2014-08-28 01:36) [14]За информацию по Excel благодарю.
За Result утопил бы. Спорить не хочу. Вырос)))))
Про пиво понял))))
← →
имя (2014-08-28 09:49) [15]Удалено модератором
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2015.04.12;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.002 c