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

Вниз

XML   Найти похожие ветки 

 
Андре_   (2002-04-01 09:44) [0]

Подскажите пожалуйста.

Есть следующий код:

......

type TODBCConfigReader = class(TObject)
XML: TXMLDocument;
private
Provider : string;
PSI : string;
UserID : string;
DS : string;
IC : string;
ConnStr : string;
public
FileName : string;
procedure GetInfo;
end;

......

procedure TODBCConfigReader.GetInfo;
begin
XML:=TXMLDocument.Create(nil);
XML.LoadFromFile("c:\dta.xml");
Provider:=XML.DocumentElement.ChildNodes["Provider"].Text; (!!)
PSI:=XML.DocumentElement.ChildNodes["PersistSecurityInfo"].Text; (!!)
UserID:=XML.DocumentElement.ChildNodes["UserID"].Text; (!!)
DS:=XML.DocumentElement.ChildNodes["DataSource"].Text; (!!)
IC:=XML.DocumentElement.ChildNodes["InitialCatalog"].Text; (!!)

ConnStr:="Provider="+Provider+";"+
"Persist Security Info"+PSI+";"+
"User ID="+UserID+";"+
"Data Source="+DS+";"+
"Initial Catalog="+IC;
end;

......

В строках помеченных (!!) во время выполнения программы возникает ошибка. Хотя документ загружается корректно. Смотрел свойство XML.xml - все в порядке.
Если расположить TXMLDocument на форме, а не создавать динамически, то этот код работает корректно.

В чем может быть дело ?


 
Дмитрий ©   (2002-04-01 10:25) [1]

CoInitialize(0) пробовал?


 
Adoon   (2002-04-01 11:28) [2]

Может Active надо установить?


 
Олег Лаукарт ©   (2002-04-09 12:24) [3]

Какой модуль надо включать в проект для CoInitialize? Ole2, OleAuto...?
У меня подобная проблема: если создаю TXMLDocument в отдельном TDataModule, то все нормально, в если создаю его налету, то Active установить в true можно, но не больше.
1. Что надо включать, чтобы инициализация OLE проходила автоматически?
2. Есть ли ньансы при создании на лету и с дальнейшей работой с TXMLDocument в многопотоковом приложении?
Спасибо.


 
Sergey U.   (2002-04-09 13:17) [4]

На эту тему есть интересная статья:
http://delphi.diagnostic.ru:8101/cgi-bin/opendoc?22


 
Олег Лаукарт ©   (2002-04-10 11:21) [5]

полезная статья, спасибо, но там нет ответа на вопрос: почему TXMLDocument не работает если мы его создаем в не основном потоке - EOLEException:"CoInitialize has not been called", тогда как в основном потоке все работает нормально.


 
Олег Лаукарт ©   (2002-04-10 11:53) [6]

Сделал пример: в потоке (TThread) в Execute создаю TXMLDocument, работаю с ним и делаю Terminate - валится указанное исключение. Оформляю все в
procedure TMyThread.Execute;
begin
OleInitialize(nil);
..
OleUninitialize;
Terminate;
end;

после этого все работает.
Вопрос
1. есть ли альтернатива решению описанной проблемы?
2. что происходит с ресурсами системы. что будет если одновременно запущенно много потоков или что будет после 100 тысяч последовательных запусков потоков?


 
Anatoly Podgoretsky ©   (2002-04-10 12:59) [7]

1. "CoInitialize has not been called", не был сделан вызов CoInitialize, вот поэтому
2. проверить натурными испытаниями



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

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

Наверх




Память: 0.48 MB
Время: 0.017 c
3-69716
Viktor Erko
2002-03-30 10:27
2002.04.22
Потеря 1-4 коп. при суммировании чисел из базы даных


1-69863
erw
2002-04-09 09:51
2002.04.22
Запуск дефолтного почтового клиента


3-69732
neos
2002-03-29 12:36
2002.04.22
Кнопка поля просмотра в TDBGrid


3-69756
Igor_
2002-04-02 11:47
2002.04.22
Принтер и QReport


1-69870
Aleksandr
2002-04-08 16:53
2002.04.22
Млин, это прикол MS ODBC или АДО-компоненты?