С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 23.07.2013
Сообщений: 7

Просмотр информации о батарее ноутбука

23.07.2013, 22:57. Показов 2636. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет Возможно кто-то знает и поможет в таком вопросе:
нужно получить инфо о батарее - напряжение , ёмкость и т.д. естестыенно в C++ builder 6 - уже 2 дня голову ломаю а получилось только вот такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <vcl.h>
 #include <winbase.h>
#include <windows.h>
#include <PowrProf.h>
#pragma hdrstop
#include "Unit1.h"
 SYSTEM_POWER_STATUS status;     //ñòðóêòóðà äàííûõ
char life; //çàðÿä â ïðîöåíòàõ
char stat,bat; //ñòàòóñ, òèï ïèòàíèÿ
char has,min,sec;
char secs,fulltime,tim,h; //ñåêóíäû,ìàêñèìàë âðåìÿ,ìèíóòû,÷àñû
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  GetSystemPowerStatus( &status ); //ïîëó÷àåì è çàïîëíÿåì ñòðóêòóðó ïîëó÷åíûìè äàííûìè
life = status.BatteryLifePercent;//ïðîöåíò çàðÿäà áàòàðåè
secs = status.BatteryLifeTime;//ñêîëüêî âðåìåíè õâàòèò áàòàðåè äëÿ ðàáîòû
stat=status.BatteryFlag; //ñòàòóñ áàòàðåè
bat=status.ACLineStatus; //òèï ïèòïíèÿ 1- ñåòü 0- áàòàðåÿ
 
tim=secs/60;
h=tim/60;
 
Label1->Caption= "Çàðÿä:"+IntToStr(life)+"%"+" Âðåìÿ:"+IntToStr(h)+":"+IntToStr(tim);
Label2->Caption= "Ñòàòóñ:"+IntToStr(stat);
if(bat==1)Label3->Caption="Îò ñåòè";
if(bat==0)Label3->Caption="Îò áàòàðåè";
Label4->Caption="Çàðÿä = "+IntToStr(life)+"%"; 
 
}
Тут всё просто и работает отлично, но хотелось бы получить более детальную информацию - напряжение, ёмкость ну и др. параметры батареи.
Искал гуглом но толком ничего подобного не нашёл - тока ссылки на сайт msdn и т.п. Где-то на форумах говорили что нужно использовать Win32_Battery class, а как никто не говорит. Подскажите или покажите как получить более подробную инфу? Может через туже API можно как то?

PS: проект прилагаю - может кому пригодится
Вложения
Тип файла: rar New.rar (340.7 Кб, 15 просмотров)
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.07.2013, 22:57
Ответы с готовыми решениями:

Получение информации о батарее
Пишу программу для получения информации о батарее ноутбука. Использую, в основном, только DeviceIoControl(). Получаю практически всю...

Просмотр текстовой информации
Здравствуйте! Подскажите пожалуйста, как сделать так, что-бы при выполнении кода: def showrecords(): # Records recordstable =...

БД и просмотр информации из таблицы
Начал изучать С# и попытался создать программу в которой можно вести учет населения. Создал таблицу id (первичный ключ), ФИО, номер...

9
1 / 1 / 0
Регистрация: 23.07.2013
Сообщений: 7
24.07.2013, 20:51  [ТС]
Неужели никто не знает?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
24.07.2013, 22:07
Для получения вольтажа и остальных подобных характеристик, тебе нужно воспользоваться вот этим + DeviceIoControl.

Пример есть на social.msdn.microsoft.com
1
1 / 1 / 0
Регистрация: 23.07.2013
Сообщений: 7
25.07.2013, 00:23  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Для получения вольтажа и остальных подобных характеристик, тебе нужно воспользоваться вот этим + DeviceIoControl.

Пример есть на social.msdn.microsoft.com
Спасибо, завтра попробую разобраться с этим
0
1 / 1 / 0
Регистрация: 23.07.2013
Сообщений: 7
28.07.2013, 17:28  [ТС]
Попробовал использовать пример из выше указаного источника, в итоге получил - ничего, даже имя CreateFile неудаётся получит... но возможно я что-то нетак делаю?
вот код что получился у меня:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//---------------------------------------------------------------------------
#define INITGUID
#include <vcl.h>
 
#include "windows.h"
#include "setupapi.h"
#include "devguid.h"
#include "stdio.h"
#include <winioctl.h>
#include <PowrProf.h>
#include <batclass.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 AnsiString str1;
 
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ListBox1->Clear();
    HANDLE hBattDevices[100];
      HDEVINFO                            hBattClassInfo;
    PSP_DEVICE_INTERFACE_DETAIL_DATA    lpInterfaceDetailData = NULL;
    SP_DEVICE_INTERFACE_DATA            spInterfaceData;
    DWORD                               dwInterfaceDetailDataSize;
    DWORD                               dwReqSize;
    DWORD                               dwErrCode;
    BOOL                                bStatus = TRUE;
 
    // ïîëó÷èòå ìàðêåð êëàññà óñòðîéñòâà äëÿ ïîðòîâ áàòàðåè â ñèñòåìå
    hBattClassInfo = SetupDiGetClassDevs(
        (LPGUID)&GUID_DEVICE_BATTERY,
        NULL,
        NULL,
        DIGCF_PRESENT|DIGCF_DEVICEINTERFACE
        );
 
    if (hBattClassInfo == INVALID_HANDLE_VALUE)
    {
        ListBox1->Items->Add("hBattClassInfo bad:"+IntToStr(hBattClassInfo));
    }
    else
    {
      ListBox1->Items->Add("hBattClassInfo ok:"+IntToStr(hBattClassInfo));
             // ñ ìàðêåðîì êëàññà óñòðîéñòâà ìû ìîæåì òåïåðü ïåðå÷èñëèòü ïóòè ê ïîðòàì áàòàðåè
 
        UINT uiPortIndex = 0;
        spInterfaceData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);
 
        for ( ;
            SetupDiEnumDeviceInterfaces( hBattClassInfo, 0, (LPGUID)&GUID_DEVICE_BATTERY, uiPortIndex, &spInterfaceData );
            uiPortIndex++ )
        {
            //Òåïåðü ó íàñ åñòü äàííûå èíòåðôåéñà äëÿ òåêóùåãî ïîðòà áàòàðåè
            //×òîáû ïîëó÷èòü åãî ïóòü, ìû äîëæíû ïðåâðàòèòü äâà çàïðîñà â SetupDiGetDeviceInterfaceDetail. Ïåðâûé çàïðîñ
            //îïðåäåëÿåò áóôåðíûé ðàçìåð, òðåáóåìûé äåðæàòü èíôîðìàöèþ äåòàëè èíòåðôåéñà
 
            bStatus = SetupDiGetDeviceInterfaceDetail(
                hBattClassInfo,        // Interface Device info handle
                &spInterfaceData,      // Interface data for the event class
                NULL,                  // Checking for buffer size
                0,                     // Checking for buffer size
                &dwReqSize,            // Buffer size required to get the detail data
                NULL                   // Checking for buffer size
                );
 
            // Ðàñïðåäåëèòå ïàìÿòü, ÷òîáû ïîëó÷èòü äàííûå äåòàëè èíòåðôåéñà, êîòîðûå áóäóò ñîäåðæàòü ïóòü íà óñòðîéñòâî ïîðòà áàòàðåè
            dwInterfaceDetailDataSize = dwReqSize;
            lpInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc( LMEM_ZEROINIT, dwInterfaceDetailDataSize);
 
                ListBox1->Items->Add("lpInterfaceDetailData:"+IntToStr(lpInterfaceDetailData));
 
            lpInterfaceDetailData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
 
             ListBox1->Items->Add("size lpInterfaceDetailData:"+IntToStr(lpInterfaceDetailData->cbSize));
 
            bStatus = SetupDiGetDeviceInterfaceDetail(
                hBattClassInfo,//ìàðêåð èíôîðìàöèè Óñòðîéñòâà Èíòåðôåéñà
                &spInterfaceData,//äàííûå Èíòåðôåéñà äëÿ êëàññà ñëó÷àÿ
                lpInterfaceDetailData,//Èíòåðôåéñ äåòàëèçèðóþò äàííûå
                dwInterfaceDetailDataSize,//Èíòåðôåéñ äåòàëèçèðóþò ðàçìåð äàííûõ
                &dwReqSize,//Áóôåðíûé ðàçìåð, òðåáóåìûé ïîëó÷èòü ïîäðîáíûå äàííûå
                NULL);// èíôîðìàöèÿ óñòðîéñòâà Èíòåðôåéñà
              ListBox1->Items->Add("bStatus:"+IntToStr(bStatus));
 
            if ( hBattDevices != 0 )
            {
             ListBox1->Items->Add("uiPortIndex:"+IntToStr(uiPortIndex));
                //  Òåïåðü äàâàéòå ïûòàòüñÿ îòêðûòü óñòðîéñòâî áàòàðåè
                hBattDevices[uiPortIndex] =  CreateFile(
                    lpInterfaceDetailData->DevicePath,       // èìÿ óñòðîéñòâà
                    GENERIC_READ | GENERIC_WRITE,            // dwDesiredAccess
                    FILE_SHARE_READ | FILE_SHARE_WRITE,      // dwShareMode
                    NULL,                                    // lpSecurityAttributes
                    OPEN_EXISTING,                           // dwCreationDistribution
                    0,                                       // dwFlagsAndAttributes
                    NULL                                     // hTemplateFile
                    );
              str1 = lpInterfaceDetailData->DevicePath;
               ListBox1->Items->Add("CreateFile:"+IntToStr(uiPortIndex) + str1);
 
              if(hBattDevices[uiPortIndex] == INVALID_HANDLE_VALUE){ListBox1->Items->Add("Íåâîçìîæíî îòêðûòü óñòðîéñòâî!");}
 else{ListBox1->Items->Add("Óñòðîéñòâî îòêðûòî!");}
            }
            // we're done with the buffer, so free it
            LocalFree(lpInterfaceDetailData);
        } // END FOR
 
    }
     ListBox1->Items->Add("hBattDevices:"+IntToStr(hBattDevices));
}
ListBox использую для проверки сработки условий...
вот скрин работы.
как бы правильно это всё прикрутить?
Миниатюры
Просмотр информации о батарее ноутбука  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
28.07.2013, 18:20
Научатся программисты когда-нибудь обрабатывать ошибки, или нет?

Во-первых, после первого вызова SetupDiGetDeviceInterfaceDetail, дальнейшие действия целесообразны только в том случае, если:
C++
1
2
3
4
if(!bStatus && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
    // ... Вот именно в этом случае dwReqSize содержит требуемый размер буфера
}
. Далее, если CreateFile вернула INVALID_HANDLE_VALUE, вызываешь GetLastError() для получения дополнительной информации о причинах ошибки, а не просто выводишь сообщение "Невозможно открыть устройство". У этой невозможности есть причина. Вот эту причину (в виде результата GetLastError) и хотелось бы увидеть. Проверить твой код не могу, по одной простой причине: я ноутами не пользуюсь... А попытка проверить его на десктопной машине окончится плачевно...
0
1 / 1 / 0
Регистрация: 23.07.2013
Сообщений: 7
28.07.2013, 19:22  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Научатся программисты когда-нибудь обрабатывать ошибки, или нет?
ну я только начинающий - на будущее учту
Цитата Сообщение от UI Посмотреть сообщение
Во-первых, после первого вызова SetupDiGetDeviceInterfaceDetail, дальнейшие действия целесообразны только в том случае, если:
Код C++
if(!bStatus && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
// ... Вот именно в этом случае dwReqSize содержит требуемый размер буфера
}
не пойму куда это условие поставить в моей программе, весь цикл?
после не успешного открытия файла функция GetLastError() возращает ноль...
C++
1
2
ErrCode = GetLastError();
 ListBox1->Items->Add("Êîä îøèáêè: "+IntToStr(ErrCode));
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
28.07.2013, 21:22
Цитата Сообщение от MEGA-ART Посмотреть сообщение
весь цикл?
Зачем же весь цикл? Часть его, после первого вызова SetupDiGetDeviceInterfaceDetail:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
    // получите маркер класса устройства для портов батареи в системе
    hBattClassInfo = SetupDiGetClassDevs(
        (LPGUID)&GUID_DEVICE_BATTERY,
        NULL,
        NULL,
        DIGCF_PRESENT|DIGCF_DEVICEINTERFACE
        );
 
    if (hBattClassInfo == INVALID_HANDLE_VALUE)
    {
        ListBox1->Items->Add("hBattClassInfo bad:"+IntToStr((int)hBattClassInfo));
    }
    else
    {
        ListBox1->Items->Add("hBattClassInfo ok:"+IntToStr((int)hBattClassInfo));
        // с маркером класса устройства мы можем теперь перечислить пути к портам батареи
 
        UINT uiPortIndex = 0;
        spInterfaceData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);
        for ( ;
            SetupDiEnumDeviceInterfaces( hBattClassInfo, 0, (LPGUID)&GUID_DEVICE_BATTERY, uiPortIndex, &spInterfaceData );
            uiPortIndex++ )
        {
            //Теперь у нас есть данные интерфейса для текущего порта батареи
            //Чтобы получить его путь, мы должны превратить два запроса в SetupDiGetDeviceInterfaceDetail. Первый запрос
            //определяет буферный размер, требуемый держать информацию детали интерфейса
 
            bStatus = SetupDiGetDeviceInterfaceDetail(
                hBattClassInfo,        // Interface Device info handle
                &spInterfaceData,      // Interface data for the event class
                NULL,                  // Checking for buffer size
                0,                     // Checking for buffer size
                &dwReqSize,            // Buffer size required to get the detail data
                NULL                   // Checking for buffer size
                );
 
            if(!bStatus && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
            {
                // Распределите память, чтобы получить данные детали интерфейса, которые будут содержать путь на устройство порта батареи
                dwInterfaceDetailDataSize = dwReqSize;
                lpInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc( LMEM_ZEROINIT, dwInterfaceDetailDataSize);
 
                ListBox1->Items->Add("lpInterfaceDetailData:"+IntToStr((int)lpInterfaceDetailData));
 
                lpInterfaceDetailData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
                ListBox1->Items->Add("size lpInterfaceDetailData:"+IntToStr((int)lpInterfaceDetailData->cbSize));
 
                bStatus = SetupDiGetDeviceInterfaceDetail(
                    hBattClassInfo,//маркер информации Устройства Интерфейса
                    &spInterfaceData,//данные Интерфейса для класса случая
                    lpInterfaceDetailData,//Интерфейс детализируют данные
                    dwInterfaceDetailDataSize,//Интерфейс детализируют размер данных
                    &dwReqSize,//Буферный размер, требуемый получить подробные данные
                    NULL);// информация устройства Интерфейса
                ListBox1->Items->Add("bStatus:"+IntToStr(bStatus));
 
                if ( hBattDevices != 0 )
                {
                    ListBox1->Items->Add("uiPortIndex:"+IntToStr((int)uiPortIndex));
                    //  Теперь давайте пытаться открыть устройство батареи
                    hBattDevices[uiPortIndex] =  CreateFile(
                        lpInterfaceDetailData->DevicePath,       // имя устройства
                        GENERIC_READ | GENERIC_WRITE,            // dwDesiredAccess
                        FILE_SHARE_READ | FILE_SHARE_WRITE,      // dwShareMode
                        NULL,                                    // lpSecurityAttributes
                        OPEN_EXISTING,                           // dwCreationDistribution
                        0,                                       // dwFlagsAndAttributes
                        NULL                                     // hTemplateFile
                    );
                    str1 = lpInterfaceDetailData->DevicePath;
                    ListBox1->Items->Add("CreateFile:"+IntToStr((int)uiPortIndex) + str1);
 
                    if(hBattDevices[uiPortIndex] == INVALID_HANDLE_VALUE)
                    {
                        ListBox1->Items->Add(L"Невозможно открыть устройство! Ошибка:" + SysErrorMessage(GetLastError()));
                    }
                    else
                    {
                        ListBox1->Items->Add(L"Устройство открыто!");
                    }
                }
                // we're done with the buffer, so free it
                LocalFree(lpInterfaceDetailData);
            }
        } // END FOR
    }
    ListBox1->Items->Add("hBattDevices:"+IntToStr((int)hBattDevices));
0
1 / 1 / 0
Регистрация: 23.07.2013
Сообщений: 7
28.07.2013, 21:57  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Зачем же весь цикл? Часть его, после первого вызова SetupDiGetDeviceInterfaceDetail:
сделал, но ситуация не изменилась, в итоге попрежнему код ошибки 0. но в принципе это и понятно - потому как в CreatFile ничего нет, а вот почему неясно...
изменённый код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#define INITGUID
#include <vcl.h>
 
#include "windows.h"
#include "setupapi.h"
#include "devguid.h"
#include "stdio.h"
#include <winioctl.h>
#include <PowrProf.h>
#include <batclass.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 AnsiString str1;
 DWORD   ErrCode;
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ListBox1->Clear();
    HANDLE hBattDevices[100];
      HDEVINFO                            hBattClassInfo;
    PSP_DEVICE_INTERFACE_DETAIL_DATA    lpInterfaceDetailData = NULL;
    SP_DEVICE_INTERFACE_DATA            spInterfaceData;
    DWORD                               dwInterfaceDetailDataSize;
    DWORD                               dwReqSize;
    DWORD                               dwErrCode;
    BOOL                                bStatus = TRUE;
 
    // ïîëó÷èòå ìàðêåð êëàññà óñòðîéñòâà äëÿ ïîðòîâ áàòàðåè â ñèñòåìå
    hBattClassInfo = SetupDiGetClassDevs(
        (LPGUID)&GUID_DEVICE_BATTERY,
        NULL,
        NULL,
        DIGCF_PRESENT|DIGCF_DEVICEINTERFACE
        );
 
    if (hBattClassInfo == INVALID_HANDLE_VALUE)
    {
        ListBox1->Items->Add("hBattClassInfo bad:"+IntToStr(hBattClassInfo));
    }
    else
    {
      ListBox1->Items->Add("hBattClassInfo ok:"+IntToStr(hBattClassInfo));
             // ñ ìàðêåðîì êëàññà óñòðîéñòâà ìû ìîæåì òåïåðü ïåðå÷èñëèòü ïóòè ê ïîðòàì áàòàðåè
 
        UINT uiPortIndex = 0;
        spInterfaceData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);
 
        for ( ;
            SetupDiEnumDeviceInterfaces( hBattClassInfo, 0, (LPGUID)&GUID_DEVICE_BATTERY, uiPortIndex, &spInterfaceData );
            uiPortIndex++ )
        {
            //Òåïåðü ó íàñ åñòü äàííûå èíòåðôåéñà äëÿ òåêóùåãî ïîðòà áàòàðåè
            //×òîáû ïîëó÷èòü åãî ïóòü, ìû äîëæíû ïðåâðàòèòü äâà çàïðîñà â SetupDiGetDeviceInterfaceDetail. Ïåðâûé çàïðîñ
            //îïðåäåëÿåò áóôåðíûé ðàçìåð, òðåáóåìûé äåðæàòü èíôîðìàöèþ äåòàëè èíòåðôåéñà
 
            bStatus = SetupDiGetDeviceInterfaceDetail(
                hBattClassInfo,        // Interface Device info handle
                &spInterfaceData,      // Interface data for the event class
                NULL,                  // Checking for buffer size
                0,                     // Checking for buffer size
                &dwReqSize,            // Buffer size required to get the detail data
                NULL                   // Checking for buffer size
                );
        if(!bStatus && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
        {
            // Ðàñïðåäåëèòå ïàìÿòü, ÷òîáû ïîëó÷èòü äàííûå äåòàëè èíòåðôåéñà, êîòîðûå áóäóò ñîäåðæàòü ïóòü íà óñòðîéñòâî ïîðòà áàòàðåè
            dwInterfaceDetailDataSize = dwReqSize;
            lpInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc( LMEM_ZEROINIT, dwInterfaceDetailDataSize);
 
                ListBox1->Items->Add("lpInterfaceDetailData:"+IntToStr(lpInterfaceDetailData));
 
            lpInterfaceDetailData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
 
             ListBox1->Items->Add("size lpInterfaceDetailData:"+IntToStr(lpInterfaceDetailData->cbSize));
 
            bStatus = SetupDiGetDeviceInterfaceDetail(
                hBattClassInfo,//ìàðêåð èíôîðìàöèè Óñòðîéñòâà Èíòåðôåéñà
                &spInterfaceData,//äàííûå Èíòåðôåéñà äëÿ êëàññà ñëó÷àÿ
                lpInterfaceDetailData,//Èíòåðôåéñ äåòàëèçèðóþò äàííûå
                dwInterfaceDetailDataSize,//Èíòåðôåéñ äåòàëèçèðóþò ðàçìåð äàííûõ
                &dwReqSize,//Áóôåðíûé ðàçìåð, òðåáóåìûé ïîëó÷èòü ïîäðîáíûå äàííûå
                NULL);// èíôîðìàöèÿ óñòðîéñòâà Èíòåðôåéñà
 
           ListBox1->Items->Add("bStatus:"+IntToStr(bStatus));
            if ( hBattDevices != 0 )
            {
             ListBox1->Items->Add("uiPortIndex:"+IntToStr(uiPortIndex));
                //  Òåïåðü äàâàéòå ïûòàòüñÿ îòêðûòü óñòðîéñòâî áàòàðåè
                hBattDevices[uiPortIndex] =  CreateFile(
                    lpInterfaceDetailData->DevicePath,       // èìÿ óñòðîéñòâà
                    GENERIC_READ | GENERIC_WRITE,            // dwDesiredAccess
                    FILE_SHARE_READ | FILE_SHARE_WRITE,      // dwShareMode
                    NULL,                                    // lpSecurityAttributes
                    OPEN_EXISTING,                           // dwCreationDistribution
                    0,                                       // dwFlagsAndAttributes
                    NULL                                     // hTemplateFile
                    );
              str1 = lpInterfaceDetailData->DevicePath;
               ListBox1->Items->Add("CreateFile:"+IntToStr(uiPortIndex) + str1);
 
  if(hBattDevices[uiPortIndex] == INVALID_HANDLE_VALUE)
  { ErrCode = GetLastError();
  ListBox1->Items->Add("Íåâîçìîæíî îòêðûòü óñòðîéñòâî!Êîä îøèáêè: "+IntToStr(ErrCode));
  ListBox1->Items->Add("Êîä îøèáêè: "+IntToStr(ErrCode));
  }
 else{ListBox1->Items->Add("Óñòðîéñòâî îòêðûòî!");}
            }
            // we're done with the buffer, so free it
            LocalFree(lpInterfaceDetailData);
        }
        } // END FOR
 
    }
     ListBox1->Items->Add("hBattDevices:"+IntToStr(hBattDevices));
}
0
1 / 1 / 0
Регистрация: 23.07.2013
Сообщений: 7
21.08.2013, 11:21  [ТС]
извиняюсь за долгое отсутствие...вообщем батарея на ноуте окончательно здохла(контроллер заблокировался), - теперь не на чем проверить. Программу до ума так и не довёл... придётся заморозить проект...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.08.2013, 11:21
Помогаю со студенческими работами здесь

просмотр информации перед публикацией
Привет всем. У меня есть страничка запросов, если ее можно так назвать, в общем суть в том, что пользователь вводит данные (заголовок,...

Запуск двух потоков и просмотр системной информации о физической и виртуальной памяти процесса
Разработать программу, в которой есть возможность запуска двух потоков и просмотр системной информации о физическом и виртуальную память...

Перенос информации с ноутбука на другой носитель
Возникла моя проблема в том, что недавно ноутбук перестал работать. Все решается переустановкой windows, но файлы, которые находятся на...

Замена банок в батарее
В общем, принесли батарею от ноута, мол, не работает. Я разобрал, оказалась одна пара аккумов отказала. Вынул сборку аккумов, сделал...

Замена банок в батарее
Собсно, пишу не потому что не знаю КАК, а потому что хочу поменять банки на другие с большей емкостью. Стоят банки LGAAS31865 3,6V, 2200...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru