| Slon | 
|  Отправлено: 29.10.2004, 13:48 |  | 
| 
 Ученик-кочегар
 
 Группа: Участник
 Сообщений: 19
 
 
 
  
 | Прочитал в разделе уроков про вывод данных в Exel http://www.rxlib.ru/WinLesson/bles1.htm
 Создал dll-ку с кодом из урока, но программа не работает, т.е. работает но не запускает Exel.
 Т.е. срабатывает ловушка.
 try {
 App=Variant::GetActiveObject("Excel.Application");
 } catch(...) {
 // Excel не запущен — запустить его
 try { App=Variant::CreateObject("Excel.Application"); } catch (...) {
 Application->MessageBox("Невозможно открыть Microsoft Excel!"
 "Возможно Excel не установлен на компьютере.","Ошибка",MB_OK+MB_ICONERROR);
 } }
 Как сделать чтобы фунциклировало из dll-ки?
 Помогите плс.
 
 | 
|  | 
| Rius | 
| Отправлено: 29.10.2004, 13:59 |  | 
|  
 Мастер участка
 
 Группа: Участник
 Сообщений: 321
 
 
 
  
 | Здесь нет команд, чтобы окно делалось видимым. Может Excel запускается, но не показывается? | 
|  | 
| Slon | 
| Отправлено: 29.10.2004, 14:01 |  | 
| 
 Ученик-кочегар
 
 Группа: Участник
 Сообщений: 19
 
 
 
  
 | Дело в том что сработал catch. Следовательно ошибка в строке App=Variant::GetActiveObject("Excel.Application");
 | 
|  | 
| Rius | 
| Отправлено: 29.10.2004, 14:08 |  | 
|  
 Мастер участка
 
 Группа: Участник
 Сообщений: 321
 
 
 
  
 | У меня этот catch срабатывает, когда Excel не запущен. Оттого и ошибка, что нельзя получить доступ к объекту, отсутствующему в памяти. В обработчике происходит запуск Excel'я в CreateObject. | 
|  | 
| Rius | 
| Отправлено: 29.10.2004, 14:12 |  | 
|  
 Мастер участка
 
 Группа: Участник
 Сообщений: 321
 
 
 
  
 | В своей проге сделал такой код: 
 | CODE |  | //*.cpp
 //---------------------------------------------------------------------------
 
 
 void __fastcall TFormMain::ExcelInit(AnsiString FileName)
 {
 try
 {
 ExcelApp = Variant::GetActiveObject("Excel.Application");
 }
 catch(...)
 {
 try
 {
 ExcelApp = Variant::CreateObject("Excel.Application");
 }
 catch(...)
 {
 Application->MessageBox("Невозможно открыть Microsoft Excel!\nВозможно Excel не установлен на компьютере.","Ошибка",MB_OK|MB_ICONERROR);
 }
 }
 
 try
 {
 if(FileName != "")
 ExcelApp.OlePropertyGet("WorkBooks").OleProcedure("Open",FileName.c_str());
 else
 ExcelApp.OlePropertyGet("WorkBooks").OleProcedure("add");
 ExcelSh = ExcelApp.OlePropertyGet("WorkSheets", 1);
 }
 catch(...)
 {
 Application->MessageBox("Ошибка открытия книги Microsoft Excel!","Ошибка",MB_OK|MB_ICONERROR);
 }
 }
 
 | 
 *.h
 
 | CODE |  | private:
 void __fastcall ExcelInit(AnsiString FileName);
 Variant ExcelApp, ExcelSh;
 void __fastcall ToExcelCell(int Row, int Column, Variant Data);
 void __fastcall MakeExcelReport(void);
 void __fastcall ToExcelCell(int Row, int Column, AnsiString Str);
 Variant __fastcall FromExcelCell(int Row, int Column);
 
 | 
 | 
|  | 
| Slon | 
| Отправлено: 29.10.2004, 14:18 |  | 
| 
 Ученик-кочегар
 
 Группа: Участник
 Сообщений: 19
 
 
 
  
 | 2Rius а у тебя этот код в dll?
 
 У меня если оконное приложение создаешь тоже все ок работает, а если из dll экспортируешь, тогда Exel отказывается запускаться
  ( | 
|  | 
| Guest | 
| Отправлено: 30.10.2004, 20:32 |  | 
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Все, что я успел вчера написать, я делал в обычной программе, а не DLL — не видел разницы. Потом попробовал. Попалась мне под руку моя DLL'ка, на ней и попробовал с первым попашимся кодом (это оказался запуск MS Word):
 
 | CODE |  | //---------------------------------------------------------------------------
 void MyAboutBox2(void)
 {
 Variant Word;
 try
 {
 Word = Variant::GetActiveObject("Word.Application");
 }
 catch(...)
 {
 try
 {
 Word = Variant::CreateObject("Word.Application");
 }
 catch(...)
 {
 Application->MessageBox("Невозможно открыть Microsoft Word!\nВозможно Word не установлен на компьютере.","Ошибка",MB_OK|MB_ICONERROR);
 }
 }
 Word.OlePropertySet("Visible", true);
 }
 
 | 
 Здесь все замечательно, Word запускается и становится видимым.
 Немного другое дело с Excel: запускается, но сразу закрывается, даже в списке процессов не остаётся
  Причем на экране успевает мелькнуть его окошко, на доли секунды. 
 | CODE |  | Variant ExcelApp;
 try
 {
 ExcelApp = Variant::GetActiveObject("Excel.Application");
 }
 catch(...)
 {
 try
 {
 ExcelApp = Variant::CreateObject("Excel.Application");
 }
 catch(...)
 {
 Application->MessageBox("Невозможно открыть Microsoft Excel!\nВозможно Excel не установлен на компьютере.","Ошибка",MB_OK|MB_ICONERROR);
 }
 }
 ExcelApp.OlePropertySet("Visible", true);
 
 | 
 И еще, вчера пытался вставить запуск Excel в эту же DLL'ку на работе (когда форум вылетел) — там все вылетало, было что-то типа "Cannot CoInitialize...", если бы не WinXP — перезагружать бы мне комп каждый раз!
 | 
|  | 
| Rius | 
| Отправлено: 30.10.2004, 20:41 |  | 
|  
 Мастер участка
 
 Группа: Участник
 Сообщений: 321
 
 
 
  
 | Гость — это я. Забыл залогиниться.   | 
|  | 
| Slon | 
| Отправлено: 01.11.2004, 17:05 |  | 
| 
 Ученик-кочегар
 
 Группа: Участник
 Сообщений: 19
 
 
 
  
 | Я разобрался ;-) При использовании в dll необходимо добавить вызовы CoInitilize(NULL) и CoUninitilize().
 | 
|  | 
| Slon | 
| Отправлено: 01.11.2004, 17:07 |  | 
| 
 Ученик-кочегар
 
 Группа: Участник
 Сообщений: 19
 
 
 
  
 | Спасибо за помощь! | 
|  | 
| Gedeon | 
| Отправлено: 01.11.2004, 19:08 |  | 
|  
 Ветеран
 
 Группа: Модератор
 Сообщений: 1742
 
 
 
  
 | | QUOTE (Slon @ 01/11/2004, 18:07) |  | При использовании в dll необходимо добавить вызовы CoInitilize(NULL) и CoUninitilize(). | 
 Та же возня при подключении к БД из сервиса.
 | 
|  |