2012-09-13 17 views
7

Programımdaki basit bir işlevle ilgili bir sorunum var, bu işlev (aşağıda listelenen), cihazı HardwareId kimliğiyle bulmalı ve sonra kapatıp açmalı. Onu bulur ama sonra hata alıyorum ve GetLastError() msdn aralığında açıklanan değerden döndürür. Yorumla kodda hata yaptım. Bunu gören herhangi biri SetupDiCallClassInstaller() ile tanışıyorsa lütfen yardım edin. Bu hatayı nerede arayacağımı bilmiyorum ve kod hatası veya sistem env ise. Windows 7 64-bit kullanıyorum ve bu programı yönetici olarak çalıştırıyorum.Disable device

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

Yardımlarınız için teşekkürler.

+0

Hata kodu nedir? (Doh!) – atzz

+0

Ve FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, ...) 'dan gelen mesaj nedir? – MSalters

+0

Doğru kullanmış olsaydım: "(null) kapalı" ve hata kodu numarası 3758096949'dur, eksik olduğu için ...: D – user1668674

cevap

13

Hatanızın HEX sürümü 0xE0000235. SetupAPI.h dosyasında bu haritaların ERROR_IN_WOW64 olduğunu görebiliyoruz.

this MSDN thread'a bakarsanız, bu sorunu yaşayan diğer kişileri de görebilirsiniz. Yaklaşık 1/3 Sayfanın altındaki yol Maarten van de Bospoort MSFT bu yanıt verir:

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

bu gibi görünüyor

senin sorunun nedeni, sen pencerelerin 64-bit sürümünü kullanıyor, ama 32-bit bir süreçten çağırıyor. 64-bit için derlemeyi deneyin.

+0

Bu yardımcı oldu. Ben 64 bit olarak derledim (tür döküm için küçük değişiklikler ile) ve çalıştı. Çok teşekkürler! – user1668674

+0

, bu kodu yürüttükten sonra yeniden başlatmayı gerektirdi çünkü benim için DM'de bu aynı kodun cihaz değişiklikleri durumunu uygulamıyorum, ancak sistemi yeniden başlatmamı gerektiriyor – bhupinder

İlgili konular