Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.062 c
2-1175260591
G
2007-03-30 17:16
2007.04.22
Ноль


2-1175055373
npu3pak
2007-03-28 08:16
2007.04.22
Как добавить новые строки в базу на accesse?


15-1174851367
Servelat
2007-03-25 23:36
2007.04.22
C++ Builder первые впечатления


15-1175084101
homm
2007-03-28 16:15
2007.04.22
Зачем жескому диску кэш?


9-1148506360
lstalkerl
2006-05-25 01:32
2007.04.22
Нужна помощь по формам





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский