D6 中XMLDocument 的多线程问题!(200分)

  • 主题发起人 主题发起人 SeaSky
  • 开始时间 开始时间
S

SeaSky

Unregistered / Unconfirmed
GUEST, unregistred user!
其实delphi 6 xml parser 是用msxml实现的(), 我一直用delphi 6 中的
那个xml 解析器,原来一直都没有问题, (支持中文,支持stream ,xPath, 支持xml Data Bind)
今天下午刚刚才发现问题:
Var x : IXMLDocument;
begin
x := NewXMLDocument ;
end ;
上面代码在主进程中没有问题, 但在单独的线程中却无法建立接口 (D6 + SP1 )
error(英文版操作系统) : CoInitialize has not been called !
error(中文版操作系统) : 标记没有应用存储
如果只是D6 的话 :
error( MSXML not installed ! )
另外 还有一个现象就是, 如果上面的代码运行之前, 曾经使用过ado 控件, 上面的错误就不会
出现了。(无论在主进程还是在多线程中)。痛苦!!!
 
知道了,被中文系统莫名其妙的错误骗了, CoInitialize is a API function
it must be called at a Thread Execute 的开始, 而为了平衡,要在结束时
Call CoUnInitialize .
但是 最后的那个现象却不能被解释 :( ,虽然ado 也是COM ,但是 我调用ado 时, 那个线程还没有建立呢!
为什么那个时候线程却可以调用XML COM 呢?
同时反映了 txmldocument 封装的不好的问题, 为什么TadoXXX 控件们却没有这样的问题呢?
 
请教一下xmlDocument怎么样释放资源???
myXmldocument:=nil就可以了吗????
 
你如果不写myXmldocument:=nil , 接口计数器会将接口计数器减1 , 如果为0
接口工作系统自动释放实例,
myXmldocument:=nil就可以全部释放,并将引用次数降为0
 
请问在Delphi中怎么调用CoInitialize呢?
 
最好能发个demo原码,谢谢!z-jackey456@163.com
 
运行过 ado ,不就表示已经运行过了 CoInitialize 了吗。
 
后退
顶部