Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти

 
Расширенный поиск

800919 Сообщений в 11258 Тем- от 88245 Пользователей - Последний пользователь: Shnur43

11 Апрель 2021, 06:19:38
ADSL.Kirov.RuСообществаПрограммирование (Модератор: Ivanidze)Тема: РЕШЕНО! определить какой MS Office
Страниц: 1 2 [Все]   Вниз
Печать
Автор Тема: РЕШЕНО! определить какой MS Office  (Прочитано 2017 раз)
zulus
Ветеран
*****
Пол: Мужской
Сообщений: 3089



« : 27 Март 2013, 08:00:19 »

подскажите как определить какой пакет офиса установлен?
выкидываю в Excell данные посредством OLE и заколебался уделать так:
Код:
        if(user = имя юзера)
             Excel.OlePropertyGet("WorkBooks",1).OleFunction("SaveAs",addr.c_str());
        else Excel.OlePropertyGet("WorkBooks",1).OleFunction("SaveAs",addr.c_str(),56);
как видно, тут определяю по юзверю, зная заведомо что у него стоит: первая строка в выборе - Офис до 2007 года, вторая (после else )моложе...
но это ж не правильно Грустный
PS тырнета под рукой нет.
« Последнее редактирование: 29 Март 2013, 13:09:15 от zulus » Записан

Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
Blackman
Администратор
*****
Пол: Мужской
Сообщений: 1513



WWW
« Ответ #1 : 27 Март 2013, 08:11:26 »

DelphiMaster рекомендуют способ

Код:
ExcelApplication1: TExcelApplication;
...
ShowMessage(ExcelApplication1.Version[0]);

Но это очевидно в случае использования компонента, через что сделано у тебя - я не в курсе.

Рядом же:

Код:
MsgBox "Welcome to Microsoft Excel version " & _
    Application.Version & " running on " & _
    Application.OperatingSystem & "!"

но язык уже другой, да

Расшифровка их нумерации:
14: officeVersion = "2010";
12: officeVersion = "2007";
11: officeVersion = "2003";
10: officeVersion = "XP";
9:  officeVersion = "2000";
8:  officeVersion = "97";
7:  officeVersion = "95";
« Последнее редактирование: 27 Март 2013, 08:14:49 от Blackman » Записан

что-нибудь жизнеутверждающее

zulus
Ветеран
*****
Пол: Мужской
Сообщений: 3089



« Ответ #2 : 27 Март 2013, 08:26:05 »

не прокатывает... я не пользуюсь компонентами, создаю объект:
Код:
Excel=Variant::CreateObject("Excel.Application");
а далее ОЛЕ процелурами открываю и добавляю.
про коды разных офисов знаю....

с реестром... хз где и как и есть сомнения по поводу прав юзверей на доступ к реестру...
хотя, может быть, через него... только где?
« Последнее редактирование: 27 Март 2013, 08:28:10 от zulus » Записан

Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
Blackman
Администратор
*****
Пол: Мужской
Сообщений: 1513



WWW
« Ответ #3 : 27 Март 2013, 08:32:31 »

Через реестр тоже много вариантов было.

А так OLE-объекты в Delphi вроде же дают подсказки свойств и методов - чисто по названию посмотреть не пробовал?

Цитировать
vVarApp=CreateOleObject("Excel.Application");

Можно видеть у отдельных авторов в некоторых примерах конструкцию вида Excel.Application.9 и т.п. , что не является обязательным, а скорее всего и вредным - ориентация будет на конкретную библиотеку *.olb. Без указания версии Offise приложение берет ее из реестра (HREY_CLASSES_ROOT раздел Word.Application ключ CurVer, там можно прочитать Excel.Application.8 или Excel.Application.9 или ...).
« Последнее редактирование: 27 Март 2013, 08:35:00 от Blackman » Записан

что-нибудь жизнеутверждающее

zulus
Ветеран
*****
Пол: Мужской
Сообщений: 3089



« Ответ #4 : 27 Март 2013, 08:36:46 »

Через реестр тоже много вариантов было.

А так OLE-объекты в Delphi вроде же дают подсказки свойств и методов - чисто по названию посмотреть не пробовал?

в реестре мне подсказали уже где )):
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office

а подсказок билдер не даёт ... зараза, вернее нужных нет... чиортовы ОЛЕ Улыбка

во! в
Цитировать
HREY_CLASSES_ROOT раздел Word.Application ключ CurVer
Word.Application.12 (у меня)... пойду поюзаю юзверей Подмигивающий
« Последнее редактирование: 27 Март 2013, 08:40:14 от zulus » Записан

Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
zulus
Ветеран
*****
Пол: Мужской
Сообщений: 3089



« Ответ #5 : 27 Март 2013, 10:28:49 »

апну сам...
вот ветка с версией екселя: HKEY_CLASSES_ROOT\Excel.Application\CurVer
вот так я делаю:
Код:
#include "registry.hpp"
...
   String S;
   TRegistry *Reg = new TRegistry;
    Reg->RootKey = HKEY_CLASSES_ROOT;
    Reg->OpenKey("\\Excel.Application", false);
    S = Reg->ReadString("CurVer");
    Memo1->Lines->Add("1  " + S );
   delete Reg;
и нифигашечки (S == NULL)... где я налажал?
Записан

Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
Blackman
Администратор
*****
Пол: Мужской
Сообщений: 1513



WWW
« Ответ #6 : 27 Март 2013, 11:11:43 »

CurVer - это тоже папка. А в ней значение по умолчанию надо прочитать.

что-то около:
Код:
    Reg->OpenKey("\\Excel.Application\CurVer", false);
    S = Reg->ReadString("");
« Последнее редактирование: 27 Март 2013, 11:15:34 от Blackman » Записан

что-нибудь жизнеутверждающее

zulus
Ветеран
*****
Пол: Мужской
Сообщений: 3089



« Ответ #7 : 27 Март 2013, 12:21:43 »

CurVer - это тоже папка. А в ней значение по умолчанию надо прочитать.

что-то около:
Код:
    Reg->OpenKey("\\Excel.Application\CurVer", false);
    S = Reg->ReadString("");
не работает...
Reg->ReadString("") - пробовал в кавычки вписывать "Значение", "Value0-1-2-3"... короч, метод тыка не проходит...
Грустный
прикольно... сохранил этот ключ на диске.. вот как он выглядит:
Цитировать
[HKEY_CLASSES_ROOT\Excel.Application\CurVer]
@="Excel.Application.12"
« Последнее редактирование: 27 Март 2013, 12:31:28 от zulus » Записан

Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
Blackman
Администратор
*****
Пол: Мужской
Сообщений: 1513



WWW
« Ответ #8 : 27 Март 2013, 12:44:01 »

попробуй null вместо пустых кавычек может...
Записан

что-нибудь жизнеутверждающее

zulus
Ветеран
*****
Пол: Мужской
Сообщений: 3089



« Ответ #9 : 27 Март 2013, 12:49:02 »

попробуй null вместо пустых кавычек может...
достала эта "угадайка"... блин... не не помогло.
такое впечатление, что код вообще работает только до строчки  Reg->OpenKey....
ветку выбирает правильно, а дальше - нипанятна...
попробовал так:
Код:
Reg->OpenKey("\\Excel.Backup\\shell\\Open\\command", false);
    S = Reg->ReadString("command");
те же яйца, вид с боку. но параметр command в одноимённой папке существует!!! т.е. у меня пошто-то тупо не хотит его читать....
« Последнее редактирование: 27 Март 2013, 13:10:06 от zulus » Записан

Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
zulus
Ветеран
*****
Пол: Мужской
Сообщений: 3089



« Ответ #10 : 27 Март 2013, 14:17:06 »

всё! это тупик:
Код:
if(Registry->KeyExists(KeyName)){ бла бла бла}
выполняет!!! следовательно, ключ видит, но значение читать не хочет! а это может означать, что у меня просто прав нет на то Грустный
блин! нужна новая идея...
как другим методом определить?
вся фигня заключается в том, что
Код:
Excel.OlePropertyGet("WorkBooks",1).OleFunction("SaveAs",addr.c_str());
сохранит документ, но его потом не открыть Грустный
Записан

Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
Shire
Ветеран
*****
Пол: Мужской
Сообщений: 1015



« Ответ #11 : 29 Март 2013, 08:41:33 »

Лучший способ копаться в потрохах офиса - это нажать Alt+F11 и F2 Улыбка

В частности, у объекта Application (скорее всего, у тебя он называется Excel) есть свойство Version. Оно возвращает строковое представление версии (например, для Office 2007 - "12.0").
А вот насчёт "сохраняется и не открывается" - у тебя, похоже, что-то неправильно написано, всё открывается.
Записан
zulus
Ветеран
*****
Пол: Мужской
Сообщений: 3089



« Ответ #12 : 29 Март 2013, 08:54:39 »

Лучший способ копаться в потрохах офиса - это нажать Alt+F11 и F2 Улыбка

В частности, у объекта Application (скорее всего, у тебя он называется Excel) есть свойство Version. Оно возвращает строковое представление версии (например, для Office 2007 - "12.0").
А вот насчёт "сохраняется и не открывается" - у тебя, похоже, что-то неправильно написано, всё открывается.
нене. не так понял меня!
1. надо без участия пользователя (ещё до открытия книги) определить как её (книгу) сохранять:
Код:
if(Офис 2003 или старше)
             Excel.OlePropertyGet("WorkBooks",1).OleFunction("SaveAs",addr.c_str());
        else Excel.OlePropertyGet("WorkBooks",1).OleFunction("SaveAs",addr.c_str(),56);
2. возможности покопаться в потрохах практически нет....!
3. не так-то всё и просто оказалось....

Код:
HKEY rKey;
unsigned char Reget[512];
DWORD RegetPath = sizeof(Reget);
if(RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"),0,KEY_ALL_ACCESS, &rKey) == ERROR_SUCCESS)
{
    LPBYTE res;
    RegQueryValueEx(rKey, TEXT("Desktop"), 0, 0, Reget, &RegetPath);
    RegCloseKey(rKey);
}
_tprintf("%s",Reget);
return 0;
интересная наколка, но снова в моём случае, в HKEY_CLASSES_ROOT хз как прочесть переменную "по умолчанию" (CurVer)
Грустный

PS В *.dll можно, конечно, прочитать версию... но в какой Непонимающий да и не айс это ...
« Последнее редактирование: 29 Март 2013, 08:57:32 от zulus » Записан

Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
Shire
Ветеран
*****
Пол: Мужской
Сообщений: 1015



« Ответ #13 : 29 Март 2013, 11:20:36 »

Похоже, это ты не понял.
Работа с Excel начинается с создания объекта Application.
У этого объекта есть свойство Version. В этом свойстве и находится информация о версии.
Для этого не нужно ни копаться в реестре (в котором могут быть недоеденные остатки от других офисов), ни открывать новый документ.
Причём, Application (если создавать по умолчанию, "Excel.Application") будет именно нужной, выбранной версии офиса.

UPD: если уж очень хочется слазить в реестр, лезь сюда:
Код:
HKEY_CLASSES_ROOT\Excel.Application\CurVer
Там в свойстве по умолчанию будет текущий ProgID Excel'я - для 2007 офиса - это "Excel.Application.12", для 2003 - "Excel.Application.11".
« Последнее редактирование: 29 Март 2013, 11:25:05 от Shire » Записан
zulus
Ветеран
*****
Пол: Мужской
Сообщений: 3089



« Ответ #14 : 29 Март 2013, 12:19:01 »

Похоже, это ты не понял.
Работа с Excel начинается с создания объекта Application.
У этого объекта есть свойство Version. В этом свойстве и находится информация о версии.
Для этого не нужно ни копаться в реестре (в котором могут быть недоеденные остатки от других офисов), ни открывать новый документ.
Причём, Application (если создавать по умолчанию, "Excel.Application") будет именно нужной, выбранной версии офиса.

UPD: если уж очень хочется слазить в реестр, лезь сюда:
Код:
HKEY_CLASSES_ROOT\Excel.Application\CurVer
Там в свойстве по умолчанию будет текущий ProgID Excel'я - для 2007 офиса - это "Excel.Application.12", для 2003 - "Excel.Application.11".
да, с реестром я уж совсем запарился...
покажи, плиз как мне тут:
Код:
Variant  Excel;
Excel=Variant::CreateObject("Excel.Application");
узнать ... это будет нечто типа:
Код:
ххх = Excel.OleProcedure("Version");
или я не прав?
тыкаться в слепую тяжко Грустный
Записан

Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
zulus
Ветеран
*****
Пол: Мужской
Сообщений: 3089



« Ответ #15 : 29 Март 2013, 13:08:52 »

ХА!
я - идиот!!!!
Blackman, Shire, я вас не слышал в упор!!!!
оказывается, самый первый мой попытк был правильным, вернее сказать, верный!!!:
вот
Код:
  try
  {
   vVarApp=CreateOleObject("Excel.Application");
   Label1->Caption = vVarApp.OlePropertyGet("Version");
  }
  catch(...)
  {
   MessageBox(0, "Ошибка открытия","Ошибка", MB_OK);
  return;
  }
всё, всем спасибо! эээх! сегодня ж ПЯТНИЦА!

вот кусок для определения конкретной версии:
Код:
case 14:
        officeVersion = "2010";
        break;
сase 12:
officeVersion = "2007";
break;
case 11:
officeVersion = "2003";
break;
case 10:
officeVersion = "XP";
break;
case 9:
officeVersion = "2000";
break;
case 8:
officeVersion = "97";
break;
case 7:
officeVersion = "95";
break;
default:
officeVersion = "Not Found";
        break;
« Последнее редактирование: 29 Март 2013, 13:31:46 от zulus » Записан

Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
Shire
Ветеран
*****
Пол: Мужской
Сообщений: 1015



« Ответ #16 : 29 Март 2013, 13:36:40 »

узнать ... это будет нечто типа:
Код:
ххх = Excel.OleProcedure("Version");
или я не прав?
Не прав. Version - свойство, следовательно, должно быть как-то так:
Код:
Excel.OlePropertyGet("Version");
Вообще я б порекомендовал использовать более дружелюбные и прямые средства, нежели деБилдер, например, директиву #import в Visual C++, либо interop в C#.
Записан
zulus
Ветеран
*****
Пол: Мужской
Сообщений: 3089



« Ответ #17 : 29 Март 2013, 13:54:05 »

Не прав. Version - свойство, следовательно, должно быть как-то так:
Код:
Excel.OlePropertyGet("Version");
Вообще я б порекомендовал использовать более дружелюбные и прямые средства, нежели деБилдер, например, директиву #import в Visual C++, либо interop в C#.
Спасибо
я уже раскланялся чуть выше.
по поводу дибилдера... кхм.. спорить не буду, но остановлю лишь встречным вопросом:
как ты думаешь, почему я полез узнавать какой офис, почему намекнул про права доступа к реестру...?
у меня как в том анекдоте - жри чо дают )))
так что вот так что.
Записан

Когда варишь людей в кипятке - первое время их можно не помешивать.Они делают это сами.
Страниц: 1 2 [Все]   Вверх
Печать
ADSL.Kirov.RuСообществаПрограммирование (Модератор: Ivanidze)Тема: РЕШЕНО! определить какой MS Office
Перейти в: