Direct3DCreate9Ex 函数 (d3d9.h)

创建 IDirect3D9Ex 对象并返回该对象的接口。

语法

HRESULT Direct3DCreate9Ex(
  [in]  UINT         SDKVersion,
  [out] IDirect3D9Ex **unnamedParam2
);

参数

[in] SDKVersion

类型: UINT

D3D_SDK_VERSION此参数的值。 请参阅“备注”。

[out] unnamedParam2

类型: IDirect3D9Ex**

指向 IDirect3D9Ex 接口的指针的地址,该接口表示创建的 IDirect3D9Ex 对象。 如果函数失败,则在此处插入 NULL

返回值

类型: HRESULT

  • 如果 不支持 Direct3DEx 功能, () 未安装 WDDM 驱动程序,或者 SDKVersion 与 DLL 的版本不匹配,则D3DERR_NOTAVAILABLE。
  • 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 库的早期版本不包括 Direct3D9ExDirect3DCreate9Ex
 

示例

创建 IDirect3D9Ex 对象。

下面的代码示例演示如何使用 Direct3DCreate9Ex 创建 IDirect3D9Ex 对象。 然后,此示例使用 IDirect3D9Ex 对象创建 IDirect3DDevice9Ex 对象,该对象作为 out 参数返回到函数。

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;
}

检查 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 代码一起使用,除非新设备更改了接口的语义。 有关两个接口之间的差异的详细信息,请参阅 设备行为更改

要求

   
目标平台 Windows
标头 d3d9.h
Library D3d9.lib
DLL D3d9.dll

请参阅

Direct3D 函数