shuiyuntian888
驱动牛犊
驱动牛犊
  • 注册日期2003-10-14
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3645回复:3

急!!!VC编程安装驱动的一个问题!

楼主#
更多 发布于:2003-10-15 14:21
下面的代码在win2003下运行正常,但在win2k下运行报错,是怎么回事?(调用时报SetupDiSetDeviceRegistryProperty参数出错)
请问sHardwareId参数有什么限制,怎样定义?

m_sHardwareId.Format(\"root\\\\%s\",DriverFileName);
if(InstallRootEnumeratedDriver((LPTSTR)(LPCTSTR)m_sHardwareId,(LPTSTR)(LPCTSTR)m_sPath,&bRebootRequred))
{
AfxMessageBox(\"安装成功!\");
}


BOOL CDrvSetupDlgDlg::InstallRootEnumeratedDriver(IN  LPTSTR HardwareId,
    IN  LPTSTR INFFile,
    OUT PBOOL  RebootRequired  OPTIONAL
    )
{
    HDEVINFO DeviceInfoSet = 0;
    SP_DEVINFO_DATA DeviceInfoData;
    GUID ClassGUID;
    TCHAR ClassName[MAX_CLASS_NAME_LEN];
    DWORD err;

    if (!SetupDiGetINFClass(INFFile,&ClassGUID,ClassName,sizeof(ClassName),0))
    {
        return DisplayError(TEXT(\"GetINFClass\"));
    }
    
    DeviceInfoSet = SetupDiCreateDeviceInfoList(&ClassGUID,0);
    if(DeviceInfoSet == INVALID_HANDLE_VALUE)
    {
        return DisplayError(TEXT(\"CreateDeviceInfoList\"));
    }

    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    if (!SetupDiCreateDeviceInfo(DeviceInfoSet,
        ClassName,
        &ClassGUID,
        NULL,
        0,
        DICD_GENERATE_ID,
        &DeviceInfoData))
    {
        DisplayError(TEXT(\"CreateDeviceInfo\"));
        goto cleanup_DeviceInfo;
    }

unsigned long lCount;
lCount = (lstrlen(HardwareId)+1)*sizeof(TCHAR);

    if(!SetupDiSetDeviceRegistryProperty(DeviceInfoSet,&DeviceInfoData,SPDRP_HARDWAREID,(LPBYTE)HardwareId,lCount))
    {
        DisplayError(TEXT(\"SetDeviceRegistryProperty\"));
        goto cleanup_DeviceInfo;
    }
    
    //
    // Transform the registry element into an actual devnode
    // in the PnP HW tree.
    //
    if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE,
        DeviceInfoSet,
        &DeviceInfoData))
    {
        DisplayError(TEXT(\"CallClassInstaller(REGISTERDEVICE)\"));
        goto cleanup_DeviceInfo;
    }

    if (!UpdateDriverForPlugAndPlayDevices(0,
        HardwareId,
        INFFile,
        INSTALLFLAG_FORCE,
        RebootRequired))
    {
        DWORD err = GetLastError();
        DisplayError(TEXT(\"UpdateDriverForPlugAndPlayDevices\"));
        
        if (!SetupDiCallClassInstaller(
            DIF_REMOVE,
            DeviceInfoSet,
            &DeviceInfoData))
        {
            DisplayError(TEXT(\"CallClassInstaller(REMOVE)\"));
        }
        SetLastError(err);
    }
    
    //
    //  Cleanup.
    //    
cleanup_DeviceInfo:
    err = GetLastError();
    SetupDiDestroyDeviceInfoList(DeviceInfoSet);
    SetLastError(err);
    
    return err == NO_ERROR;
}
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2003-10-20 14:55
可能你调用了WINXP以后才支持API,仔细看看DDK说明吧.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
shuiyuntian888
驱动牛犊
驱动牛犊
  • 注册日期2003-10-14
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-21 12:05
能说具体点吗?最好举个例子
而且我这代码在VC中,用对话框程序编译运行就报错;用控制台程序DEBUG编译的程序运行时也报错,RELEASE编译的程序运行时就很正常!
fulsz
驱动牛犊
驱动牛犊
  • 注册日期2003-03-29
  • 最后登录2004-09-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-11-03 10:27
unsigned long lCount;
lCount = (lstrlen(HardwareId)+1)*sizeof(TCHAR);

if(!SetupDiSetDeviceRegistryProperty(DeviceInfoSet,&DeviceInfoData,SPDRP_HARDWAREID,(LPBYTE)HardwareId,lCount))

问题通常出在参数lCount上,你换个方法。想办法让HardwareId中没有数据的部分都为0(例如,Memset(HardwareId, 0, sizeof(HardwareId)),然后再设定HardwardId。可以用strcat实现。参数lCount就设定为sizeof(HardwareId);
天行健,君子以厚德载物; 地势坤,君子以自强不息。
游客

返回顶部