2013-02-08 3 views
0

이 코드는 주로 Microsoft 자습서에서 얻은 코드를 사용하여 컴퓨터의 모든 배터리 장치 이름을 가져 오려고하는데 작동하지 않습니다.배터리 장치 이름 가져 오기

#define INITGUID 
#include <windows.h> 
#include<batclass.h> 
#include<setupapi.h> 
#define GBS_HASBATTERY 0x1 
#define GBS_ONBATTERY 0x2 
#include<iostream> 

using namespace std; 

int main() 
{ 
DWORD dwResult = GBS_ONBATTERY; 
HDEVINFO hdev = SetupDiGetClassDevs(&GUID_DEVICE_BATTERY, 0, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); 

for (int idev = 0; idev < 100; idev++) 
{ 
    SP_DEVICE_INTERFACE_DATA did = {0}; 
    did.cbSize = sizeof(did); 

    if (SetupDiEnumDeviceInterfaces(hdev, 0, &GUID_DEVICE_BATTERY, idev, &did)) 
    { 
    DWORD cbRequired = 0; 
    SetupDiGetDeviceInterfaceDetail(hdev, &did, 0, 0, &cbRequired, 0); 

    if (ERROR_INSUFFICIENT_BUFFER == GetLastError()) 
    { 
     PSP_DEVICE_INTERFACE_DETAIL_DATA pdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR,cbRequired); 

     if (pdidd) 
     { 
     pdidd->cbSize = sizeof(*pdidd); 

     if (SetupDiGetDeviceInterfaceDetail(hdev,&did,pdidd,cbRequired,&cbRequired,0)) 
     { 
      HANDLE hBattery = CreateFile(pdidd->DevicePath,GENERIC_READ | GENERIC_WRITE, 
      FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 

      if (INVALID_HANDLE_VALUE != hBattery) 
      { 
      BATTERY_QUERY_INFORMATION bqi = {0}; 

      DWORD dwWait = 0; 
      DWORD dwOut; 

      if (DeviceIoControl(hBattery, 
           IOCTL_BATTERY_QUERY_TAG, 
           &dwWait, 
           sizeof(dwWait), 
           &bqi.BatteryTag, 
           sizeof(bqi.BatteryTag), 
           &dwOut, 
           NULL) 
       && bqi.BatteryTag) 
      {////////////////////////////////////////problem around here/////// 
       string bi; 
       bqi.InformationLevel = BatteryDeviceName; 
       if (DeviceIoControl(hBattery, 
            IOCTL_BATTERY_QUERY_INFORMATION, 
            &bqi, 
            sizeof(bqi), 
            &bi, 
            sizeof(bi), 
            &dwOut, 
            NULL)) 
      { 
       cout<<bi; 

        BATTERY_WAIT_STATUS bws = {0}; 
        bws.BatteryTag = bqi.BatteryTag; 

        BATTERY_STATUS bs; 
        if (DeviceIoControl(hBattery, 
             IOCTL_BATTERY_QUERY_STATUS, 
             &bws, 
             sizeof(bws), 
             &bs, 
             sizeof(bs), 
             &dwOut, 
             NULL)) 
        { 
        if (bs.PowerState & BATTERY_POWER_ON_LINE) 
        { 
         dwResult &= ~GBS_ONBATTERY; 
        } 
        } 
       } 
      } 
      CloseHandle(hBattery); 
      } 
     } 
     LocalFree(pdidd); 
     } 
    } 
    } 
    else if (ERROR_NO_MORE_ITEMS == GetLastError()) 
    { 
     break; 
    } 
} 
SetupDiDestroyDeviceInfoList(hdev); 
} 

내가 모든 배터리의 이름을 인쇄하기 위해 노력하고 있어요,하지만 난 전혀 아무것도 인쇄 나던 프로그램을 실행할 때

도와주세요 내가 문자열 BatteryDeviceName 대신 battery_information 구조를 요청할 때, 그것은 그러나 작동합니까
+0

후자 어쩌면 직접 액세스를 사용하여 OS를 가져 오기 위해 사용 어쩌면 전? OS의 드라이버에 결함이있을 수 있습니다. –

+0

어쩌면 나는 그 문제를 생각하지 않는다. –

+0

나는 왜 당신이 컴파일러 오류를 얻지 못하는지 알 수 없다. 넓은 문자열로 작업 할 API 함수를 사용하여'std :: string'과'std :: cout' (좁은 문자 버전)을 사용하려고합니다. –

답변

3

DeviceIoControl 전화가 잘못되었습니다. 당신은 쓰레기를 버리고 쓰레기를 버릴 때 쓰레기를 버립니다.

string bi; 

if(DeviceIoControl(hBattery, 
        IOCTL_BATTERY_QUERY_INFORMATION, 
        bqi, 
        sizeof(bqi), 
        &bi,   // Really?!?!?! 
        sizeof(bi), // WHAT?!? 
        &dwOut, 
        NULL)) 

당신은 std::string을 아무것도에 대해 알고 그것을 쓸 수있는 원시 버퍼의 ADRESS을 기대하는 DeviceIoControl에 주소에게 std::string 객체를 전달합니다. 최소한 버퍼에 맞는 크기를 지정해야하지만, 어떤 의미에서는 잘못된 것입니다. 기본적으로 그 함수가 돌아 오면 그 std::string은 쓰레기입니다. 프로그램에 충돌이 생겨서 스피커에서 Vivaldi를 재생하는 것에서 액세스 할 수 있습니다. 이 같은

시도 뭔가 :

WCHAR szBuf[_MAX_PATH] = { 0 }; // In a real program you'd dynamically 
           // allocate an appropriately sized buffer 
           // instead. 

if(DeviceIoControl(hBattery, 
         IOCTL_BATTERY_QUERY_INFORMATION, 
         bqi, 
         sizeof(bqi), 
         szBuf, 
         sizeof(szBuf), 
         &dwOut, 
         NULL)) 
+0

내 배터리 이름은 내가 가지고있어 L09S6Y02이 보통이다 –

+2

나는 당신의 배터리를 모른다. 그러나 그것은 합리적인 이름처럼 보인다. Windows에서 장치 관리자의 배터리 이름으로 표시되는지 확인해야합니다. –

+0

어떤 설정을 적용할까요? –

관련 문제