创建自定义属性页

设备属性页提供程序 处理为其设备或设备类创建属性页的请求时,提供程序应执行以下步骤:

  1. 调用 SetupDiGetClassInstallParams 以获取设备的当前类安装参数。 例如:

    SP_ADDPROPERTYPAGE_DATA AddPropertyPageData;
    :
    ZeroMemory(&AddPropertyPageData, sizeof(SP_ADDPROPERTYPAGE_DATA));
    AddPropertyPageData.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
    
    if (SetupDiGetClassInstallParams(DeviceInfoSet, DeviceInfoData,
         (PSP_CLASSINSTALL_HEADER)&AddPropertyPageData,
         sizeof(SP_ADDPROPERTYPAGE_DATA), NULL )) {
    ...
    

    在此示例中,代码零初始化将返回设备安装参数的结构,并将 cbSize 字段中的类安装标头的大小设置为 SetupDiGetClassInstallParams 所需的大小。 类安装标头是每个类安装参数结构的第一个成员。

  2. 使用如下语句确保尚未满足设备的最大动态页数:

    if (AddPropertyPageData.NumDynamicPages < 
        MAX_INSTALLWIZARD_DYNAPAGES)
     ...
    

    如果测试失败,请不要初始化或创建页面。 而是返回NO_ERROR。

  3. 分配内存,以便保存稍后在对话框过程中需要的任何特定于设备的数据,并使用数据初始化此内存。 当属性页被销毁时,提供程序必须在其属性页回调中释放此内存。

    对于共同安装程序的提供程序,此特定于设备的数据必须包括随 DIF_ADDPROPERTYPAGE_ADVANCED 设备安装函数传递的 DeviceInfoSetDeviceInfoData (DIF) 代码。

    例如,属性页提供程序可以定义和使用结构,如以下示例所示:

    typedef struct _TEST_PROP_PAGE_DATA {
        HDEVINFO DeviceInfoSet;
        PSP_DEVINFO_DATA DeviceInfoData;
    } TEST_PROP_PAGE_DATA, *PTEST_PROP_PAGE_DATA;
    ...
    PTEST_PROP_PAGE_DATA     pMyPropPageData;
    ...
    pMyPropPageData = HeapAlloc(GetProcessHeap(), 0, sizeof(TESTPROP_PAGE_DATA));
    
  4. 使用有关自定义属性页的信息初始化 PROPSHEETPAGE 结构:

    • dwFlags 中,设置自定义属性页所需的PSP_USECALLBACK标志和任何其他标志。 PSP_USECALLBACK标志指示已提供回调函数。
    • pfnCallback 中,设置指向属性页的回调函数的指针。 在回调中,处理PSPCB_RELEASE消息并释放步骤 3 中分配的内存。
    • pfnDlgProc 中,设置指向属性页的对话框过程的指针。
    • lParam 中,将指针传递到在步骤 3 中分配和初始化的内存区域。
    • 根据自定义属性页设置其他成员。 有关 PROPSHEETPAGE 结构的详细信息,请参阅Microsoft Windows SDK文档。
  5. 调用 CreatePropertySheetPage 创建新页面。

  6. 将新页添加到类安装参数的 DynamicPages 成员中的动态属性页列表,并递增 NumDynamicPages 成员。

  7. 对每个附加的自定义属性页重复步骤 2 到 6。

  8. 调用 SetupDiSetClassInstallParams 以设置新的类安装参数,其中包括更新的属性页结构。

  9. 返回NO_ERROR。

Windows 将新创建的属性页添加到设备的属性表,设备管理器进行 Microsoft Win32 API 调用来创建工作表。 显示属性页时,系统会调用 PROPSHEETPAGE 结构中指定的对话框过程。