Форум: "Основная";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 2.238 c