ADSL.Kirov.Ru

Сообщества => Программирование => Тема начата: zulus от 27 Март 2013, 08:00:19



Название: РЕШЕНО! определить какой MS Office
Отправлено: zulus от 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 тырнета под рукой нет.


Название: Re: определить какой MS Office
Отправлено: Blackman от 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";


Название: Re: определить какой MS Office
Отправлено: zulus от 27 Март 2013, 08:26:05
не прокатывает... я не пользуюсь компонентами, создаю объект:
Код:
Excel=Variant::CreateObject("Excel.Application");
а далее ОЛЕ процелурами открываю и добавляю.
про коды разных офисов знаю....

с реестром... хз где и как и есть сомнения по поводу прав юзверей на доступ к реестру...
хотя, может быть, через него... только где?


Название: Re: определить какой MS Office
Отправлено: Blackman от 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 или ...).


Название: Re: определить какой MS Office
Отправлено: zulus от 27 Март 2013, 08:36:46
Через реестр тоже много вариантов было.

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

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

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

во! в
Цитировать
HREY_CLASSES_ROOT раздел Word.Application ключ CurVer
Word.Application.12 (у меня)... пойду поюзаю юзверей ;)


Название: Re: определить какой MS Office
Отправлено: zulus от 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)... где я налажал?


Название: Re: определить какой MS Office
Отправлено: Blackman от 27 Март 2013, 11:11:43
CurVer - это тоже папка. А в ней значение по умолчанию надо прочитать.

что-то около:
Код:
    Reg->OpenKey("\\Excel.Application\CurVer", false);
    S = Reg->ReadString("");


Название: Re: определить какой MS Office
Отправлено: zulus от 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"


Название: Re: определить какой MS Office
Отправлено: Blackman от 27 Март 2013, 12:44:01
попробуй null вместо пустых кавычек может...


Название: Re: определить какой MS Office
Отправлено: zulus от 27 Март 2013, 12:49:02
попробуй null вместо пустых кавычек может...
достала эта "угадайка"... блин... не не помогло.
такое впечатление, что код вообще работает только до строчки  Reg->OpenKey....
ветку выбирает правильно, а дальше - нипанятна...
попробовал так:
Код:
Reg->OpenKey("\\Excel.Backup\\shell\\Open\\command", false);
    S = Reg->ReadString("command");
те же яйца, вид с боку. но параметр command в одноимённой папке существует!!! т.е. у меня пошто-то тупо не хотит его читать....


Название: Re: определить какой MS Office
Отправлено: zulus от 27 Март 2013, 14:17:06
всё! это тупик:
Код:
if(Registry->KeyExists(KeyName)){ бла бла бла}
выполняет!!! следовательно, ключ видит, но значение читать не хочет! а это может означать, что у меня просто прав нет на то :(
блин! нужна новая идея...
как другим методом определить?
вся фигня заключается в том, что
Код:
Excel.OlePropertyGet("WorkBooks",1).OleFunction("SaveAs",addr.c_str());
сохранит документ, но его потом не открыть :(


Название: Re: определить какой MS Office
Отправлено: Shire от 29 Март 2013, 08:41:33
Лучший способ копаться в потрохах офиса - это нажать Alt+F11 и F2 :)

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


Название: Re: определить какой MS Office
Отправлено: zulus от 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 можно, конечно, прочитать версию... но в какой ??? да и не айс это ...


Название: Re: определить какой MS Office
Отправлено: Shire от 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".


Название: Re: определить какой MS Office
Отправлено: zulus от 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");
или я не прав?
тыкаться в слепую тяжко :(


Название: Re: определить какой MS Office
Отправлено: zulus от 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;


Название: Re: определить какой MS Office
Отправлено: Shire от 29 Март 2013, 13:36:40
узнать ... это будет нечто типа:
Код:
ххх = Excel.OleProcedure("Version");
или я не прав?
Не прав. Version - свойство, следовательно, должно быть как-то так:
Код:
Excel.OlePropertyGet("Version");
Вообще я б порекомендовал использовать более дружелюбные и прямые средства, нежели деБилдер, например, директиву #import в Visual C++, либо interop в C#.


Название: Re: определить какой MS Office
Отправлено: zulus от 29 Март 2013, 13:54:05
Не прав. Version - свойство, следовательно, должно быть как-то так:
Код:
Excel.OlePropertyGet("Version");
Вообще я б порекомендовал использовать более дружелюбные и прямые средства, нежели деБилдер, например, директиву #import в Visual C++, либо interop в C#.
*thank_you*
я уже раскланялся чуть выше.
по поводу дибилдера... кхм.. спорить не буду, но остановлю лишь встречным вопросом:
как ты думаешь, почему я полез узнавать какой офис, почему намекнул про права доступа к реестру...?
у меня как в том анекдоте - жри чо дают )))
так что вот так что.


Powered by SMF | SMF © 2006-2017, Simple Machines LLC
© 2006-2017 Разработчики сайта Инициативная группа пользователей.
При технической поддержке ОАО “Ростелеком”.