2024年4月19日发(作者:)

2009-10-26 12:30

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

然后在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

如果是使用多线程的话那就在

Execute事件的开头加上

CoInitialize(nil)