C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Запихать в Exel (работа из DLL), Почему данный код не работает из DLL
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 отказывается запускаться sad.gif(
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: запускается, но сразу закрывается, даже в списке процессов не остаётся wink.gif Причем на экране успевает мелькнуть его окошко, на доли секунды.
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



Гость — это я. Забыл залогиниться. smile.gif
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().

Та же возня при подключении к БД из сервиса.

Вернуться в Вопросы программирования в C++Builder