Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблема с winapi в С++ Builder

45K
21 декабря 2008 года
v_vint
1 / / 21.12.2008
Есть небольшая проблема.
Текст программы написан на winapi.
Программа выводит заряд батареи на ноутбуке.
В VisualStudio 2005 компилируется и работает.
В С++ Builder 6 компилируется и не работает.
Не могу понять почему.
Проблема возникает во время второго вызова функции SetupDiGetDeviceInterfaceDetail.
В VisualStudio она срабатывает не выдавая ошибок.
В Builder она возвращает код ошибки.
Что этот код значит я нигде не нашел.
Программа это немного переделанный код взятый из msdn Enumerating Battery Devices

вот исходник программы для VisualStudio
(под Builder он почти такойже)

// battery.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <setupapi.h>
#include <WinIoCtl.h>
#include <initguid.h>
#include <batclass.h>
#include <stdio.h>
#include <conio.h>


#pragma comment (lib, "setupapi.lib")

DWORD GetBatteryState()
{
#define GBS_HASBATTERY 0x1
#define GBS_ONBATTERY 0x2
// Returned value includes GBS_HASBATTERY if the system has a
// non-UPS battery, and GBS_ONBATTERY if the system is running on
// a battery.
//
// dwResult & GBS_ONBATTERY means AC power has not been found.
// dwResult & GBS_HASBATTERY means a non-UPS battery is being used.

DWORD dwResult = GBS_ONBATTERY;

// IOCTL_BATTERY_QUERY_INFORMATION,
// enumerate the batteries and ask each one for information.

HDEVINFO hdev =
SetupDiGetClassDevs(&GUID_DEVICE_BATTERY,
0,
0,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (INVALID_HANDLE_VALUE != hdev)
{
// Limit search to 100 batteries max
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;

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//первый раз функция выдает ошибку ERROR_INSUFFICIENT_BUFFER
//так и должно быть
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
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);

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//а вот здесь в VisualStudio функция возвращает TRUE
//и работа программы продолжается
//а в Builder возвращает FALSE чего быть не должно
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (SetupDiGetDeviceInterfaceDetail(hdev,
&did,
pdidd,
cbRequired,
&cbRequired,
0))
{
// Enumerated a battery. Ask it for information.
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)
{
// Ask the battery for its tag.
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)
{
// With the tag, you can query the battery info.
BATTERY_INFORMATION bi = {0};
bqi.InformationLevel = BatteryInformation;

if (DeviceIoControl(hBattery,
IOCTL_BATTERY_QUERY_INFORMATION,
&bqi,
sizeof(bqi),
&bi,
sizeof(bi),
&dwOut,
NULL))
{
// Only non-UPS system batteries count
if (bi.Capabilities & BATTERY_SYSTEM_BATTERY)
{
if (!(bi.Capabilities & BATTERY_IS_SHORT_TERM))
{
dwResult |= GBS_HASBATTERY;
}

// Query the battery status.
BATTERY_WAIT_STATUS bws = {0};
bws.BatteryTag = bqi.BatteryTag;

BATTERY_STATUS bs;
while(1)
{
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;
}
}
printf("%d\n",bs.Capacity);
getch();
}

}
}
}
CloseHandle(hBattery);
}
}
LocalFree(pdidd);
}
}
}
else if (ERROR_NO_MORE_ITEMS == GetLastError())
{
break; // Enumeration failed - perhaps there are no more items
}
}
SetupDiDestroyDeviceInfoList(hdev);
}

// Final cleanup: If no battery is found, then presume that
// AC power is being used.

if (!(dwResult & GBS_HASBATTERY))
dwResult &= ~GBS_ONBATTERY;

return dwResult;
}


int _tmain(int argc, _TCHAR* argv[])
{
int res=GetBatteryState();
printf("%d",res);
getch();
return 0;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог