複製鏈接
請複製以下鏈接發送給好友

OleInitialize

鎖定
OleInitialize是一個Windows API函數。它的作用是在當前單元(apartment)初始化組件對象模型(COM)庫,將當前的併發模式標識為STA(single-thread apartment——單線程單元),並啓用一些特別用於OLE技術的額外功能。除了CoGetMalloc和內存分配函數,應用程序必須在調用COM庫函數之前初始化COM庫。
不需要OleInitialize函數所啓用的額外功能的應用程序應該調用CoInitializeEx來代替OleInitialize。 [1] 
中文名
OleInitialize
類    型
Windows API函數
作    用
初始化組件對象模型(COM)庫
頭文件
在ole2.h中聲明

OleInitialize函數形式

WINOLEAPI OleInitialize( LPVOID pvReserved );
WINOLEAPI在objbase.h中又被定義為EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
其中參數pvReserved為保留參數,在使用函數時必須設定為NULL。 [1] 

OleInitialize返回值

這個函數除了支持標準的返回值E_INVALIDARG,E_OUTOFMEMORY和E_UNEXPECTED之外還可能產生以下返回值: [1] 
返回值
説明
S_OK
COM庫和OLE技術所特有的額外功能在當前單元被成功初始化。
S_FALSE
COM庫在當前單元已經被初始化過。
OLE_E_WRONGCOMPOBJ
本機上的文件COMPOBJ.DLL和OLE2.DLL的版本不相匹配。
RPC_E_CHANGED_MODE
之前有一個對函數CoInitializeEx的調用指明瞭這個單元的併發模式為MTA(multithread apartment——多線程單元)。如果當前正在使用Windows 2000,這個返回值也能表明發生了NA(neutral threaded apartment——中立線程單元)到STA的轉換。

OleInitialize説明

使用以下功能的應用程序必須在調用其它任何COM庫中的函數前調用OleInitialize函數,這些功能是: [1] 
OleInitialize函數將在其內部調用CoInitializeEx函數從而在當前單元初始化COM庫。由於OLE操作線程不安全,因此OleInitialize函數將指明併發模式為STA。 [1]  這也就意味着只有一個特定的線程(通過調用OleInitialize而創建單元的線程)可以直接訪問單元內部的對象。 [2]  試圖在其它線程訪問該對象通常會導致訪問衝突。
一旦一個單元的併發模式被設定,它將不能被更改。在之前已經初始化為MTA的單元上調用OleInitialize將會遭遇失敗,並得到返回值RPC_E_CHANGED_MODE。 [1] 
你必須在調用除了CoGetMalloc函數以外的其它任何庫函數前初始化COM庫,從而得到一個指向標準allocator的指針以及內存分配函數。 [1] 
通常的來説,COM庫在一個單元上只被初始化一次。只要不試圖去改變單元的併發模式,在第一次調用OleInitialize後的對OleInitialize的多次調用也會成功,否則將會得到返回值S_FALSE。如果想將COM庫“温柔的”關閉,每成功調用一次OleInitialize,包括那些返回值為S_FALSE,必須要有一個相對應的對OleUninitialize的調用。 [1] 
如果OleInitialize返回OLE_E_WRONGCOMPOBJ,那麼就説明文件COMPOBJ.DLL或者OLE2.DLL中的任何一個被更新到了一個與其它文件不相匹配的版本。要修正這個問題,將這兩個文件用與當前操作系統對應發行的SDK中的版本替換掉。
由於沒有辦法控制“進程內服務器(in-process server)”載入和卸載的順序。因此不要在DllMain函數中調用OleInitialize和OleUninitialize。 [1] 

OleInitialize需求

Windows NT/2000/XP
需要Windows NT 3.1或者更高的版本
Windows 95/98
需要Windows 95或者更高的版本
頭文件
在ole2.h中聲明 [1] 
導入的庫文件
使用ole32.lib [1] 
Ole32.dll [1] 
參考資料