2012-09-13 37 views
7

我得在我的节目一个简单的功能的问题,即功能(如下所示)应与硬件ID ID找到设备,然后将其关闭/开启。它发现,但后来我得到错误,并GetLastError函数()返回值超出MSDN中描述的范围内。我在代码中用注释标记错误。如果有人看到这个熟悉SetupDiCallClassInstaller()请帮忙。我不知道要在哪里搜索该错误,以及它是代码错误还是系统环境。我正在使用Windows 7 64位并以管理员身份运行此程序。禁用设备

bool DisableInterface(bool bStatus) { 
IN LPTSTR HardwareId;  
HardwareId = L"DAUDIO\\FUNC_01&VEN_10DE&DEV_0018&SUBSYS_10DE0101"; 

DWORD NewState ; 

if(bStatus) { 
    NewState = DICS_DISABLE; 
} 
else { 
    NewState = DICS_ENABLE; 
} 


DWORD i, err; 
bool found = false; 

HDEVINFO hDevInfo; 
SP_DEVINFO_DATA spDevInfoData ; 

hDevInfo=SetupDiGetClassDevs(NULL, 0, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT); 
if(hDevInfo == INVALID_HANDLE_VALUE) 
{ 
    printf("blad1"); 
    return false; 
} 

spDevInfoData.cbSize=sizeof(SP_DEVINFO_DATA); 
for(i=0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++) 
{ 
    DWORD DataT; 
    LPTSTR p, buffer = NULL; 
    DWORD buffersize = 0; 

    // get all devices info 
    while(!SetupDiGetDeviceRegistryProperty(hDevInfo, 
              &spDevInfoData, 
              SPDRP_HARDWAREID, 
              &DataT, 
              (PBYTE)buffer, 
              buffersize, 
              &buffersize)) 
    { 
     if(GetLastError() == ERROR_INVALID_DATA) {  
      break ; 
     } 
     else if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {  
      if(buffer) 
       LocalFree(buffer); 
      buffer = (wchar_t*)LocalAlloc(LPTR,buffersize); 
     } 
     else { 
      goto cleanup_DeviceInfo; 
     } 
    } 

    if(GetLastError() == ERROR_INVALID_DATA) 
     continue; 

    //find device with HardwerId 
    for(p = buffer; *p && (p<&buffer[buffersize]) ; p += lstrlen(p) + sizeof(TCHAR)) { 
     if(!_tcscmp(HardwareId, p)) { 
      found = true; 
      break; 
     } 
    } 

    if(buffer) 
     LocalFree(buffer); 

    // if device found change it's state 
    if(found) 
    { 
     SP_PROPCHANGE_PARAMS params; 

     params.ClassInstallHeader.cbSize=sizeof(SP_CLASSINSTALL_HEADER); 
     params.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE ; 
     params.Scope=DICS_FLAG_GLOBAL ; 
     params.StateChange = NewState ; 

     // setup proper parameters    
     if(!SetupDiSetClassInstallParams(hDevInfo, &spDevInfoData, &params.ClassInstallHeader, sizeof(params))) { 
      DWORD errorcode = GetLastError(); 
     } 

     // use parameters 
     if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &spDevInfoData)) { 
      DWORD errorcode = GetLastError(); // error here 
     } 

     switch(NewState) { 
      case DICS_DISABLE : 
       printf("off"); 
       break; 
      case DICS_ENABLE : 
       printf("on"); 
       break; 
     } 

     break; 
    } 

} 

cleanup_DeviceInfo : 
err = GetLastError(); 
SetupDiDestroyDeviceInfoList(hDevInfo); 
SetLastError(err); 

return true; 
} 

感谢您的帮助。

+0

那么错误代码是什么? (Doh!) – atzz

+0

来自'FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,...)'的消息是什么? – MSalters

+0

如果我正确地使用它,它返回:“(空)关闭”和错误代码号为3758096949,SRY失踪的..; d – user1668674

回答

13

您的错误的十六进制版本是0xE0000235。查看SetupAPI.h,我们可以看到它映射到ERROR_IN_WOW64。

如果你看看你this MSDN thread可以看到其他人有这个问题。约1/3的一路下跌的页面马腾范·德·Bospoort MSFT这个回应:

The error is because you’re calling SetupDiCallClassInstaller from a x86 process on a x64 machines. 

好像这是你的问题的原因,您使用的是Windows的64位版本,但是从32位进程调用它。尝试编译为64位。

+0

这帮助。我将它编译为64位(对于类型转换的代码只有很小的变化),它工作。非常感谢! – user1668674

+0

执行此代码后需要重新启动吗,因为我正在为DM执行此设备更改的相同代码状态,但它需要我重新启动系统 – bhupinder