[BCB][C++] Monitor Systemowy

0

Witam, piszę program który ma pełnić rolę monitora systemowego. Znalazłem w książce pt "C++ Builder 5 Vademecum Profesjonalisty" przykład takiego programu. Program ten korzysta z Klucza HKEY_DYN_DATA, klucz ten jest przechowywany w pamięci RAM i są w nim przechowywane dane, które ulegają ciągłym zmianom (np. obciążenie procesora lub ilość odebranych bajtów przez kartę sieciową).

Kłopot w tym, że program ten prawdopodobnie poprawnie działać będzie jedynie w Win 9x, gdzie klucz ten jest, wydaje mi się, dostępny do wglądu. W edytorze regedit w Windows XP nie widać nawet drzewa tego klucza.

Czy jest jakaś inna metoda na odczytanie aktualnego obciążenia procesora?

Oto kod źródłowy aplikacji z książki (proszę nie zwracać uwagi na zmienne globalne, wkleiłem je z pliku nagłówkowego aby każdy widział co zawierają):

//$$---- Form CPP ----
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "cgauges"
#pragma resource "*.dfm"
TForm1 *Form1;
const AnsiString
StartKey = "\\PrefStats\\StartStat",
DataKey = "\\PrefStats\\StatData",
StopKey = "\\PrefStats\\StopStat",
CPUUsage = "\\KERNEL\\CPUUsage",
BytesRec = "Dial-Up Adapter\\BytesRecvd",
BytesXmt = "Dial-Up Adapter\\ConnectSpeed",
ConnectSpeed = "Dial-Up Adapter\\ConnectSpeed",
PrefStatsDial =
	"\\System\\CurrentControlSet\\control\PrefStats\\Enum\\Dial-Up Adapter",
PrefStatsKernel =
	"\\System\\CurrentControlSet\\control\PrefStats\\Enum\\KERNEL";
long LastBytesXmt, LastBytesRec;
Tregistry *Reg1, *Reg2;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	String name;
	String temp1, temp2;
	LastBytesRec=0;
	LastBytesXmt=0;

	Reg1=new TRegistry;
	Reg1->RootKey=HKEY_DYN_DATA;
	Reg2=new TRegistry;
	Reg2->RootKey=HKEY_LOCAL_MACHINE;

	temp1=PrefStatsKernel;
	temp2=temp1+"\\CPUUsage";

	if (Reg2->OpenKey(temp1, false)) {
		name=Reg2->ReadString("Name");
	}
	Reg2->CloseKey();

	if (Reg2->OpenKey(temp2, false)) {
		Label1->Caption = name + ": " + Reg2->ReadString("Name");
	}
	Reg2->CloseKey();

	temp1=PrefStatsDial;
	if (Reg2->OpenKey(temp1, false)) {
		name=Reg2->ReadString("Name");
	}
	Reg2->CloseKey();

	temp2=temp1+"\\BytesRecvd";
	if (Reg2->OpenKey(temp2, false)) {
		Label2->Caption = name + ": " + Reg2->ReadString("Name");
	}
	Reg2->CloseKey();

	temp2=temp1+"\\BytesXmit";
	if (Reg2->OpenKey(temp2, false)) {
		Label3->Caption = name + ": " + Reg2->ReadString("Name");
	}
	Reg2->CloseKey();

	temp2=temp1+"\\ConnectSpeed";
	if (Reg2->OpenKey(temp2, false)) {
		Label4->Caption = name + ": " + Reg2->ReadString("Name");
	}
	Reg2->CloseKey();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
	long CurBytesRec, CurBytesXmt;
	CPUGauge->Progress = ReadDataFromReg(CPUUsage);
	CurBytesRec=ReadDataFromReg(BytesRec);
	RecvGauge->Progress=CurBytesRec-LastBytesRec;
	Label9->Caption=FloatToStr(RecvGauge->Progress);
	LastBytesRec=CurBytesRec;
	CurBytesXmt=ReadDataFromReg(BytesXmt);
	XmitGauge->Progress=CurBytesXmt-LastBytesXmt;
	Label10->Caption=FloatToStr(XmitGauge->Progress);
	LastBytesXmt=CurBytesXmt;
	ConnectSpeedGauge->Progress=ReadDataFromReg(ConnectSpeed);
	Label11->Caption=FloatToStr(ConnectSpeedGauge->Progress);
}
//---------------------------------------------------------------------------
long __fastcall TForm1::ReadDataFromReg(const AnsiString ObjectName)
{
	Byte Buffer[4], Dummy[4];
	long Bytes;
	if (Reg1->OpenKey(StartKey, false)) {
		Reg1->ReadBinaryData(ObjectName, Dummy, 4);
	}
	Reg1->CloseKey();
	if (Reg1->OpenKey(DataKey, false)) {
		Reg1->ReadBinaryData(ObjectName, Buffer, 4);
		Bytes=(long)&Buffer;
	}
	Reg1->CloseKey();
	if (Reg1->OpenKey(StopKey, false)) {
		Reg1->ReadBinaryData(ObjectName, Dummy, 4);
	}
	Reg1->CloseKey();
	return Bytes;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
	delete Reg1;
	delete Reg2;	
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ShowCPUUsageBarClick(TObject *Sender)
{
	ShowCPUUsageBar->Checked = !ShowCPUUsageBar->Checked;
	if (ShowCPUUsageBar->Checked) {
		CPUBar->Visible=true;
	} else {
		CPUBar->Visible=false;
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ShowReceivedBytesBarClick(TObject *Sender)
{
	ShowReceivedBytesBar->Checked = !ShowReceivedBytesBar->Checked;
	if (ShowReceivedBytesBar->Checked) {
		RecvBar->Visible=true;
	} else {
        RecvBar->Visible=false;
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ShowConnectionSpeedBarClick(TObject *Sender)
{
	ShowConnectionSpeedBar->Checked = !ShowConnectionSpeedBar->Checked;
	if (ShowConnectionSpeedBar->Checked) {
		ConnectSpeedBar->Visible=true;
	} else {
		ConnectSpeedBar->Visible=false;
	}
}
//---------------------------------------------------------------------------

</cpp>
0

IMHO, HKEY_DYN_DATA istnial tylko w win95/98
</cpp> rządzi :)

0

To w jaki sposób mogę w XP odczytać informacje o obciążeniu procesora lub o np. o użyciu pamięci ram lub pliku stronnictwa?

// 'plik stronnictwa' ROTFL :D (dop. deus)

0

NtQuerySystemInformation(...)

1 użytkowników online, w tym zalogowanych: 0, gości: 1