Литые колесные диски купить по низкой цене литые диски цена.
C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как получить список устройств и системную инф., Надо получить список устройств
R()m]{@r
Отправлено: 22.02.2007, 17:13


Ученик-кочегар

Группа: Участник
Сообщений: 2



Уважаемые. Помогите с вот какой проблемой
Необходимо получить информацию о системе, а именно :
1) Частоту и тип процессора
2) Объем жесткого диска
3) Объем ОЗУ
4) Объем Видео памяти
5) Тип монитора и его разрешение
а также список установленных устройств (ID) на машине.
И еще как поменять разрешение на мониторе с 1024х768 на 1280х1024 ????
AVC
Отправлено: 22.02.2007, 17:21


Ветеран

Группа: Модератор
Сообщений: 1583



Инфу, я считаю, проще спросить у реестра.
R()m]{@r
Отправлено: 19.03.2007, 23:47


Ученик-кочегар

Группа: Участник
Сообщений: 2



Я так понял, что модератор полный ламер, не в обиду. yahoo.gif
Я все сам сделал с помощью WinAPI без всяких реестеров и вот код: Пользуйтесь наздоровье !!!!

CODE

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "unit_Start.h"

#include <dos.h>
#include <math.h>
#include <setupapi.h>
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

/////////////////////////////////
// Описание функции измерения частоты процессора
double GetCPUSpeed()
{
int DelayTime = 500;

DWORD TimerHi, TimerLo;
int PriorityClass, Priority;

PriorityClass = GetPriorityClass(GetCurrentProcess);
Priority = GetThreadPriority(GetCurrentThread);

SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);

Sleep(10);

asm {
dw 310Fh
mov TimerLo, eax
mov TimerHi, edx
}

Sleep(DelayTime);

asm {
dw 310Fh
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
}

SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);

return (TimerLo/(1000.0 * DelayTime));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{

/////////////////////////////////
// Создание файла "init.log"

FILE *F;
if ((F = fopen("init.log", "wt")) == NULL)
{
ShowMessage("Не удалось создать файл ""init.log"" !");
return;
}

/////////////////////////////////
// Информация о текущей дате

struct date d;
getdate(&d);

fprintf(F,"Дата: %d.%d.%d \n",d.da_day,d.da_mon,d.da_year);

/////////////////////////////////
// Информация о частоте процессора

fprintf(F,"\n");
fprintf(F,"Частота процессора: %f МГц \n",GetCPUSpeed());

/////////////////////////////////
// Информация об оперативной памяти

fprintf(F,"\n");
fprintf(F,"[Информация об оперативной памяти]\n");
MEMORYSTATUS MemStat;
GlobalMemoryStatus(&MemStat);
fprintf(F,"Физической памяти всего: %i Мб \n",MemStat.dwTotalPhys/1024/1024);
fprintf(F,"Физической памяти доступно: %i Мб \n",MemStat.dwAvailPhys/1024/1024);
fprintf(F,"Виртуальной памяти всего: %i Мб \n",MemStat.dwTotalVirtual/1024/1024);
fprintf(F,"Виртуальной памяти доступно: %i Мб \n",MemStat.dwAvailVirtual/1024/1024);

/////////////////////////////////
// Информация о жестких дисках

fprintf(F,"\n");
fprintf(F,"[Информация о жестких дисках]\n");
fprintf(F,"Объем диска С: %s байт / %s Мб\n",IntToStr(DiskSize(3)),IntToStr(DiskSize(3)/1048576));
fprintf(F,"Свободно на диске С: %s байт / %s Мб\n",IntToStr(DiskFree(3)),IntToStr(DiskFree(3)/1048576));
if(DiskSize(4)== -1)
{
}
else
{
fprintf(F,"Объем диска D: %s байт / %s Мб\n",IntToStr(DiskSize(4)),IntToStr(DiskSize(4)/1048576));
fprintf(F,"Свободно на диске D: %s байт / %s Мб\n",IntToStr(DiskFree(4)),IntToStr(DiskFree(4)/1048576));
}
if(DiskSize(5)== -1)
{
}
else
{
fprintf(F,"Объем диска E: %s байт / %s Мб\n",IntToStr(DiskSize(5)),IntToStr(DiskSize(5)/1048576));
fprintf(F,"Свободно на диске E: %s байт / %s Мб\n",IntToStr(DiskFree(5)),IntToStr(DiskFree(5)/1048576));
}
if(DiskSize(6)== -1)
{
}
else
{
fprintf(F,"Объем диска F: %s байт / %s Мб\n",IntToStr(DiskSize(6)),IntToStr(DiskSize(6)/1048576));
fprintf(F,"Свободно на диске F: %s байт / %s Мб\n",IntToStr(DiskFree(6)),IntToStr(DiskFree(6)/1048576));
}

/////////////////////////////////
// Информация о видеокарте

TDisplayDevice lpDisplayDevice;
DWORD dwFlags;
DWORD cc;

lpDisplayDevice.cb = sizeof(lpDisplayDevice);
dwFlags = 0;
cc = 0;

EnumDisplayDevices(NULL,cc,&lpDisplayDevice,dwFlags);

fprintf(F,"\n");
fprintf(F,"[Информация о видеокарте]\n");
fprintf(F,"%s\n",lpDisplayDevice.DeviceString);
fprintf(F,"Объем видеопамяти: %i Мб \n",lpDisplayDevice.StateFlags/1024/1024);
fprintf(F,"%s\n",lpDisplayDevice.DeviceKey); //ветка реестра видеоадаптера

/////////////////////////////////
// Информация о мониторе

int DeskHor; //Перем. разреш. по горизонтали для условий смены разреш.
fprintf(F,"\n");
fprintf(F,"[Информация о мониторе]\n");
fprintf(F,"Текущее разрешение экрана по горизонтали: %i\n",DeskHor=GetDeviceCaps(Form1->Canvas->Handle,DESKTOPHORZRES));
fprintf(F,"Текущее разрешение экрана по вертикали: %i\n",GetDeviceCaps(Form1->Canvas->Handle,DESKTOPVERTRES));
fprintf(F,"Палитра (бит): %i\n",GetDeviceCaps(Form1->Canvas->Handle,BITSPIXEL));
fprintf(F,"Частота развертки: %i Герц\n",GetDeviceCaps(Form1->Canvas->Handle,VREFRESH));
fprintf(F,"Размер экрана монитора по горизонтали: %i мм\n",GetDeviceCaps(Form1->Canvas->Handle,HORZSIZE));
fprintf(F,"Размер экрана монитора по вертикали: %i мм\n",GetDeviceCaps(Form1->Canvas->Handle,VERTSIZE));

// расчет диагонали монитора
int iHorSize,iVertSize,iMonitorDiag;
iHorSize = GetDeviceCaps(Form1->Canvas->Handle,HORZSIZE);
iVertSize = GetDeviceCaps(Form1->Canvas->Handle,VERTSIZE);
iMonitorDiag = ((sqrt(pow(iHorSize,2)+pow(iVertSize,2)))/10)/2.54;
fprintf(F,"Размер монитора по диагонали: %i Дюймов\n",iMonitorDiag);

/////////////////////////////////
// Получение списка устройств

fprintf(F,"\n");
fprintf(F,"[Список установленных устройств]\n");

HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;

// все устройства
hDevInfo = SetupDiGetClassDevs(NULL,
0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_ALLCLASSES);

if (hDevInfo == INVALID_HANDLE_VALUE) // если список не удалось получить
{
fprintf(F,"ERORR! Не удалось получить список\n");
}

// Перечисление всех устройств в наборе
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
&DeviceInfoData);i++)
{
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;

while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_DEVICEDESC,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// изменение размера буфера
if (buffer) LocalFree(buffer);
// удвоение размера буфера в случае нехватки для Win2K MBCS systems per KB 888609
buffer = (char*)LocalAlloc(LPTR,buffersize * 2);
}
else
{
fprintf(F,"ERORR! Не удалось получить список\n");
break;
}
}

fprintf(F,"%i %s\n",(i+1),buffer); // вывод списка в файл

if (buffer) LocalFree(buffer);
}


if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
fprintf(F,"ERORR! Не удалось получить список\n");
}
// очистка памяти от списка
SetupDiDestroyDeviceInfoList(hDevInfo);

/////////////////////////////////
// Смена разрешения монитора в
// зависимости от его диагонали:
// 800x600 меньше 15 дюймов
// 1024x768 больше 15 или меньше 17 дюймов
// 1280x1024 больше или равно 17 дюймов

DEVMODE dm;
memset(&dm,0,sizeof(DEVMODE));
dm.dmSize=sizeof(DEVMODE);
dm.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;

if (iMonitorDiag<15 & DeskHor<800)
{
dm.dmPelsWidth=800;
dm.dmPelsHeight=600;
ChangeDisplaySettings(&dm,CDS_UPDATEREGISTRY);
ShowMessage("Установлено оптимальное разрешение для вашего монитора: "+
IntToStr(dm.dmPelsWidth)+"x"+IntToStr(dm.dmPelsHeight));
}
if ((iMonitorDiag>=15 | iMonitorDiag<17) & DeskHor<1024)
{
dm.dmPelsWidth=1024;
dm.dmPelsHeight=768;
ChangeDisplaySettings(&dm,CDS_UPDATEREGISTRY);
ShowMessage("Установлено оптимальное разрешение для вашего монитора: "+
IntToStr(dm.dmPelsWidth)+"x"+IntToStr(dm.dmPelsHeight));
}
if (iMonitorDiag>=17 & DeskHor<1280)
{
dm.dmPelsWidth=1280;
dm.dmPelsHeight=1024;
ChangeDisplaySettings(&dm,CDS_UPDATEREGISTRY);
ShowMessage("Установлено оптимальное разрешение для вашего монитора: "+
IntToStr(dm.dmPelsWidth)+"x"+IntToStr(dm.dmPelsHeight));
}

//-----------------------------------
fclose(F);// закрытие файла "init.log"
}
//---------------------------------------------------------------------------


Отредактировано R()m]{@r — 19.03.2007, 23:52
avc*
Отправлено: 20.03.2007, 10:13


Не зарегистрирован







Ну вы круты!
AVC
Отправлено: 20.03.2007, 11:05


Ветеран

Группа: Модератор
Сообщений: 1583



PS.
Не знаю как все остальное (не интересно), но на вопрос "Объем жесткого диска" ответ так и не получен.

Первое: почему вы думаете, что 6 — максисальный возможный номер девайса и данное устройство является hdd? Поэкспериментируйте в любой сети и, думаю, будете неприятно удивлены просматривая init.log. smile.gif

Второе и основное — Вы получаете не объем жесткого диска а размеры разделов, причем только тех, с которыми умеет работать windows. Надеюсь разницу между диском и разделом вам объяснять не нужно?

Вот так можно получить размер всех "обуквенных" на момент опроса девайсов
CODE

for (int i('A'); i <= 'Z'; i++)
{  __int64 sz = DiskSize(i — 'A' + 1);
   if (sz > 0)  Memo1->Lines->Add("drive " + AnsiString(char(i)) + ": " + (sz / 1024 / 1024) + " Mb всего");
}


А вот так можно попытаться получить инфу о всех подключенных HDD (форматированность и разбивка роли не играет)
CODE

HANDLE   hDevice;
DISK_GEOMETRY dg;
DWORD   bts;

for (int i(0); i < 10; i++)
{ AnsiString dev = "\.\PhysicalDrive" + AnsiString(i);
hDevice = CreateFile(dev.c_str()      // drive to open
    ,0          // no access to the drive
    ,FILE_SHARE_READ | FILE_SHARE_WRITE  // share mode
    ,NULL         // default security attributes
    ,OPEN_EXISTING       // disposition
    ,0          // file attributes
    ,NULL         // do not copy file attributes
    );

if (hDevice == INVALID_HANDLE_VALUE) break; // cannot open the drive

Memo1->Lines->Add(dev);

bool  bResult = DeviceIoControl (hDevice      // device to be queried
        ,IOCTL_DISK_GET_DRIVE_GEOMETRY  // operation to perform
        ,NULL, 0       // no input buffer
        ,&dg,  sizeof(dg)        // output buffer
        ,&bts        // # bytes returned
        ,NULL        // synchronous I/O
        );
if (!bResult)
 { int err = (int)GetLastError();
 AnsiString str = AnsiString::StringOfChar(' ', 250);
 FormatMessage(
  FORMAT_MESSAGE_FROM_SYSTEM,
  NULL,
  err,
  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  str.c_str(),
  str.Length(),
  NULL
 );
 Memo1->Lines->Add("DeviceIoControl error (" + AnsiString(err) +  "): " + str);
 }
else
 { Memo1->Lines->Add("MediaType         = " + AnsiString(int(dg.MediaType))   );
 Memo1->Lines->Add("Cylinders (hi)    = " + AnsiString(int(dg.Cylinders.HighPart)));
 Memo1->Lines->Add("Cylinders (lo)    = " + AnsiString(int(dg.Cylinders.LowPart)) );
 Memo1->Lines->Add("TracksPerCylinder = " + AnsiString(int(dg.TracksPerCylinder)) );
 Memo1->Lines->Add("SectorsPerTrack   = " + AnsiString(int(dg.SectorsPerTrack)) );
 Memo1->Lines->Add("BytesPerSector    = " + AnsiString(int(dg.BytesPerSector)) );
 double size =
    double(dg.Cylinders.LowPart)
  * double(dg.TracksPerCylinder)
  * double(dg.SectorsPerTrack  )
  * double(dg.BytesPerSector  )
 ;
 Memo1->Lines->Add("Bytes = " + FormatFloat("#,### Kb", size / 1024.));
 Memo1->Lines->Add("Bytes = " + FormatFloat("#,### Mb", size / (1024.*1024.)));
 Memo1->Lines->Add("Bytes = " + FormatFloat("#,### Gb", size / (1024.*1024.*1024.)));
 }

CloseHandle(hDevice);
}
Viton-Zizu
Отправлено: 28.10.2009, 14:55


Не зарегистрирован







а подскажите пожалуйста как получить инфо о видеокарте именно с реестра?

Вернуться в Работа с внешними устройствами