CM_Get_Device_Interface_ListW函数 (cfgmgr32.h)

CM_Get_Device_Interface_List 函数检索属于指定 设备接口类的设备接口实例列表

语法

CMAPI CONFIGRET CM_Get_Device_Interface_ListW(
  [in]           LPGUID      InterfaceClassGuid,
  [in, optional] DEVINSTID_W pDeviceID,
  [out]          PZZWSTR     Buffer,
  [in]           ULONG       BufferLen,
  [in]           ULONG       ulFlags
);

参数

[in] InterfaceClassGuid

提供标识设备接口类的 GUID。

[in, optional] pDeviceID

调用方提供的指向 NULL 终止字符串的指针,该字符串表示 设备实例 ID。 如果指定,该函数将检索设备为指定类支持的设备接口。 如果此值 NULL,或者如果该值指向零长度字符串,则该函数将检索属于指定类的所有接口。

[out] Buffer

调用方提供的指向接收多个 NULL 终止的 Unicode 字符串的缓冲区的指针,每个字符串表示接口实例的符号链接名称。

[in] BufferLen

调用方提供的值,该值指定由 缓冲区指向的缓冲区的长度(以字符为单位)。 调用 CM_Get_Device_Interface_List_Size 以确定所需的缓冲区大小。

[in] ulFlags

包含以下调用方提供的标志之一:

CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES

该函数提供一个列表,其中包含与与指定 GUID 和设备实例 ID 匹配的所有设备关联的设备接口(如果有)。

CM_GET_DEVICE_INTERFACE_LIST_PRESENT

该函数提供一个列表,其中包含与当前处于活动状态的设备关联的设备接口,以及与指定的 GUID 和设备实例 ID 匹配(如果有)。

返回值

如果操作成功,该函数将返回CR_SUCCESS。 否则,它将返回 Cfgmgr32.h中定义的CR_前缀的错误代码之一。

下表包含此函数可能返回的一些更常见的错误代码。

返回代码 描述
CR_BUFFER_SMALL
缓冲区 缓冲区太小,无法容纳请求的设备接口列表。

言论

在调用 CM_Get_Device_Interface_List_Size 以获取列表的大小和调用 CM_Get_Device_Interface_List 以获取列表之间,可以将新的设备接口添加到系统中,导致返回的大小不再有效。  如果 CM_Get_Device_Interface_List 返回 CR_BUFFER_SMALL,则调用方应对该条件保持可靠,然后重试获取大小和列表。

例子

此代码片段演示如何重试获取大小和列表,如“备注”部分中所述。

    CONFIGRET cr = CR_SUCCESS;
    PWSTR DeviceInterfaceList = NULL;
    ULONG DeviceInterfaceListLength = 0;

    do {
        cr = CM_Get_Device_Interface_List_Size(&DeviceInterfaceListLength,
                                               (LPGUID)&GUID_DEVINTERFACE_VOLUME,
                                               NULL,
                                               CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES);

        if (cr != CR_SUCCESS)
        {
            break;
        }

        if (DeviceInterfaceList != NULL) {
            HeapFree(GetProcessHeap(),
                     0,
                     DeviceInterfaceList);
        }

        DeviceInterfaceList = (PWSTR)HeapAlloc(GetProcessHeap(),
                                               HEAP_ZERO_MEMORY,
                                               DeviceInterfaceListLength * sizeof(WCHAR));

        if (DeviceInterfaceList == NULL)
        {
            cr = CR_OUT_OF_MEMORY;
            break;
        }

        cr = CM_Get_Device_Interface_List((LPGUID)&GUID_DEVINTERFACE_VOLUME,
                                          NULL,
                                          DeviceInterfaceList,
                                          DeviceInterfaceListLength,
                                          CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES);
    } while (cr == CR_BUFFER_SMALL);

    if (cr != CR_SUCCESS)
    {
        goto Exit;
    }

注意

cfgmgr32.h 标头将CM_Get_Device_Interface_List定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 Microsoft Windows 2000 及更高版本的 Windows 中可用。
目标平台 普遍
标头 cfgmgr32.h (包括 Cfgmgr32.h)
Cfgmgr32.lib
DLL CfgMgr32.dll

另请参阅

CM_Get_Device_Interface_List_Size