OleInitialize

OleInitialize是一個Windows API函式。它的作用是在當前單元(apartment)初始化組件對象模型(COM)庫,將當前的併發模式標識為STA(single-thread apartment——單執行緒單元),並啟用一些特別用於OLE技術的額外功能。除了CoGetMalloc和記憶體分配函式,應用程式必須在調用COM庫函式之前初始化COM庫。

不需要OleInitialize函式所啟用的額外功能的應用程式應該調用CoInitializeEx來代替OleInitialize。

基本介紹

函式形式,返回值,說明,需求,

函式形式

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

返回值

這個函式除了支持標準的返回值E_INVALIDARG,E_OUTOFMEMORY和E_UNEXPECTED之外還可能產生以下返回值:
返回值
說明
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的轉換。

說明

使用以下功能的應用程式必須在調用其它任何COM庫中的函式前調用OleInitialize函式,這些功能是:
OleInitialize函式將在其內部調用CoInitializeEx函式從而在當前單元初始化COM庫。由於OLE操作執行緒不安全,因此OleInitialize函式將指明併發模式為STA。這也就意味著只有一個特定的執行緒(通過調用OleInitialize而創建單元的執行緒)可以直接訪問單元內部的對象。試圖在其它執行緒訪問該對象通常會導致訪問衝突。
其它執行緒中訪問STA的COM對象出現的異常其它執行緒中訪問STA的COM對象出現的異常
一旦一個單元的併發模式被設定,它將不能被更改。在之前已經初始化為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
Ole32.dll

相關詞條

熱門詞條

聯絡我們