建立COM對象
有幾種方法可以用來建立COM對象。有兩種最常用的方法用來建立DirectX程式,他們是:
1、直接方式。通過傳遞對象的CLSID給CoCreateInstance函數。這個函數建立對象的一個執行個體,並且返回你所指定的那個介面的指標。
2、間接方式。通過呼叫DirectX的一個方法或一個函數來為你建立一個對象。這個方法建立一個對象並且返回在這個對象上的一個介面。當你通過這種方式建立一個對象的時候,通常你不能指定返回那一個介面。
在建立任何對象之前,COM必須呼叫CoInitialize函數進行初始化。假如你用間接的方法建立一個對象,建立這個對象的方法將會自動執行這個初始化。假如你用CoCreateInstance建立這個對象
,你必須明確的呼叫CoInitialize以便進行初始化。當不再使用對象的時候,COM必須呼叫CoUninitialize進行清除初始化。假如你呼叫了CoInitialize,你就必須成對的呼CoUninitialize
.通常,應用程式需要在它的啟動常式裡面初始化COM對象,而在清除常式裡面卸載COM對象。
用CoCreateInstance新建立一個COM對象的案例,你必須有對象的CLSID。假如CLSID是公開可以使用的,你可以在參考文檔或適當的標頭檔中找到它。假如CLSID不是公開使用的,那麼你就不能用這種直接的方式建立這個對象。
CoCreateInstance這個函數有5個參數。COM將被用於DirectX,通常,你能像下面那樣設定這些參數:
●rclsid參數:這個參數設定你想建立的那個對象的CLSID.
●pUnkOuter參數:這個參數設定為NULL.當你彙總對象時,這個對象被使用。
●dwClsContext參數:這個參數設定為CLSCTX_INPROC_SERVER.這樣設定這個參數表明這個對象在DLL中被實現,它將作為程式進程的一部分被運行。
●riid參數:這個參數設定你想要返回的介面的IID。這個函數將建立一個對象,並且在ppv這個參數中返回你所請求的介面的指標。
●ppv參數:在這個函數返回的時候,這個參數存放在riid中指定的那個介面的指標的地址。這個變數應該被聲明為指向請求介面的指標。
例如:下面的程式碼片段建立了一個DirectPlay8的對象的執行個體,並且在g_pDP變數中返回一個指向IDirectPlay8Peer介面的指標。假如出現錯誤,將顯示一個對話方塊,並且程式終止運行。
IDirctPlay8Peer * g_pDP = NULL ;
...
CoInitialize( NULL ) ;
...
hr = CoCreatInstance( CLSID_DirectPlay8, NULL, CLSCTX_INPROC_SERVER,
IID_IDirectPlay8Peer, (LPVOID *)&g_pDP ) ;
if( FAILED( hr ) )
{
MessageBox( NULL, TEXT( "Failed Creating IDirectPlay8Peer." ),
TEXT( "DirectPlay Sample" ), MB_OK | MB_ICONERROR ) ;
return FAISE ;
}
用間接的方法建立一個對象非常的簡單。只需將一個介面的指標傳遞給建立這個對象的方法即可。然後這個方法就會建立這個對象並且返回指向這個介面的指標。當你用間接的方法建立一個對象的時候,通常你不能選擇返回哪一個介面,然而,你卻可以指定如何建立這個對象的一些事情。例如:下面的程式碼片段呼叫IDirect3D8::CreateDevice方法論述建立一個裝置對象用來代表顯示適配器。它將返回一個指向對象的IDirect3DDevice8介面的指標。這個函數的前4個參數提供了建立這個對象所需要的各種資訊,第5個參數用來接受介面指標。要得到更詳細的資訊請參考文檔。
IDirect3DDevice8 *g_pd3dDevice = NULL ;
...
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&g_pd3dDevice )))
return E_FAIL ;
注: 由於翻譯水平有限,錯誤在所難免。如發現翻譯的不對的地方還請路上的朋友指正,謝謝
可以任意轉載。
譯者: closeall
2005.09.04 譯