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

Вниз

dll + xml = Debugged Fault Notification   Найти похожие ветки 

 
Andreika_   (2005-11-04 05:17) [0]

dll (код ниже) загружается программой (пустой Delphi-Application, в котором в oncreateform прописано CoInitialize и LoadLibrary(mydll);

library mylib;

uses
 msxml2_tlb;

{$R *.res}

var
 R: IXmlDomDocument2;

function DllProcessAttach2(): Integer;
begin                        
    R.load("c:\test.xml");
    Result := 0;
end;

begin
 R := CoFreeThreadedDOMDocument.Create;
 R.load("c:\test.xml");
end.


после завершения приложения получаю Debugged Fault Notification — Project ... raised too many consecutive exceptions: "access violation..."
падает в районе TObject.Free +$6

если закомментировать R.load("c:\test.xml"); , то не падает..причем функция эта в обоих вариантах не компилируется вроде как вообще (и не должна), но... кто виноват, что делать, чего я не учел? %)
D7/D2005/MSXML4.0SP2


 
gdaujk ©   (2005-11-04 06:17) [1]

Я конечно не знаю, но если есть Load, то где-то в конце наверное должен быть free:-). Это чисто филосовский подход :-)


 
Andreika_   (2005-11-04 06:42) [2]

тогда не free a save, но не поможет...

ЗЫ. копировал вопрос с rsdn, забыл уточнить - ...если закоментировать R.load в DllProcessAttach2, то...


 
umbra ©   (2005-11-04 10:53) [3]

я тоже не совсем понимаю, о чем речь, но надо ли два раза загружать один и тот же файл?


 
Плохиш ©   (2005-11-04 11:06) [4]


> если закомментировать R.load("c:\test.xml"); , то не падает.
> .причем функция эта в обоих вариантах не компилируется вроде
> как вообще (и не должна),

Ничего не понимаю, телепаты в отпуске. Хотя, нет знаю - ошибка в 17й строке


 
Andreika_   (2005-11-04 11:16) [5]

про то, что вы не понимаете отмечаться не обязательно - и без вас сам апну топик когда надо будет

umbra ©
покажи мне место, откуда второй раз загружают данные? +даже если б и загружали - кто это запрещает делать?

Плохиш ©
найди мне 17 строку, благо весь код у тебя есть (если конечно ты синий цвет различаешь). не компилируется функция DllProcessAttach2


 
umbra ©   (2005-11-04 11:19) [6]


function DllProcessAttach2(): Integer;
begin                        
   R.load("c:\test.xml");  //первое место
   Result := 0;
end;

begin
R := CoFreeThreadedDOMDocument.Create;
R.load("c:\test.xml");  //второе место
end.


 
Плохиш ©   (2005-11-04 11:20) [7]


> не компилируется функция DllProcessAttach2

Вот врать не надо, или ты не знаешь отличия между ошибками в процессе компиляции проекта и ошибками в процессе выполнения?

Переменную R за тебя Пушкин создавать должен?


 
Andreika_   (2005-11-04 11:28) [8]

мдяяяя... по моему вы форумом ошиблись.. там правее основной плюсик есть, вот туда б вам


 
GuAV ©   (2005-11-04 11:46) [9]

Видимо, CoUnitialize вызывается в основной программе до выгрузки Dll. Поэтому освобождение R осуществляется позже CoUnitialize, что приводит к ошибке. Следует явно прописать FreeLibrary перед CoUnitialize.

PS: Что бы значило DllProcessAttach2 ?


 
GuAV ©   (2005-11-04 11:51) [10]


> не компилируется функция DllProcessAttach2


Потому, что она не нужна. Если бы она использовалась и/или экспортировалась, она бы компилировалась.

Для обработки загрузки/выгрузки Dll используйте DllProc (обратите внимание на Note в справке), или, что ИМХО лучше, создайте unit с секциями initialization/finalization в этой Dll.


 
Andreika_   (2005-11-04 11:59) [11]

GuAV
1. хм.. явного вызова CoUninitialize() в программе нет, но FreeLibrary в oncloseform помогло
2. DllProcessAttach2 с цифрой 2 означает, что это просто функция
3. Почему не компилируется я знаю ) весь вопрос в том, что если закомментировать в некомпилируемой функции 1ую строку, то программа не падает. почему?

с initialization/finalization были те же проблемы - создавая в initialization в finalization в R.Free происходило такое же падение


 
GuAV ©   (2005-11-04 12:28) [12]


> 1. хм.. явного вызова CoUninitialize() в программе
> нет, но FreeLibrary в oncloseform помогло

Даже если CoUninitialize явно не вызывается, при выгрузке приложения библиотеки ActiveX всё равно выгружаются, не так ли ? И они вполне могут выгрузится до выгрузки mylib.


> весь вопрос в том, что если закомментировать в
> некомпилируемой функции 1ую строку, то программа не
> падает. почему?


Потому, что тогда переменная R становится локальной. Соответсвенно, при выходе из LoadLibrary, когда begin..end. выполнен, она уже освобождена.
Сделать её глобальной в любом случае можно так:
var
R: IXmlDomDocument2 = nil;



> с initialization/finalization были те же проблемы

Про Initialization/finalization я упомянул, подумав что DllProcessAttach2 - попытка реализовать DllEntryPoint, к  проблеме отношение не имеет


> в R.Free

Что-что !? Интерфесы освобождаются присвоением nil,
класс CoFreeThreadedDOMDocument никогда не создаётся и освобождать его не надо !


 
Andreika_   (2005-11-04 12:37) [13]

GuAV
ага, попытка реализовать DllEntryPoint, ну в тестовом примере она не нужна
пасиб, про локальную переменную не догадался

в смысле R:=nil :) R.Free думаю не существует.. очепятка


 
Andreika_   (2005-11-04 12:47) [14]

а если б я не мог сделать FreeLibrary, а R : должна быть глобальная, то что делать? CoInitialize прописывать?


 
GuAV ©   (2005-11-04 13:15) [15]

Andreika_   (04.11.05 12:47) [14]


> а если б я не мог сделать FreeLibrary, а R : должна
> быть глобальная, то что делать? CoInitialize
> прописывать?


Да, CoInitialize(Ex) перед CoFreeThreadedDOMDocument.Create; , CoUninitialize после  R := nil; . Повторные вызовы CoInitialize(Ex) не приводят к ошибке, пока они не меняют concurrency model; при этом библиотеки COM будут финализированны при вызове том вызове CoUninitialize, когда число вызовов CoUninitialize совпало с числом успешных CoInitialize(Ex). Рекомендую почитать про эти функции в MSDN (и в исходниках ComObj (в самом низу)).

И вообще,
"Because there is no way to control the order in which in-process servers are loaded or unloaded, it is not safe to call CoInitialize, CoInitializeEx, or CoUninitialize from the DllMain function. " © MSDN,
так что не стоит по возможности лепить инициализацию/финализацию IXmlDomDocument2 в DLL_PROCESS_ATTACH/DLL_PROCESS_DETACH. Лучше что-то вроде:

procedure CoMyLibInitialize;
begin                        
 R := CoFreeThreadedDOMDocument.Create;
 R.load("c:\test.xml");
end;

procedure CoMyLibUninitialize;
begin                        
 R := nil;
end;

Многое зависит от причины размещения этого кода в Dll, это решение возможно тоже следует пересмотреть.



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

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

Наверх




Память: 0.51 MB
Время: 0.044 c
2-1132038926
Silvestr
2005-11-15 10:15
2005.12.04
Как в RishEdit поменять цвет определёной строки ?


14-1131633663
Хинт
2005-11-10 17:41
2005.12.04
Функции DLL


4-1128103792
Wolfram
2005-09-30 22:09
2005.12.04
Как перевести компьютер в ждущий режим?


6-1124514293
Shopot
2005-08-20 09:04
2005.12.04
Как использовать RRAS?


1-1131171710
Seg
2005-11-05 09:21
2005.12.04
Отмена перехода на с закладки на закладку в PageControl