Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.22;
Скачать: CL | DM;

Вниз

CreateOleObject   Найти похожие ветки 

 
Woolen ©   (2007-04-03 11:42) [0]

Если кто знает, подскажите, пожалуйста. Вызываю CreateOleObject в безоконном приложении прямо в .dpr в главном блоке begin end. Передаю в фунцию ProgID. Результат присваиваю к Variant. Получаю: "Exception EOleSysError in module archivesif.exe at 00028191. Не был произведен вызов CoInitialize." Делаю то же самое, но в оконном приложении - все работает. Почему? В чем разница?


 
Reindeer Moss Eater ©   (2007-04-03 11:44) [1]

Потому что не был произведен вызов CoInitialize


 
Сергей М. ©   (2007-04-03 11:48) [2]


> В чем разница?


Уж точно не в наличии или отсутствии каких-то там "окон".
Просто в одном случае Application.Initialize вызывается, а в другом нет)


 
Woolen ©   (2007-04-03 12:10) [3]


> Сергей М. ©   (03.04.07 11:48) [2]

Вот этого я непонял. У меня не вызывается Application.Initialize. У меня вообще модуль Forms не подключен. И что происходит дальше? Если его нет, я не могу вызывать CreateOleObject?


 
Reindeer Moss Eater ©   (2007-04-03 12:13) [4]

Вызови CoInitialize и создавай свои оле объекты наздоровье.


 
KSergey ©   (2007-04-03 12:19) [5]

см тут
http://delphimaster.net/view/4-1175334004/


 
Сергей М. ©   (2007-04-03 12:21) [6]


> Woolen ©   (03.04.07 12:10) [3]


При вызове Application.Initialize происходит неявный вызов CoInitialize().
Не нравится Application ? Делай явный вызов CoInitialize() !


 
Woolen ©   (2007-04-03 12:40) [7]


> Сергей М. ©   (03.04.07 12:21) [6]

Спасибо. Все заработало.


 
Woolen ©   (2007-04-03 15:05) [8]


> Woolen ©   (03.04.07 12:40) [7]

Вру, не все. Если я правильно понимаю, каждый CoInitialize должен закрываться CoUninitialize. Так и сделал. Выглядит примерно так:
begin
CoInitialize(nil);
...
QQQ := CreateOleObject("QQQ.QQQ");
...
if not VarIsClear(QQQ) then
 QQQ := Unassigned;
...
CoUninitialize;
end.

Это вызывает ошибку "Exception EAccessViolation in module ole32.dll at 00057500. Access violation at address 77537500 in module "ole32.dll". Read of address FEEEFEEE." где-то в дельфиском библиотечном коде после последнего моего end. Если вызывать или CreateOleObject, или CoUninitialize, то все работает. Если вместе - появляется вышеозначенная ошибка. Может кто знает, какова ее природа и что с этим делать? Спасибо


 
Сергей М. ©   (2007-04-03 15:09) [9]

begin
CoInitialize(nil);
try
  ...
  QQQ := CreateOleObject("QQQ.QQQ");
  try
    ...
  finally
    QQQ := Unassigned;
  end;
  ...
finally
  CoUninitialize;
 end;
end.


 
umbra ©   (2007-04-04 11:03) [10]

вот генофонд :)
procedure TApplication.Initialize;
begin
 if InitProc <> nil then TProcedure(InitProc);
end;

InitProc значение присваивается при инициализации модуля ComObj


 
KSergey ©   (2007-04-04 12:02) [11]

Вообще-то CoInitialize(nil) достаточно вызвать 1 раз при инициализации приложения.
Ну и CoUn.... тоже один, призавершении


 
Сергей М. ©   (2007-04-04 12:05) [12]


> достаточно вызвать 1 раз при инициализации приложения.


Если приложение мультипоточное и в доп.потоках есть OLE/COM-вызовы, то недостаточно.


 
palva ©   (2007-04-04 16:58) [13]

Woolen ©   (03.04.07 15:05) [8]

> Может кто знает, какова ее природа и что с этим делать?

Природа ее такова что при финализации модуль ComObj сам вызывает CoUnInitialize, но делает это, если выполняются определенные условия.

А что с этим делать, непонятно. Можно плюнуть на это и вообще не писать CoUnInitialize. Но с другой стороны у меня есть примеры, когда ComObj не вызывает CoUnInitialize, следовательно если я сам его не вызову, наступит некоторая некорректность. Хорошо бы научиться сигнализировать ComObj, что я сам вызвал CoUnInitialize.


 
Loginov Dmitry ©   (2007-04-04 20:30) [14]

Сталкивался недавно тоже с проблемами при вызове CoUnInitialize() в дополнительном потоке (в коде DLL). Проблема была в том, что библиотека просто выгружалась. Пришлось убирать CoUnInitialize().



Страницы: 1 вся ветка

Текущий архив: 2007.04.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.049 c
2-1175325110
Dismember
2007-03-31 11:11
2007.04.22
Изменение размеров формы с BorderStyle=bsNone


15-1175006565
oldman
2007-03-27 18:42
2007.04.22
Почему мы так поступили?


2-1175108605
Dmitry_177
2007-03-28 23:03
2007.04.22
SQL-запрос на проверку существование записи


4-1164296258
Вольный Стрелок
2006-11-23 18:37
2007.04.22
CreateProcess консольной программы


2-1175594493
Alex_C
2007-04-03 14:01
2007.04.22
Как правильно определить многомерный динамический массив?