2012-09-13 35 views
7

Tôi gặp sự cố với chức năng đơn giản trong chương trình của mình, chức năng đó (được liệt kê bên dưới) sẽ tìm thiết bị có mã số HardwareId rồi bật/tắt. Nó tìm thấy nó nhưng sau đó tôi nhận được lỗi, và GetLastError() trả về giá trị trong số được mô tả trong phạm vi msdn. Tôi đã đánh dấu lỗi trong mã với nhận xét. Nếu bất cứ ai nhìn thấy điều này là quen thuộc với SetupDiCallClassInstaller(), vui lòng trợ giúp. Tôi không biết nơi để tìm kiếm lỗi đó và nếu nó là lỗi mã hoặc hệ thống env. Tôi đang sử dụng Windows 7 64-bit và chạy chương trình này với tư cách quản trị viên.Tắt thiết bị

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; 
} 

Cảm ơn bạn đã trợ giúp.

+0

Vậy mã lỗi là gì? (Doh!) – atzz

+0

Và thông điệp từ 'FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, ...)' là gì? – MSalters

+0

Nếu tôi sử dụng nó một cách chính xác nó trả về: "(null) tắt" và mã số lỗi là 3758096949, sry cho mất tích đó ..; D – user1668674

Trả lời

13

Phiên bản HEX lỗi của bạn là 0xE0000235. Nhìn vào SetupAPI.h chúng ta có thể thấy rằng bản đồ này tới ERROR_IN_WOW64.

Nếu bạn nhìn vào this MSDN thread bạn có thể thấy những người khác gặp sự cố này. Khoảng 1/3 các con đường xuống trang Maarten van de Bospoort MSFT đáp ứng với điều này:

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

Có vẻ như đây là nguyên nhân của vấn đề của bạn, bạn đang ở trên một phiên bản 64-bit của Windows, nhưng gọi nó từ quy trình 32 bit. Hãy thử biên dịch cho 64-bit.

+0

Điều đó đã giúp. Tôi biên dịch nó thành 64 bit (với ít thay đổi về mã cho các kiểu đúc) và nó hoạt động. Cảm ơn rất nhiều! – user1668674

+0

đã yêu cầu khởi động lại sau khi thực thi mã này vì tôi đang triển khai cùng trạng thái mã này của các thiết bị thay đổi trong DM cho tôi nhưng nó yêu cầu tôi phải khởi động lại hệ thống – bhupinder

Các vấn đề liên quan