2012-09-13 17 views
7

मुझे अपने प्रोग्राम में एक साधारण फ़ंक्शन के साथ कोई समस्या है, उस फ़ंक्शन (नीचे सूचीबद्ध) को हार्डवेयर आईडी आईडी के साथ डिवाइस ढूंढना चाहिए और फिर इसे चालू/चालू करें। इसे पाता है लेकिन फिर मुझे त्रुटि मिलती है, और GetLastError() एमएसडीएन रेंज में वर्णित मूल्य से बाहर मूल्य देता है। मैंने टिप्पणी के साथ कोड में त्रुटि चिह्नित की। यदि कोई इसे देख रहा है तो SetupDiCallClassInstaller() से परिचित है कृपया मदद करें। मुझे नहीं पता कि उस त्रुटि को कहां खोजना है और यदि यह कोड गलती या सिस्टम एनवी है। मैं विंडोज 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

तो त्रुटि कोड क्या है? (दोह!) – atzz

+0

और 'FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, ...)' से संदेश क्या है? – MSalters

+0

यदि मैंने इसे सही तरीके से उपयोग किया है तो यह लौटाता है: "(शून्य) बंद" और त्रुटि कोड संख्या 37580 9 6 9 4 9 है, जो गायब होने के लिए sry ..; डी – 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

क्या इस कोड को निष्पादित करने के बाद इसे पुनरारंभ करना आवश्यक था क्योंकि मैं मेरे लिए डीएम में डिवाइस परिवर्तनों की एक ही कोड स्थिति लागू कर रहा हूं लेकिन मुझे सिस्टम को पुनरारंभ करने की आवश्यकता है – bhupinder

संबंधित मुद्दे