Вниз
Скачать: CL | DM;

COM в консольном приложении на Delphi   Найти похожие ветки 

← →
neXt ©   (2002-11-25 12:58) [0]

У меня появилась необходимость использовать COM в консольном приложении. Так как в консоли нет строки вроде
Application.Initialize;
я ставлю в начало всего
CoInitialize(nil);
а в конец
CoUninitialize;
так вот всё работает, но при завершении программы вылетает AV причём, если убрать CoUninitialize то ошибка не повторяется.
Ещё - ошибка не повторяется под отладчиком.
И ещё - это всё справедливо только для COM-сервера MSXML3.
D5.
MSXML2_TLB - получен обычным импортом библиотеки типов msxml3.dll
Пример:

program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, ActiveX, MSXML2_TLB;
var
D: IXMLDOMDocument;
begin
CoInitialize(nil);
try
D := CoDOMDocument.Create;
finally
CoUninitialize;
end;
end.


Вопрос:
1. Почему
2. Что страшного в том что я уберу CoUninitialize, избавившись таким образом от ошибки.
3. и как это скажется на параллельной работе нескольких экземпляров моей программы.


← →
neXt ©   (2002-11-25 13:08) [1]

> И ещё - это всё справедливо только для COM-сервера MSXML3.
- наврал, это справедливо, для любого COM сервера


← →
Romkin ©   (2002-11-25 13:31) [2]

Наверняка ведь используешь COMObj в проекте :-))
1. Вместо CoInitialize лучше бы поставить
if InitProc <> nil then TProcedure(InitProc);
Так грамотнее, TApplication.Initialize именно это и делает :-)) Инициализация COM выполнится там, COMObj вставляет.
2. CoUnitialize убери - COMObj выполняет этот вызов в секции finalization


← →
neXt ©   (2002-11-25 13:36) [3]

нет COMObj не использую.


← →
Romkin ©   (2002-11-25 13:42) [4]

Используешь, куда ты денешься :-))
см список в uses в модуле MSXML2_TLB.pas :-)) Там упоминается, этого достаточно, самому в uses проекта можно не ставить


← →
neXt ©   (2002-11-25 13:42) [5]

можно подробнее - ПОЧЕМУ?


← →
Romkin ©   (2002-11-25 13:48) [6]

Почему что? почему, если хоть где-то в uses модуль прописан, то он к проекту линкуется или почему InitProc надо выполнять?


← →
neXt ©   (2002-11-25 13:49) [7]

Всё, допёр.
Ошибка идёт от повторного вызова CoUnitialize в COMObj,
с CoInitialize такой петрушки нет, так как она в COMObj вызывается не на инициализацию



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

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.01 c
3-14421
Dbrf
2002-11-15 14:14
2002.12.05
Межстроковое расстояние RichEdit


3-14411
_stranger_
2002-11-15 16:26
2002.12.05
Ошибка при работе с ADOQuery с пустой таблицей при закрытии


1-14597
maxim2
2002-11-27 15:24
2002.12.05
Как обратится к объекту ?


1-14587
volph7777
2002-11-27 13:34
2002.12.05
ownerdraw listbox


1-14636
Азазелло
2002-11-25 10:32
2002.12.05
Delphi+CR, передача null в качестве параметра..




   Наверх