当 设备属性页提供程序 处理为其设备或设备类创建属性页的请求时,提供程序应执行以下步骤:
调用 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 所需的大小。 类安装标头是每个类安装参数结构的第一个成员。
使用如下语句确保尚未满足设备的最大动态页数:
if (AddPropertyPageData.NumDynamicPages < MAX_INSTALLWIZARD_DYNAPAGES) ...如果测试失败,请不要初始化或创建页面。 而是返回NO_ERROR。
分配内存,以便保存稍后在对话框过程中需要的任何特定于设备的数据,并使用数据初始化此内存。 当属性页被销毁时,提供程序必须在其属性页回调中释放此内存。
对于共同安装程序的提供程序,此特定于设备的数据必须包括随 DIF_ADDPROPERTYPAGE_ADVANCED 设备安装函数传递的 DeviceInfoSet 和 DeviceInfoData (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));使用有关自定义属性页的信息初始化 PROPSHEETPAGE 结构:
- 在 dwFlags 中,设置自定义属性页所需的PSP_USECALLBACK标志和任何其他标志。 PSP_USECALLBACK标志指示已提供回调函数。
- 在 pfnCallback 中,设置指向属性页的回调函数的指针。 在回调中,处理PSPCB_RELEASE消息并释放步骤 3 中分配的内存。
- 在 pfnDlgProc 中,设置指向属性页的对话框过程的指针。
- 在 lParam 中,将指针传递到在步骤 3 中分配和初始化的内存区域。
- 根据自定义属性页设置其他成员。 有关 PROPSHEETPAGE 结构的详细信息,请参阅Microsoft Windows SDK文档。
调用 CreatePropertySheetPage 创建新页面。
将新页添加到类安装参数的 DynamicPages 成员中的动态属性页列表,并递增 NumDynamicPages 成员。
对每个附加的自定义属性页重复步骤 2 到 6。
调用 SetupDiSetClassInstallParams 以设置新的类安装参数,其中包括更新的属性页结构。
返回NO_ERROR。
Windows 将新创建的属性页添加到设备的属性表,设备管理器进行 Microsoft Win32 API 调用来创建工作表。 显示属性页时,系统会调用 PROPSHEETPAGE 结构中指定的对话框过程。