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(). |
Та же возня при подключении к БД из сервиса.
|
|