阅读:2234回复:11
谁会Installshield 啊?还有关于驱动安装100分
1。如何在卸载前执行下我自己的程序,比如,安装时我把a.exe 安装到了安装目录,在卸载前我要先执行一下a.exe 然后再卸载。
2。我做的是网卡驱动程序,已有INF和SYS,且插卡后,WINDOWS认出,要求驱动程序,选择INF,这样的安装是可以的。问题是,怎么样才能先不插卡,先执行我的安装程序,安装完了后再插卡,这时驱动已经正确安装! 好像只能20分,我只能多开几个贴给分! |
|
沙发#
发布于:2004-05-12 10:22
1。如何在卸载前执行下我自己的程序,比如,安装时我把a.exe 安装到了安装目录,在卸载前我要先执行一下a.exe 然后再卸载。 1.好像Installshield里有脚本可以执行的,具体的你看帮助吧 :P 2.你在硬件向导里添加新硬件选择网卡,驱动选择自己的驱动应该可以的,我安装过NE2000的驱动(没有硬件的)成功过! 祝你好运 |
|
|
板凳#
发布于:2004-05-12 10:27
用通知对象,DDK里的FILTER就是这样一个例子,但要达到你的要求还要该改。
|
|
地板#
发布于:2004-05-12 11:05
很感谢你的关注,
1.我也知道,肯定是用Installshield的内部函数,应该就可以做到了,可是我就是不知道该用哪个函数。 2。我的要求是执行我的SETUP这个程序,而不是用添加新硬件,因为这样对用户来说太不友好了。 还是非常谢谢你。 [quote]1。如何在卸载前执行下我自己的程序,比如,安装时我把a.exe 安装到了安装目录,在卸载前我要先执行一下a.exe 然后再卸载。 1.好像Installshield里有脚本可以执行的,具体的你看帮助吧 :P 2.你在硬件向导里添加新硬件选择网卡,驱动选择自己的驱动应该可以的,我安装过NE2000的驱动(没有硬件的)成功过! 祝你好运 [/quote] |
|
地下室#
发布于:2004-05-12 14:18
你在硬件向导里添加新硬件选择网卡,驱动选择自己的驱动应该可以的,我安装过NE2000的驱动(没有硬件的)成功过! NE2000是ISA的驱动,不支持PNP,所以可以没有硬件安装成功。 对于一个支持PNP的设备,好像只能是先插卡再安装驱动。不过可以这样做,在系统弹出对话框要求安装驱动时可以点击取消,然后运行自己的安装程序安装。或者安装程序先把inf文件拷贝到系统目录下的Inf目录下,这样在系统发现新硬件时会找到该INF。下面是自动安装驱动的代码: /************************************************************** * * 名称: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 failed\\n\" ); 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 failed\\n\" ); SetupDiDestroyDeviceInfoList(DeviceInfoSet); return FALSE; } // 添加该设备 if(!SetupDiSetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID, (LPBYTE)HardwareId, (lstrlen(HardwareId)+1+1)*sizeof(TCHAR))) { TRACE( \"Add DeviceRegistryProperty failed\\n\" ); //SetupDiDestroyDeviceInfoList(DeviceInfoSet); //return FALSE; } // 建立关联 if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, DeviceInfoSet, &DeviceInfoData)) { TRACE( \"CallClassInstaller(REGISTERDEVICE)\" ); return FALSE; } // 关联信息都已建立,安装本驱动(以前相当于建立了一个未知的设备) if (!UpdateDriverForPlugAndPlayDevicesA(0, HardwareId, INFFile, INSTALLFLAG_FORCE, RebootRequired)) { // 安装失败,需要把以前的创建的信息删除,否则将会留下一个未知设备 DWORD err = GetLastError(); TRACE( \"UpdateDriverForPlugAndPlayDevices failed\\n\" ); TRACE( \"the errcode is 0x%x\", err ); if (!SetupDiCallClassInstaller( DIF_REMOVE, DeviceInfoSet, &DeviceInfoData)) { TRACE( \"CallClassInstaller(REMOVE) failed \" ); } } else bRet = TRUE; SetupDiDestroyDeviceInfoList(DeviceInfoSet); return bRet; } [编辑 - 5/12/04 by bingjie] |
|
5楼#
发布于:2004-05-12 14:59
惭愧啊!
努力学习!!! |
|
|
6楼#
发布于:2004-05-12 15:33
不论怎么样,谢谢各位的关注。
我先试下。 |
|
7楼#
发布于:2004-05-12 17:08
[quote]你在硬件向导里添加新硬件选择网卡,驱动选择自己的驱动应该可以的,我安装过NE2000的驱动(没有硬件的)成功过! NE2000是ISA的驱动,不支持PNP,所以可以没有硬件安装成功。 对于一个支持PNP的设备,好像只能是先插卡再安装驱动。不过可以这样做,在系统弹出对话框要求安装驱动时可以点击取消,然后运行自己的安装程序安装。或者安装程序先把inf文件拷贝到系统目录下的Inf目录下,这样在系统发现新硬件时会找到该INF。下面是自动安装驱动的代码: /************************************************************** * * 名称: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 failed\\n\" ); 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 failed\\n\" ); SetupDiDestroyDeviceInfoList(DeviceInfoSet); return FALSE; } // 添加该设备 if(!SetupDiSetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID, (LPBYTE)HardwareId, (lstrlen(HardwareId)+1+1)*sizeof(TCHAR))) { TRACE( \"Add DeviceRegistryProperty failed\\n\" ); //SetupDiDestroyDeviceInfoList(DeviceInfoSet); //return FALSE; } // 建立关联 if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, DeviceInfoSet, &DeviceInfoData)) { TRACE( \"CallClassInstaller(REGISTERDEVICE)\" ); return FALSE; } // 关联信息都已建立,安装本驱动(以前相当于建立了一个未知的设备) if (!UpdateDriverForPlugAndPlayDevicesA(0, HardwareId, INFFile, INSTALLFLAG_FORCE, RebootRequired)) { // 安装失败,需要把以前的创建的信息删除,否则将会留下一个未知设备 DWORD err = GetLastError(); TRACE( \"UpdateDriverForPlugAndPlayDevices failed\\n\" ); TRACE( \"the errcode is 0x%x\", err ); if (!SetupDiCallClassInstaller( DIF_REMOVE, DeviceInfoSet, &DeviceInfoData)) { TRACE( \"CallClassInstaller(REMOVE) failed \" ); } } else bRet = TRUE; SetupDiDestroyDeviceInfoList(DeviceInfoSet); return bRet; } 不好意思,虽然我写NDIS驱动也有年头了,也用过像snetcfg这样的DDK例子程序,但是却没有调试过DDK中应用层的程序,我把函数放在VC工程里,然后把.h.lib 复制到当前目录,可是还是编译不能通过,好像是找不到函数体(SetupDiCallClassInstaller等),不知道你的这个函数怎么调试的? 还有,我没有插卡时,把INF和SYS放到WINDOWS的INF,SYS32里(SetupCopyOEMInf),关机,可是插上硬件后起来,却还是有“Found New Hardware” wizard 出来。不知道有谁知道这是怎么回事?我的卡是PCI的网卡。 Lonny McMichael的书上好像说,应该如下做,可是我第一步和第4步没有完全弄明白,谁能解释下,万分感谢。 Device-specific co-installer 1。SetupCopyOEMInf 2。UpdateDriverForPlugAndPlayDevices 3。CMP_WaitNoPendingInstallEvents Suppress autorun when CD is inserted for Found New Hardware” wizard 4。Supply “finish-install” wizard page(s) 5。Separate core driver files from value-add software Core driver files installed via stand-alone Plug and Play device INF Value-add software authored in MSI [编辑 - 5/12/04 by bingjie] [/quote] |
|
8楼#
发布于:2004-05-12 17:09
不好意思,虽然我写NDIS驱动也有年头了,也用过像snetcfg这样的DDK例子程序,但是却没有调试过DDK中应用层的程序,我把函数放在VC工程里,然后把.h.lib 复制到当前目录,可是还是编译不能通过,好像是找不到函数体(SetupDiCallClassInstaller等),不知道你的这个函数怎么调试的?
还有,我没有插卡时,把INF和SYS放到WINDOWS的INF,SYS32里(SetupCopyOEMInf),关机,可是插上硬件后起来,却还是有“Found New Hardware” wizard 出来。不知道有谁知道这是怎么回事?我的卡是PCI的网卡。 Lonny McMichael的书上好像说,应该如下做,可是我第一步和第4步没有完全弄明白,谁能解释下,万分感谢。 Device-specific co-installer 1。SetupCopyOEMInf 2。UpdateDriverForPlugAndPlayDevices 3。CMP_WaitNoPendingInstallEvents Suppress autorun when CD is inserted for Found New Hardware” wizard 4。Supply “finish-install” wizard page(s) 5。Separate core driver files from value-add software Core driver files installed via stand-alone Plug and Play device INF Value-add software authored in MSI |
|
9楼#
发布于:2004-05-12 17:21
不好意思,虽然我写NDIS驱动也有年头了,也用过像snetcfg这样的DDK例子程序,但是却没有调试过DDK中应用层的程序,我把函数放在VC工程里,然后把.h.lib 复制到当前目录,可是还是编译不能通过,好像是找不到函数体(SetupDiCallClassInstaller等),不知道你的这个函数怎么调试的? 需要链接setupapi.lib newdev.lib ,这两个lib文件在DDK里可以找到 |
|
10楼#
发布于:2004-05-14 15:02
求教:我和前面的有一样的问题,可是是在98上安装modem,我也有inf,可是我在98上找不到newdev.lib,所以用不了UpdateDriverForPlugAndPlayDevices这个函数,各位大侠有没有对应的函数可以用在win98上呀??
|
|
11楼#
发布于:2004-05-17 08:34
[quote]不好意思,虽然我写NDIS驱动也有年头了,也用过像snetcfg这样的DDK例子程序,但是却没有调试过DDK中应用层的程序,我把函数放在VC工程里,然后把.h.lib 复制到当前目录,可是还是编译不能通过,好像是找不到函数体(SetupDiCallClassInstaller等),不知道你的这个函数怎么调试的? 需要链接setupapi.lib newdev.lib ,这两个lib文件在DDK里可以找到 [/quote] 周末过的真快,我使用了这2个LIB和.H,可是还是不行,好像是连接时出错了,找不到函数体!不知道你是怎么弄得? |
|