Direct3DCreate9Ex
IDirect3D9Ex オブジェクトを作成し、それに対するインターフェイスを返します。
HRESULT
Direct3DCreate9Ex(
UINT SDKVersion,
IDirect3D9EX **ppD3D
);
パラメータ
- SDKVersion
このパラメーターの値は、D3D_SDK_VERSION でなければなりません。「解説」を参照してください。 - ppD3D
作成された IDirect3D9Ex オブジェクトを示す、IDirect3D9Ex インターフェイスへのポインターのアドレスです。この関数が失敗すると、NULL がここに挿入されます。
戻り値
- D3DERR_NOTAVAILABLE - Direct3DEx 機能がサポートされていない (WDDM ドライバーがインストールされていない) 場合または SDKVersion が DLL のバージョンに一致していない場合。
- D3DERR_OUTOFMEMORY - 列挙子オブジェクトの作成時に、メモリー不足状態が検出された場合。
- S_OK - 列挙子オブジェクトの作成に成功した場合。
解説
IDirect3D9Ex オブジェクトは、アプリケーションで最初に作成し、最後に解放するオブジェクトです。デバイスの能力を列挙および取得するための関数には、IDirect3D9Ex オブジェクトを介してアクセスできます。これにより、アプリケーションは、デバイスを作成することなくデバイスを選択できます。
IDirect3D9Ex インターフェイスは、アクティブなディスプレイ アダプターの列挙をサポートしており、IDirect3D9Ex オブジェクトを作成できます。(デスクトップに対するデバイスの追加またはラップトップのホットドッキングにより) ユーザーがアダプターを動的に追加した場合、それらのデバイスは列挙に含まれません。新しい IDirect3D9Ex インターフェイスを作成すると、該当する新しいデバイスが公開されます。
D3D_SDK_VERSION フラグをこの関数に渡すと、コンパイルされたアプリケーションで使用されるヘッダー ファイルが、インストールされているランタイム DLL のバージョンに一致します。D3D_SDK_VERSION はランタイムの際、ヘッダーまたは他のコードの変更によってアプリケーションの再ビルドが必要になる場合にのみ変更されます。この関数が失敗した場合、ヘッダー ファイルのバージョンとランタイム DLL のバージョンが一致していないことを示しています。
注 Direct3DCreate9Ex は、Windows Vista、Windows Server 2008、および Windows 7 でのみサポートされています。D3D9.dll ライブラリの以前のバージョンには、Direct3D9Ex および Direct3DCreate9Ex は含まれません。
例
A. IDirect3D9Ex オブジェクトの作成
Direct3DCreate9Ex を使用して IDirect3D9Ex オブジェクトを作成する方法を、次のコード例で示します。この例で、IDirect3D9Ex オブジェクトを使用して作成している IDirect3DDevice9Ex オブジェクトは、該当する関数に出力パラメーターとして返されます。HRESULT InitD3D9Ex( /* IN */ HWND hWnd, /* OUT */ IDirect3DDevice9Ex ** ppD3DDevice ) { HRESULT hr = E_FAIL; IDirect3D9Ex * pD3D = NULL; IDirect3DDevice9Ex * pDevice = NULL; if(ppD3DDevice == NULL) { return hr; } // Create the D3D object, which is needed to create the D3DDevice. if(FAILED(hr = Direct3DCreate9Ex( D3D_SDK_VERSION, &pD3D ))) { *ppD3DDevice = NULL; return hr; } // Set up the structure used to create the D3DDevice. D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; // Create the Direct3D device. if( FAILED( hr = pD3D->CreateDeviceEx( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, NULL, &pDevice ) ) ) { *ppD3DDevice = NULL; return hr; } // Device state would normally be set here *ppD3DDevice = pDevice; return hr; }
B. Direct3D9Ex のチェック
次のコード例では、Direct3DCreate9Ex の存在をチェックし、それがサポートされていないプラットフォーム上では異常終了する方法を示しています。このようなコードをゲームのラウンチャーで使用すると、ユーザーにエラー メッセージを表示したり、IDirect3D9 インターフェイスを代わりに使用するレンダラーをロードしたりできます。Direct3DCreate9Ex をチェックするために、この例では Win32 LoadLibrary 関数を使用して D3D9.dll ライブラリを明示的にロードしています。その後、Win32 GetProcAddress 関数を使用して、Direct3DCreate9Ex のアドレスをポインターに代入しています。Direct3DCreate9Ex が存在しない場合は、関数ポインターが NULL になり、コード例では、ERROR_NOT_SUPPORTED HRESULT という値が返されます。ただし、Direct3DCreate9Ex が存在していると、S_OK 値が返されます。
HRESULT CheckD3D9Ex( void ) { HRESULT hr = E_FAIL; HMODULE libHandle = NULL; // Manually load the d3d9.dll library. libHandle = LoadLibrary(L"d3d9.dll"); if(libHandle != NULL) { // Define a function pointer to the Direct3DCreate9Ex function. typedef HRESULT (WINAPI *LPDIRECT3DCREATE9EX)( UINT, void **); // Obtain the address of the Direct3DCreate9Ex function. LPDIRECT3DCREATE9EX Direct3DCreate9ExPtr = NULL; Direct3DCreate9ExPtr = (LPDIRECT3DCREATE9EX)GetProcAddress( libHandle, "Direct3DCreate9Ex" ); if ( Direct3DCreate9ExPtr != NULL) { // Direct3DCreate9Ex is supported. hr = S_OK; } else { // Direct3DCreate9Ex is not supported on this // operating system. hr = ERROR_NOT_SUPPORTED; } // Free the library. FreeLibrary( libHandle ); } return hr; }
拡張バージョンが継承されるので、IDirect3DDevice9Ex インターフェイス ポインターを IDirect3DDevice9 インターフェイス ポインターにキャストすることもできます。これにより、既存の Direct3D 9 コードを使用して拡張デバイスを使用することができます (ただし、新しいデバイスでインターフェイスのセマンティクスを変更する場合を除く)。これら 2 つのインターフェイスの相違点の詳細については、「デバイスの動作の変更」を参照してください。
要件
ヘッダー: D3D9.h 宣言
ライブラリ: D3D9.lib 内容