Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1132216159
pavel_guzhanov
2005-11-17 11:29
2005.12.04
Использование таймера


2-1131989531
serko
2005-11-14 20:32
2005.12.04
Форма на весь экран!


14-1131712043
SPeller
2005-11-11 15:27
2005.12.04
Просто ради смеха


2-1132224452
Al_Ba
2005-11-17 13:47
2005.12.04
SOS с TreeView ..................


2-1131812366
Daiwer
2005-11-12 19:19
2005.12.04
Pchar и забиение на блоки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский