阅读:6558回复:13
如何制作虚拟设备驱动的自动安装程序
我以前的虚拟设备驱动是通过“添加/删除硬件”->其它设备来添加的,工作正常。现在我想做一个自动安装的exe。但是我的虚拟设备没有hwID,UpdateDriverForPlugAndPlayDevices()和Devcon都没法用,请哪位大侠指点一下,虚拟设备的自动安装该如何做!
|
|
最新喜欢:![]() |
沙发#
发布于:2004-05-09 14:31
我在installshield中使用了
szProgram = \"rundll.exe\"; szCmdLine = \"setupx.dll,InstallHinfSection DefaultInstall 132 \" + SUPPORTDIR + \"test.inf\"; LaunchAppAndWait(szProgram, szCmdLine, WAIT); 但是,installshield老是报错,“setupx.dll出错,项目丢失”,请问,该如何处理啊! |
|
板凳#
发布于:2004-05-10 17:08
关注中。。。。
|
|
|
地板#
发布于:2004-05-11 09:17
请问,你是xp么?怎么使用,具体一点讲下,我比你还abc,是不是空的驱动程序框架也可以这么做?
|
|
地下室#
发布于:2004-06-11 09:04
关注
|
|
5楼#
发布于:2004-06-11 16:37
搂主:
Devcon是什么东东,从哪儿获得? |
|
6楼#
发布于:2004-06-14 08:33
DDK XP带的安装程序的例子, 在src\setup里面
|
|
7楼#
发布于:2004-06-25 22:09
愚见:
1、可以给虚拟设备指定一个硬件ID,即在其inf文件中的Models节中指定一个硬件id。 2、建议用DDK\\src\\setup\\install试试。 我曾经用它安装过“Writing Windows WDM Device Driver”中的wdm1.sys。 |
|
|
8楼#
发布于:2004-06-29 09:02
我在installshield中使用了 ;)强烈关注。 查看不少贴子,都没有说明白的,好遗憾。 |
|
9楼#
发布于:2004-07-09 10:56
1。在INF中总是指定一个HardwareID,这个ID可以随便起的,无所谓的,只是安装时用
2。通过HardwareID查找要安装的设备是否已安装 3。如果已安装过则直接调用UpdateWDM...函数 4.否则使用以下代码 /************************************************************** * * 名称:InstallWDMDriver * 功能:安装WDM驱动 * 参数:HardwareId: 字符串描述的完整的设备ID * INFFile: Inf安装文件 * RebootRequired: 是否需要重启的标志 * 返回:成功返回TRUE,失败返回FALSE * ****************************************************************/ EXTERN_C BOOL WINAPI InstallWDMDriver( IN LPCTSTR HardwareId, IN LPCTSTR INFFile, OUT PBOOL RebootRequired OPTIONAL ) { HDEVINFO DeviceInfoSet = 0; SP_DEVINFO_DATA DeviceInfoData; GUID ClassGUID; TCHAR ClassName[MAX_CLASS_NAME_LEN]; BOOL bRet = FALSE; AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 首先从Inf文件中得到设备类GUID if (!SetupDiGetINFClass((LPTSTR)INFFile,&ClassGUID,ClassName,sizeof(ClassName),0)) { TRACE( "Get INF Class GUID failedn" ); return FALSE; } DeviceInfoSet = SetupDiCreateDeviceInfoList(&ClassGUID,0); if(DeviceInfoSet == INVALID_HANDLE_VALUE) { TRACE( "Create DeviceInfoSet failed" ); return FALSE; } // 打开该设备所属的类 DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); if (!SetupDiCreateDeviceInfo(DeviceInfoSet, ClassName, &ClassGUID, NULL, 0, DICD_GENERATE_ID, &DeviceInfoData)) { TRACE( "CreateDeviceInfo failedn" ); SetupDiDestroyDeviceInfoList(DeviceInfoSet); return FALSE; } // 添加该设备 if(!SetupDiSetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID, (LPBYTE)HardwareId, (lstrlen(HardwareId)+1+1)*sizeof(TCHAR))) { TRACE( "Add DeviceRegistryProperty failedn" ); //SetupDiDestroyDeviceInfoList(DeviceInfoSet); //return FALSE; } // 建立关联 if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, DeviceInfoSet, &DeviceInfoData)) { TRACE( "CallClassInstaller(REGISTERDEVICE)" ); return FALSE; } // 关联信息都已建立,安装本驱动(以前相当于建立了一个未知的设备) if (!UpdateDriverForPlugAndPlayDevices(0, HardwareId, INFFile, INSTALLFLAG_FORCE, RebootRequired)) { // 安装失败,需要把以前的创建的信息删除,否则将会留下一个未知设备 DWORD err = GetLastError(); TRACE( "UpdateDriverForPlugAndPlayDevices failedn" ); TRACE( "the errcode is 0x%x", err ); if (!SetupDiCallClassInstaller( DIF_REMOVE, DeviceInfoSet, &DeviceInfoData)) { TRACE( "CallClassInstaller(REMOVE) failed " ); } } else bRet = TRUE; SetupDiDestroyDeviceInfoList(DeviceInfoSet); return bRet; } [编辑 - 7/9/04 by bingjie] [编辑 - 7/9/04 by bingjie] |
|
10楼#
发布于:2004-07-09 13:11
虽然我已会了,但还是放分给你。
|
|
11楼#
发布于:2004-07-14 11:16
用这段代码就可以实现了吗?
希望sinking兄再详细介绍一下过程吧,谢谢 |
|
12楼#
发布于:2008-01-14 18:49
顶一下。对于虚拟设备来说,如上代码好像不行。。。
|
|
|
13楼#
发布于:2009-11-06 20:24
回 9楼(bingjie) 的帖子
能不能给我看看打印机驱动安装我的程序报错:1797 未知打印机驱动程序 |
|