D3DKMTGetSharedPrimaryHandle 函数 (d3dkmthk.h)

D3DKMTGetSharedPrimaryHandle 函数检索主图面的全局共享句柄。

语法

NTSTATUS D3DKMTGetSharedPrimaryHandle(
  D3DKMT_GETSHAREDPRIMARYHANDLE *unnamedParam1
);

参数

unnamedParam1

pData [in, out]

指向 D3DKMT_GETSHAREDPRIMARYHANDLE 结构的指针,该结构描述检索共享句柄所需的参数。

返回值

D3DKMTGetSharedPrimaryHandle 返回以下值之一:

返回代码 描述
STATUS_SUCCESS 已成功检索句柄。
STATUS_DEVICE_REMOVED 图形适配器已停止或显示设备已重置。
STATUS_INVALID_PARAMETER 参数已验证并确定不正确。

此函数可能还会返回其他 NTSTATUS 值。

言论

每次显示模式更改时,主图面通常由 Microsoft DirectX 图形内核子系统(Dxgkrnl.sys)创建(尽管在某些情况下,共享主数据库可能不存在)。 如果 OpenGL 应用程序尝试创建主图面,则它通常必须打开现有的共享主数据库。 若要打开共享主数据库,OpenGL 应用程序必须使用 D3DKMTGetSharedPrimaryHandle 来检索主图面的全局共享句柄。

示例

下面的代码示例演示 OpenGL ICD 如何使用 D3DKMTGetSharedPrimaryHandle 打开共享句柄来创建主图面。

HRESULT OpenSharedPrimarySurface(D3DKMT_HANDLE hAdapter,
                                 D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId,
                                 D3DKMT_HANDLE hDevice, 
                                 VOID* pPrivateDriverData,
                                 UINT PrivateDriverDataSize,
                                 D3DKMT_HANDLE* phResource,
                                 D3DKMT_HANDLE* phAllocation)
{
    D3DKMT_CREATEALLOCATION CreateAllocation;
    D3DDDI_ALLOCATIONINFO AllocationInfo;
    D3DKMT_GETSHAREDPRIMARYHANDLE GetHandleData;

    *phResource = 0;
    *phAllocation = 0;

    // Get the shared handle.
    GetHandleData.hAdapter = hAdapter;
    GetHandleData.VidPnSourceId = VidPnSourceId;

    if (!NT_SUCCESS((*pfnKTGetSharedPrimaryHandle)(&GetHandleData))) {
        return E_FAIL;
    }

    // Was a shared primary created by the kernel?
    if (GetHandleData.hSharedPrimary == NULL) {
        return E_FAIL;
    }

    CreateAllocation.hDevice = hDevice;
    CreateAllocation.hResource = NULL;
    CreateAllocation.hGlobalShare = GetHandleData.hSharedPrimary;
    CreateAllocation.Flags.CreateResource = 
    CreateAllocation.Flags.CreateShared = TRUE;
    CreateAllocation.pPrivateRuntimeData = NULL;
    CreateAllocation.PrivateRuntimeDataSize = 0;
    CreateAllocation.pPrivateDriverData = NULL;
    CreateAllocation.PrivateDriverDataSize = 0;
    CreateAllocation.NumAllocations = 1;
    CreateAllocation.pAllocationInfo = &AllocationInfo;

    AllocationInfo.hAllocation = NULL;
    AllocationInfo.pSystemMem = NULL;
    AllocationInfo.pPrivateDriverData = pPrivateData;
    AllocationInfo.PrivateDriverDataSize = PrivateDataSize;

    if (NT_SUCCESS((*pfnKTCreateAllocation)(&CreateAllocation))) {
        *phResource = CreateAllocation.hResource;
        *phAllocation = AllocationInfo.hAllocation;
        return S_OK;
    }
    return E_FAIL;
}

要求

要求 价值
最低支持的客户端 Windows Vista
目标平台 普遍
标头 d3dkmthk.h (包括 D3dkmthk.h)
Gdi32.lib
DLL Gdi32.dll

另请参阅

D3DKMT_GETSHAREDPRIMARYHANDLE