OleInitialize

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_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而創建單元的執行緒)可以直接訪問單元內部的對象。試圖在其它執行緒訪問該對象通常會導致訪問衝突。一旦一個單元的併發模式被設定,它將不能被更改。在之前已經初始化為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

DLL

Ole32.dll

相關詞條

熱門詞條

聯絡我們