itialize函数将在其内部调用CoIn itialize后的对OleIn itialize和OleUn

函数形式

WINOLEAPI OleInitialize( LPVOID pvReserved );

WINOLEAPI在objbase.h中又被定义为EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE

其中参数pvReserved为保留参数,在使用函数时必须设定为NULL。

返回值

这个函数除了支持标准的返回值E_INVALIDARG,E_OUTOFMEMORY和E_UNEXPECTED之外还可能产生以下返回值:

返回值说明
S_OKCOM库和OLE技术所特有的额外功能在当前单元被成功初始化。
S_FALSECOM库在当前单元已经被初始化过。
OLE_E_WRONGCOMPOBJ本机上的文件COMPOBJ.DLL和OLE2.DLL的版本不相匹配。
RPC_E_CHANGED_MODE之前有一个对函数CoInitializeEx的调用指明了这个单元的并发模式为MTA(multithread apartment——多线程单元)。如果当前正在使用Windows 2000,这个返回值也能表明发生了NA(neutral threaded apartment——中立线程单元)到STA的转换。

说明

使用以下功能的应用程序必须在调用其它任何COM库中的函数前调用

OleInitialize

函数,这些功能是:

  • 剪贴板
  • 拖放操作
  • 对象链接与嵌入(OLE)
  • 实地激活(In-place activation)

OleInitialize

函数将在其内部调用

CoInitializeEx

函数从而在当前单元初始化COM库。由于OLE操作线程不安全,因此

OleInitialize

函数将指明并发模式为STA。这也就意味着只有一个特定的线程(通过调用

OleInitialize

而创建单元的线程)可以直接访问单元内部的对象。试图在其它线程访问该对象通常会导致访问冲突。一旦一个单元的并发模式被设定,它将不能被更改。在之前已经初始化为MTA的单元上调用

OleInitialize

将会遭遇失败,并得到返回值RPC_E_CHANGED_MODE。

你必须在调用除了CoGetMalloc函数以外的其它任何库函数前初始化COM库,从而得到一个指向标准allocator的指针以及内存分配函数。

通常的来说,COM库在一个单元上只被初始化一次。只要不试图去改变单元的并发模式,在第一次调用

OleInitialize

后的对

OleInitialize

的多次调用也会成功,否则将会得到返回值S_FALSE。如果想将COM库“温柔的”关闭,每成功调用一次

OleInitialize

,包括那些返回值为S_FALSE,必须要有一个相对应的对OleUninitialize的调用。

如果

OleInitialize

返回OLE_E_WRONGCOMPOBJ,那么就说明文件COMPOBJ.DLL或者OLE2.DLL中的任何一个被更新到了一个与其它文件不相匹配的版本。要修正这个问题,将这两个文件用与当前操作系统对应发行的SDK中的版本替换掉。

由于没有办法控制“进程内服务器(in-process server)”载入和卸载的顺序。因此不要在DllMain函数中调用

OleInitialize

和OleUninitialize。

需求

Windows NT/2000/XP

需要Windows NT 3.1或者更高的版本

Windows 95/98

需要Windows 95或者更高的版本

头文件

在ole2.h中声明

导入的

库文件
使用ole32.lib
DLLOle32.dll