Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
razin73
Зарегистрирован: 04.10.2004 Сообщения: 10
|
Добавлено: Пн Окт 04 2004 20:47 Заголовок сообщения: C++Builder Excel DLL |
|
|
Остро нуждаюсь в срочной помощи! )))))))
Программа вызывает из DLL форму, форма запускает поток и висит с кнопкой "Cancel", поток печатает в Excel.
Кусок кода:
try
{
app = CreateOleObject("Excel.Application");
app.OlePropertySet("Visible", 1);
books = app.OlePropertyGet("Workbooks");
books.Exec(Procedure("Open")<<"D:\\tmp\\1.xls");
book = books.OlePropertyGet("item",1);
sheet= book.OlePropertyGet("WorkSheets",1);
}
catch(...)
{
ShowMessage("Ошибка при обрашении к Excel.");
return 1;
}
return 0;
}
прекрасно работает в главной форме приложения. Работает и в потоке, если не забыть CoInitialize(NULL);
Но отказывается работать в DLL:
"Access violation at address 00f7d5cf. Read of address 00000800."
Спасибо. |
|
Вернуться к началу |
|
|
Alexandr 172
Зарегистрирован: 03.09.2004 Сообщения: 66 Откуда: Челябинск
|
Добавлено: Вт Окт 05 2004 08:56 Заголовок сообщения: |
|
|
По-моему ошибка не в этой части кода. В этой части ошибки ловятся.
Наверное нужно привести остальную часть кода _________________ www.pay-ace.com/Ras254 - всем в подарок $150 |
|
Вернуться к началу |
|
|
razin73
Зарегистрирован: 04.10.2004 Сообщения: 10
|
Добавлено: Вт Окт 05 2004 21:23 Заголовок сообщения: |
|
|
2 Alexandr 172
Ошибка в вызове app.OlePropertySet("Visible", 1);
Проверяется комментированием строк. Видимо app совсем не инициализируется... В руководствах есть предостережения, что в DLL это все может работать некорректно. Не могу найти как сделать правильно именно из DLL. Меня бы устроил любой вариант обращения к Excel из DLL (вызов->форма->поток). |
|
Вернуться к началу |
|
|
Mike
Зарегистрирован: 17.11.2001 Сообщения: 339 Откуда: ekb
|
Добавлено: Пн Окт 18 2004 09:21 Заголовок сообщения: |
|
|
Вызовы OlePropertyGet и т.п. свои ошибки ловят и отображают сами, их трай-кэтч не поймать.
Делай лучше так:
Variant EA=Variant::CreateObject("Excel.Application");
EA.Exec(PropertySet("Visible")<<true);
ну и т.д. у меня такой вариант работает стабильно, да и ошибки легче ловить |
|
Вернуться к началу |
|
|
razin73
Зарегистрирован: 04.10.2004 Сообщения: 10
|
Добавлено: Пн Окт 25 2004 17:50 Заголовок сообщения: |
|
|
Так действительно получается.
Остается вопрос как переделать:
book = books.OlePropertyGet("item",1);
sheet= book.OlePropertyGet("WorkSheets",1);
Variant r = sheet.OlePropertyGet("Range", cell.c_str());
sheet.OlePropertyGet("Range", cell.c_str());
r.OlePropertySet("Value", as.c_str());
r.OlePropertyGet("Font").OlePropertySet("Bold", 1);
r.OlePropertyGet("Borders", i).OlePropertySet("LineStyle", 1);
r.OlePropertyGet("Borders", i).OlePropertySet("LineStyle", 7);
r.OlePropertySet("WrapText", 1);
r.OlePropertySet("VerticalAlignment", 2);
r.OlePropertySet("HorizontalAlignment", 3); |
|
Вернуться к началу |
|
|
Mike
Зарегистрирован: 17.11.2001 Сообщения: 339 Откуда: ekb
|
Добавлено: Вт Окт 26 2004 08:51 Заголовок сообщения: |
|
|
book = books.Exec(PropertyGet("item")<<1);
sheet= book.Exec(PropertyGet("WorkSheets")<<1);
Variant r = sheet.Exec(PropertyGet("Range")<<cell);
sheet.Exec(PropertyGet("Range")<<cell);
r.Exec(PropertySet("Value")<<as);
r.Exec(PropertyGet("Font")).Exec(PropertySet("Bold")<<1);
ну и так далее |
|
Вернуться к началу |
|
|
razin73
Зарегистрирован: 04.10.2004 Сообщения: 10
|
Добавлено: Вт Окт 26 2004 16:51 Заголовок сообщения: |
|
|
Спасибо. У меня почему-то единички не пошли, только вот как
int i;
i = 1;
book = books.Exec(PropertyGet("item")<<i);
sheet= book.Exec(PropertyGet("WorkSheets")<<i);
sheet.Exec(PropertyGet("Range")<< cell.c_str());
Variant r = sheet.Exec(PropertyGet("Range")<< cell.c_str());
r.Exec(PropertySet("Value")<< as.c_str());
r.Exec(PropertySet("WrapText")<< iWrapText);
r.Exec(PropertySet("VerticalAlignment")<< iVerticalAlignment);
r.Exec(PropertySet("HorizontalAlignment")<< iHorizontalAlignment);
Для меня тема закрыта. Это работает и в формах и в потоках и в DLL,
если не забыть
CoInitialize(NULL);
CoUninitialize();
BC++B 6.0 |
|
Вернуться к началу |
|
|
Mike
Зарегистрирован: 17.11.2001 Сообщения: 339 Откуда: ekb
|
Добавлено: Ср Окт 27 2004 06:26 Заголовок сообщения: |
|
|
скорее всего 1 не пошла, потому что автоматическое преобразование неправильно сработало, наверное сработало бы int(1) |
|
Вернуться к началу |
|
|
|