Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1401904539
colombo
2014-06-04 21:55
2015.04.12
Реверсинг программы


15-1409171402
Юрий
2014-08-28 00:30
2015.04.12
С днем рождения ! 28 августа 2014 четверг


15-1409494087
Пит
2014-08-31 18:08
2015.04.12
Игры


15-1409776203
Юрий
2014-09-04 00:30
2015.04.12
С днем рождения ! 4 сентября 2014 четверг


15-1409725120
alexdn
2014-09-03 10:18
2015.04.12
Заявление в ОВД





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский