Форум: "WinAPI";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизThread + CreateOleObject какой-то странный глюк. Найти похожие ветки
← →
DNSokol © (2004-02-07 13:31) [0]Привет всем.
Решил вынести особо грамоздкие процедуры общения с БД и вывода результатов в триды. И столкнулся с такой бякой:
Создаю трид:
ThreadLink := CreateThread(nil,512,@ThreadFunc,Self,0,ThreadId);
процесс пошёл на выплнение, все вроде бы ок, запросики побежали, ответы посыпались, однако при натыкании на строчку вида
ThreadLink := CreateThread(nil,512,@ThreadFunc,Self,0,ThreadId);
вываливаемя с ошибкой: EOleSysError with message "Не был произведён вызов CoInicialize()"
Вот собственно и интересно, где грабли, т.к. если пулять это всё дело в потоке основного приложения (без создания отдельного потока путём CreateThread) - всё ок.
← →
DNSokol © (2004-02-07 13:34) [1]ой... ошибочка вкралась :( после слов натыкании на строчку вида должно быть:
ExcelApplication := CreateOleObject(cls_ExcelObject) :) и уже с ошибкой на ней копытимся
← →
Digitman © (2004-02-07 13:41) [2]function ThreadFunc(...): DWORD; stdcall;
begin
try
CoInitialize(nil);
try
ExcelApplication := CreateOleObject(..);
try
... работа с ExcelApplication
finally
ExcelApplication := Null; // или nil, смотря что у тебя там
Result := ...;
end;
finally
CoUnInitialize;
end;
except
Result := ...;
end;
end;
← →
DNSokol © (2004-02-07 14:08) [3]CoInitialize - откудова взять? если просто так написать, то компилер ругается - типа нету такого.
← →
Digitman © (2004-02-07 14:30) [4]uses ActiveX
← →
DNSokol © (2004-02-07 16:58) [5]пасиба :) помогло :) исё забегало...
только вот всё-таки любопытство грызёт - я нигде в манах, т.е. в хелпе не нашел описание такой фишки. Почему в контексте основного приложения вызывать CoInitialize необезательно, а вот если процедурку запихать в трид, то приходится в ручныю стартовать.
← →
jack128 © (2004-02-07 17:16) [6]
> Почему в контексте основного приложения вызывать CoInitialize
> необезательно,
она автоматом вызывается. Поищи в ComObj..
← →
Digitman © (2004-02-07 17:20) [7]
> Почему в контексте основного приложения вызывать CoInitialize
>
в контексте не "основного приложения", а "основного кодового потока процесса"
объяснение "феномена" проще пареной репы : вызов этой ф-ции в осн.код.потоке происходит автоматически (об этом позаботился Борланд), а аналогичные вызовы в каждом новом доп.код.потоке должен производить ты сам, если планируешь работать в нем с OLE/COM-объектами
← →
DNSokol © (2004-02-07 19:33) [8]To DigitMan:
понятненько :) пасиб огромный.
И ещё маленький вопросик - когда имеются "форс-мажорные" обстоятельства, как правильнее убить созданный процесс? когда он доходит до своего логического конца и умирает (ессно с очисткой handle), то всё ок. а как его тормознуть в момент выполнения. Я торможу путём варварского киляния, вследстви чего винды сильно возмущаются по поводу некорректного убиения.
← →
DNSokol © (2004-02-07 21:02) [9]сам разобрался :) теперь не ругается. Осталься вопрос о корректности. Убиваю при помощи TerminateThread. Однако в процессе есть созданные объекты, у которых есть свои диструкторы. ВОт интересно - она их юзает - или просто грохает процесс вместе со всей занятой под него памятью?
← →
Polevi © (2004-02-08 13:37) [10]просто грохает
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.032 c