CoDomDocument проблема
От: IONIX  
Дата: 12.02.07 19:43
Оценка:
Пишу я DLL для сторонего приложения

var

XML : DomDocument ; // объекта XMLDomDocument
Doc : CoDomDocument ; // объявление сокласса, необходим для создания XMLDomDocument

procedure TMainPlugInForm.OnLoad(Sender: TObject);
begin
XML:=Doc.Create(); // создание документа DOM
......

Если делаю exeшник то компелиться и работает нормально.
Если же делаю DLL, то при запуске его из приложения выдаёться ошибка "Память не может быть read"
Если убрать XML:=Doc.Create();, то всё нормально работает.
Если подставить это:
XML :=CreateComObject(CLASS_DOMDocument) as IXMLDOMDocument;
То DLL запускаеться нормально, но появляються ошибке при выходе "Память не может быть read"

В чём тут подвох? :\
Re: CoDomDocument проблема
От: wildwind Россия  
Дата: 12.02.07 20:07
Оценка:
Здравствуйте, IONIX, Вы писали:

ION>В чём тут подвох? :\


Надо вызывать CoInitializeEx/CoUninitialize.
Re[2]: CoDomDocument проблема
От: IONIX  
Дата: 12.02.07 20:55
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Надо вызывать CoInitializeEx/CoUninitialize.

--------------------------------------------
В этом случае DLL вообще перестаёт работать:
CoInitializeEx(NIL, 2);
XML:=Doc.Create(); // создание документа DOM

В этом выходит с ошибками:
CoInitializeEx(NIL, 2);
XML :=CreateComObject(CLASS_DOMDocument) as IXMLDOMDocument;

использую при открытии формы CoInitializeEx(NIL, 2);
использую при закрытии формы CoUninitialize();
Re[3]: CoDomDocument проблема
От: Danchik Украина  
Дата: 19.02.07 12:05
Оценка:
Здравствуйте, IONIX, Вы писали:

ION>Здравствуйте, wildwind, Вы писали:


W>>Надо вызывать CoInitializeEx/CoUninitialize.

ION>--------------------------------------------
ION>В этом случае DLL вообще перестаёт работать:
ION>CoInitializeEx(NIL, 2);
ION>XML:=Doc.Create(); // создание документа DOM

ION>В этом выходит с ошибками:

ION>CoInitializeEx(NIL, 2);
ION>XML :=CreateComObject(CLASS_DOMDocument) as IXMLDOMDocument;

ION>использую при открытии формы CoInitializeEx(NIL, 2);

ION>использую при закрытии формы CoUninitialize();

CoInitializeEx/CoUninitialize вы должны вызывать не в библиотеке, а в потоке который будет вызывать функции вашей библиотеки. При чем только один раз.
Для того чтобы было более понятно для чего это нужно почитайте статью: Понимание подразделений COM
Автор(ы): Jeff Prosise
Дата: 22.02.2001

В этой статье подробно рассматриваются подразделения (apartments) в модели
COM. Автор описывает различные виды подразделений, показывает, каким образом
подразделения назначаются потокам и объектам, а также даёт ряд полезных
советов, которые позволят вам избежать ошибок при работе с подразделениями.
.

Для однопоточных програм на Delphi вам достаточно подключить в DPR-ку EXE-шки модуль ComObj.pas
Re[4]: CoDomDocument проблема
От: IONIX  
Дата: 13.03.07 09:20
Оценка:
EXE изменить не могу так как он написан другими людьми. Есть ли другие варианты?
Re[5]: CoDomDocument проблема
От: Danchik Украина  
Дата: 13.03.07 11:07
Оценка:
Здравствуйте, IONIX, Вы писали:

ION>EXE изменить не могу так как он написан другими людьми. Есть ли другие варианты?


Посмотрите в Delphi Help — DLLProc variable
Подцепитесь на DLL_THREAD_ATTACH и там делаете CoInitialize, на DLL_THREAD_DETACH делайте CoUninitialize, но только в том случае если CoInitialize прошел успешно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.