Delphi中CoInitialize之探究

本文详细解析了Delphi中CoInitialize及其与OLE的关系,包括两者之间的区别、如何正确初始化COM库及解决相关问题的方法,旨在帮助开发者理解和解决在使用ADO数据库组件、WebBrowser等组件时遇到的“尚未调用CoInitialize”错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Delphi中CoInitialize之探究
2010-03-25 15:13:26
标签:Delphi CoInitialize 探究 休闲 职场
Delphi中CoInitialize之探究
Delphi 2009-08-05 09:21:59 阅读387 评论0 字号:大中小
       CoInitialize(LPVOID),它将以特定参数调用CoInitializeEx,为当前单元初始化COM库,并标记协同模式为单线程模式。参数必须为NULL。这是关于OLE和COM的问题。
       CoInitializeEx(LPVOID),新版本,可以用参数指定协同模式,如多线程模式,但注意单元的协同模式是不能改的,如果在已经初始化为多线程的单元里初始化OLE将失败并返回RPC_E_CHANGED_MODE。每个线程只要调用一次初始化就够了,同一线程中的后续调用也将通过,但会返回S_FALSE。后面解除初始化调用要与本调用一一对应,返回S_FALSE的CoInitialize调用也计算在内。应用程序的第一个线程将调用CoInitializeEx(COINIT_APARTMENTTHREADED或0),必须是最后一个解除初始化的。如果不按上面的顺序进行初始化/解除函数调用,在该单线程单元(STA)里后续的初始化调用将失败,应用程序将无法工作。由于无法控制本地服务器的载入/御载顺序,在DLLMain里调用初始化/解除函数是不安全的。
例:
1)在DLL中使用ADO数据库组件时,调用程序调用该DLL时会出现"尚未调用CoInitialize"错误,解决的办法是在程序初始化时调用CoInitialize(nil)方法。




initialization 
CoInitialize(nil); 


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} 
finalization 
CoUninitialize; 
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} 
2) 把WebBrowser封装到Dll里面调用的时候总是说“尚未调用 CoInitialize。”,"CoInitialize has not been called"或“尚未调用 CoInitialize。”的解决方法。
用TWebBrowser显示HTML文档时或者把WebBrowser封装到Dll里面调用的时候总是说“尚未调用 CoInitialize。”,解决方法:
在“开始 -> 运行”中输入 regsvr32 shdocvw.dll 
然后在uses 中加入ActiveX,老版本的加入OLE2;
uses
  ActiveX, // 确认加入这个单元
           // 老版本的Delphi用 OLE2 代替
  Windows; 




initialization
  CoInitialize(nil); // 手动调用  CoInitialize()


finalization
  CoUnInitialize; // 释放内存


end.
Delphi中 CoInitialize和 OleInitialize有什么区别
CoInitialize-------------   COM对象   
OleInitialize   -----------     OLE对象
COM库:CoInitialize{Ex}、CoUnitialize   
OLE系统:OleInitialize、OleUnitialize
COM对象和OLE对象有什么不同呢?是不是COM是OLE的子集?
OLE是COM的前身,MS现在已经全部转道COM上了,应该现在不发展OLE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值