Здравствуйте Misha-5, Вы писали:
M5>Теперь о неприятностях: каким образом вызывается скомпилированный коинсталлер (и как правильно его описать в .inf файле драйвера) и как он выводит окно (или регистрирует property page) — не понимаю.
M5>И что плохо, нигде не смог найти ни единого примера, даже отдаленно похожего, чтобы хоть за что-то зацепиться..
M5>Если кто сможет, помогите пожалуйста советом.
M5>Misha-5
Существует 2 способа добавить страничку свойств в Device Manager.
В class regkey для твоего класса устройств прописываешь строчку EnumPropPages32 = "myproppageprovider.dll, MyPropPageProvider", эта DLL соответвенно экспортирует функцию MyPropPageProvider (если экспортируемая функция называется "EnumPropPages", то в реестре ее явно после запятой указывать не обязательно). Прототип вотBOOL CALLBACK MyPropPageProvider(PSP_PROPSHEETPAGE_REQUEST pInfo, LPFNADDPROPSHEETPAGE pfnAddFunc, LPARAM lParam);
Примеры этого способа имеются в DDK, посмотри например src/setup/pnpports
Этот способ хорошо подходит если ты для своих устройств зарегистрировал новый класс. В противном случае смотри способ 2
В свой inf добавляешь регистрацию coinstallera, то есть
[MyDeviceInstall.nt.CoInstallers]
AddReg=CoInstaller.AddReg
[CoInstaller.AddReg]
HKR,,CoInstallers32,0x00010000,"mycoinst.dll, MyCoDeviceInstall"
Опять же если экспортируемая функция называется CoDeviceInstall, то ее явно после запятой указывать не обязательно.
А в самом coinstaller'е обрабатываешь DIF_ADDPROPERTYPAGE_ADVANCED примерно так:
#pragma comment (linker, "/export:MyCoDeviceInstall=_MyCoDeviceInstall@16")
extern "C" DWORD CALLBACK MyCoDeviceInstall(
DI_FUNCTION func,
HDEVINFO hDevInfoSet,
PSP_DEVINFO_DATA pDevInfoData,
PCOINSTALLER_CONTEXT_DATA pContext)
{
...
switch(func)
{
...
case DIF_ADDPROPERTYPAGE_ADVANCED:
SP_ADDPROPERTYPAGE_DATA AddPropertyPageData;
memset(&AddPropertyPageData, 0, sizeof(SP_ADDPROPERTYPAGE_DATA));
AddPropertyPageData.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
AddPropertyPageData.ClassInstallHeader.InstallFunction = DIF_ADDPROPERTYPAGE_ADVANCED;
if (!SetupDiGetClassInstallParams(
hDevInfoSet, pDevInfoData,
(PSP_CLASSINSTALL_HEADER)&AddPropertyPageData,
sizeof(SP_ADDPROPERTYPAGE_DATA), NULL) ||
AddPropertyPageData.NumDynamicPages + N >= MAX_INSTALLWIZARD_DYNAPAGES)
{
TRACE("(ERROR) Unable to add proppages - MAX_INSTALLWIZARD_DYNAPAGES reached\n");
break;
}
AddPropertyPageData.DynamicPages[AddPropertyPageData.NumDynamicPages++] = CreatePropertySheetPage(...);
AddPropertyPageData.DynamicPages[AddPropertyPageData.NumDynamicPages++] = CreatePropertySheetPage(...);
if (!SetupDiSetClassInstallParams(
hDevInfoSet, pDevInfoData,
(PSP_CLASSINSTALL_HEADER)&AddPropertyPageData,
sizeof(SP_ADDPROPERTYPAGE_DATA)))
{
TRACE("(ERROR) Unable to add proppages - SetupDiSetClassInstallParams failed\n");
// destroy created pages
break;
}
break;
...
}
...
}