-
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
OleInitialize返回值
返回值 | 説明 |
---|---|
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説明
- 拖放操作
- 實地激活(In-place activation)
OleInitialize函數將在其內部調用CoInitializeEx函數從而在當前單元初始化COM庫。由於OLE操作線程不安全,因此OleInitialize函數將指明併發模式為STA。
[1]
這也就意味着只有一個特定的線程(通過調用OleInitialize而創建單元的線程)可以直接訪問單元內部的對象。
[2]
試圖在其它線程訪問該對象通常會導致訪問衝突。
通常的來説,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或者更高的版本 |
頭文件 | |
導入的庫文件 | |
- 參考資料
-
- 1. OleInitialize 函數 .MSDN[引用日期2013-03-14]
- 2. 理解與使用COM線程模型 .MSDN[引用日期2013-03-14]