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"
Здравствуйте, 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();
Здравствуйте, 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
Здравствуйте, IONIX, Вы писали:
ION>EXE изменить не могу так как он написан другими людьми. Есть ли другие варианты?
Посмотрите в Delphi Help — DLLProc variable
Подцепитесь на DLL_THREAD_ATTACH и там делаете CoInitialize, на DLL_THREAD_DETACH делайте CoUninitialize, но только в том случае если CoInitialize прошел успешно.