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
|
Я так понял, что модератор полный ламер, не в обиду.
Я все сам сделал с помощью 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.
Второе и основное — Вы получаете не объем жесткого диска а размеры разделов, причем только тех, с которыми умеет работать 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 |
|
Не зарегистрирован
|
а подскажите пожалуйста как получить инфо о видеокарте именно с реестра? |
|
|