PDA

View Full Version : سوال: بدست آوردن سرعت چرخش فن خنک کننده cpu و دمای cpu در Delphi XE



بهروز عباسی
یک شنبه 07 اسفند 1390, 18:27 عصر
درود به تمام برنامه نویس های گل:لبخند:

کسی میدونه چطوری میشه دمای CPU و سرعت چرخش(در دقیقه)فن خنک کنندهcpu بدست آورد

اگه ممکنه با شه میخوام فقط با کدهای نوشته شده این کار رو انجام بدم یعنی بطور مسقیم از سخت افزار:متفکر:

داخل سایت گشتم چند نمونه بود امانه اینجوری.

Felony
یک شنبه 07 اسفند 1390, 18:50 عصر
1- زبان برنامه نویسی شما دلفی هست .
2- دلفی ذاتا زبان برنامه نویسی تحت ویندوز هست .
3- تو ویندوز جناب عالی در User Mode قرار داری و ارتباط مستقیم با سخت افزار یعنی ارتباط با هسته سیستم عامل ( Kernel ) .
4- با دلفی نمیتونی برنامه Kernel Mode بنویسی .

بنابراین اون حرفتون معنایی نداره !

برای این کارهایی که میخواین انجام بدین باید از WMI استفاده کنید :

- برای به دست آوردن سرعت فن از کلاس Win32_Fan (http://msdn.microsoft.com/en-us/library/windows/desktop/aa394146(v=vs.85).aspx)
- برای به دست آوردن دمای پردازنده از کلاس Win32_TemperatureProbe (http://msdn.microsoft.com/en-us/library/windows/desktop/aa394493(v=vs.85).aspx)

MohsenB
یک شنبه 07 اسفند 1390, 22:19 عصر
سلام

اصلا دلفی رو اینجور دست کم نگیرید . و همینطور کرنل مود رو قله قاف حساب نکنید . فقط کافیه مثل بقیه محیطهای توسعه برنامه برای WMI کتابخانه اون رو الحاق کنید و کدتونو به روش دلفی بنویسید :

برای اینکار یه پروژه جدید ایجاد کنید و به منوی Component و بعد از اون Import Component رو انتخاب کنید ، Import type library رو برگزیده و به صفحه بعد برید ، Microsoft WMIScripting V1.x Library را در لیست پیدا کرده و انتخاب کنید ، به صفحه بعد رفته و Add unit to project را انتخاب کنید و پایان کار را تائید کنید .

بعد از اون از کد نمونه زیر میتوانید سرعت فن رو بدست بیارید . این کد یه برنامه ساده هست که در یک پروژه حالت کنسول نوشته شده برای نمایش دمای سیستم و همینطور اطلاعات فن :


program GetWMI_Info;

{$APPTYPE CONSOLE}

uses
ActiveX,
Variants,
SysUtils,
WbemScripting_TLB in '..\..\..\Documents\RAD Studio\5.0\Imports\WbemScripting_TLB.pas';

procedure ShowTemperatureInfo();
var
WMIServices: ISWbemServices;
Root : ISWbemObjectSet;
Item : Variant;
I : Integer;
begin
{
http://msdn.microsoft.com/en-us/library/aa394493%28VS.85%29.aspx
The Win32_TemperatureProbe  WMI class represents the properties of a temperature sensor (electronic thermometer).
Most of the information that the Win32_TemperatureProbe WMI class provides comes from SMBIOS.
Real-time readings for the CurrentReading property cannot be extracted from SMBIOS tables.
For this reason, current implementations of WMI do not populate the CurrentReading property.
The CurrentReading property's presence is reserved for future use.
}

Writeln('Temperature Info');
Writeln('----------------');

WMIServices := CoSWbemLocator.Create.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil);
Root := WMIServices.ExecQuery('Select * FROM Win32_TemperatureProbe','WQL', 0, nil);
for I := 0 to Root.Count - 1 do
begin
Item := Root.ItemIndex(I);
Writeln('Accuracy '+VarToStr(Item.Accuracy));
Writeln('Availability '+VarToStr(Item.Availability));
Writeln('Caption '+Item.Caption);
Writeln('Config Manager Error Code '+VarToStr(Item.ConfigManagerErrorCode));
Writeln('Config Manager User Config '+VarToStr(Item.ConfigManagerUserConfig));
Writeln('Creation Class Name '+VarToStr(Item.CreationClassName));
Writeln('Current Reading '+VarToStr(Item.CurrentReading));
Writeln('Description '+VarToStr(Item.Description));
Writeln('Device ID '+VarToStr(Item.DeviceID));
Writeln('Error Cleared '+VarToStr(Item.ErrorCleared ));
Writeln('Error Description '+VarToStr(Item.ErrorDescription));
Writeln('Install Date '+VarToStr(Item.InstallDate));
Writeln('Is Linear '+VarToStr(Item.IsLinear));
Writeln('Last Error Code '+VarToStr(Item.LastErrorCode));
Writeln('Lower Threshold Critical '+VarToStr(Item.LowerThresholdCritical));
Writeln('Lower Threshold Fatal '+VarToStr(Item.LowerThresholdFatal));
Writeln('Lower Threshold NonCritical '+VarToStr(Item.LowerThresholdNonCritical));
Writeln('Max Readable '+VarToStr(Item.MaxReadable));
Writeln('Min Readable '+VarToStr(Item.MinReadable));
Writeln('Name '+VarToStr(Item.Name));
Writeln('Nominal Reading '+VarToStr(Item.NominalReading));
Writeln('Normal Max '+VarToStr(Item.NormalMax));
Writeln('Normal Min '+VarToStr(Item.NormalMin ));
Writeln('PNP Device ID '+VarToStr(Item.PNPDeviceID));
Writeln('Power Management Capabilities '+VarToStr(Item.PowerManagementCapabilities));
Writeln('Power Management Supported '+VarToStr(Item.PowerManagementSupported));
Writeln('Resolution '+VarToStr(Item.Resolution));
Writeln('Status '+VarToStr(Item.Status));
Writeln('Status Info '+VarToStr(Item.StatusInfo));
Writeln('System Creation Class Name '+VarToStr(Item.SystemCreationClassName));
Writeln('System Name '+VarToStr(Item.SystemName));
Writeln('Tolerance '+VarToStr(Item.Tolerance));
Writeln('Upper Threshold Critical '+VarToStr(Item.UpperThresholdCritical));
Writeln('Upper Threshold Fatal '+VarToStr(Item.UpperThresholdFatal));
Writeln('Upper Threshold NonCritical '+VarToStr(Item.UpperThresholdNonCritical));
Writeln('');
end;
end;

procedure ShowCPUFanInfo();
var
WMIServices: ISWbemServices;
Root : ISWbemObjectSet;
Item : Variant;
I : Integer;
begin
{
http://msdn.microsoft.com/en-us/library/aa394146%28VS.85%29.aspx
The Win32_Fan WMI class represents the properties of a fan device in the computer system. For example, the CPU cooling fan.
}
Writeln('CPU FAN Info');
Writeln('----------------');
WMIServices := CoSWbemLocator.Create.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil);
Root := WMIServices.ExecQuery('Select * FROM Win32_Fan','WQL', 0, nil);
for I := 0 to Root.Count - 1 do
begin
Item := Root.ItemIndex(I);

Writeln('ActiveCooling '+VarToStr(Item.ActiveCooling));
Writeln('Availability '+VarToStr(Item.Availability));
Writeln('Caption '+VarToStr(Item.Caption));
Writeln('Config Manager ErrorCode '+VarToStr(Item.ConfigManagerErrorCode));
Writeln('Config Manager UserConfig '+VarToStr(Item.ConfigManagerUserConfig));
Writeln('Creation ClassName '+VarToStr(Item.CreationClassName));
Writeln('Description '+VarToStr(Item.Description));
Writeln('DesiredSpeed '+VarToStr(Item.DesiredSpeed));
Writeln('DeviceID '+VarToStr(Item.DeviceID));
Writeln('ErrorCleared '+VarToStr(Item.ErrorCleared));
Writeln('ErrorDescription '+VarToStr(Item.ErrorDescription));
Writeln('InstallDate '+VarToStr(Item.InstallDate));
Writeln('LastErrorCode '+VarToStr(Item.LastErrorCode));
Writeln('Name '+VarToStr(Item.Name));
Writeln('PNPDeviceID '+VarToStr(Item.PNPDeviceID));
Writeln('PowerManagement Capabilities '+VarToStr(Item.PowerManagementCapabilities));
Writeln('PowerManagement Supported '+VarToStr(Item.PowerManagementSupported));
Writeln('Status '+VarToStr(Item.Status));
Writeln('StatusInfo '+VarToStr(Item.StatusInfo));
Writeln('SystemCreation ClassName '+VarToStr(Item.SystemCreationClassName));
Writeln('SystemName '+VarToStr(Item.SystemName));
Writeln('VariableSpeed '+VarToStr(Item.VariableSpeed));
Writeln('');
end;

End;


begin
try
CoInitialize(nil);
ShowTemperatureInfo();
ShowCPUFanInfo();
Readln;
CoUninitialize;
except
on E:Exception do
Begin
CoUninitialize;
Writeln(E.Classname, ': ', E.Message);
Readln;
End;
end;
end.


موفق باشید

Felony
دوشنبه 08 اسفند 1390, 03:09 صبح
اصلا دلفی رو اینجور دست کم نگیرید . و همینطور کرنل مود رو قله قاف حساب نکنید .
عزیزم میدونی Kernel Mode چیه ؟
میدونی Delphi چیه و توانایی انجام چه کارهایی رو داره ؟
میدونی دقیقا WMI چیه ؟
الان من خودم روش این کار رو تو ویندوز اون بالا گفتم که WMI هست و باید از اون ۲ تا کلاس برای این کار استفاده بشه بعد ورداشتی کدشو اینجا گذاشتی و میگی دلفی رو دست کم نگیر ؟!

نه عزیز جان اشتباه متوجه شدی , WMI یک رابط برای مدیریت سیستم عامل ویندوز هست و یک روشی که میتونید باهاش با ویندوز ارتباط برقرار کنید .
WMI که من در موردش صحبت کردم و شما اشتباه متوجه شدی و خواستی ... ‌Kernel Mode نیست !

وقتی از چیزی اطلاع نداری لطفا در موردش اینطور با صراحت صحبت نکن و دیگران رو گمراه نکن , Kernel Mode دقیقا قاف هست , جناب عالی تا حالا تو Kernel Mode کد نوشتی که ببینی چی هست ؟ تا به حال DDK رو دیدی تا ببینی با چی طرفی ؟

MohsenB
دوشنبه 08 اسفند 1390, 09:58 صبح
عزیزم میدونی Kernel Mode چیه ؟
میدونی Delphi چیه و توانایی انجام چه کارهایی رو داره ؟
میدونی دقیقا WMI چیه ؟
الان من خودم روش این کار رو تو ویندوز اون بالا گفتم که WMI هست و باید از اون ۲ تا کلاس برای این کار استفاده بشه بعد ورداشتی کدشو اینجا گذاشتی و میگی دلفی رو دست کم نگیر ؟!

نه عزیز جان اشتباه متوجه شدی , WMI یک رابط برای مدیریت سیستم عامل ویندوز هست و یک روشی که میتونید باهاش با ویندوز ارتباط برقرار کنید .
WMI که من در موردش صحبت کردم و شما اشتباه متوجه شدی و خواستی ... ‌Kernel Mode نیست !

وقتی از چیزی اطلاع نداری لطفا در موردش اینطور با صراحت صحبت نکن و دیگران رو گمراه نکن , Kernel Mode دقیقا قاف هست , جناب عالی تا حالا تو Kernel Mode کد نوشتی که ببینی چی هست ؟ تا به حال DDK رو دیدی تا ببینی با چی طرفی ؟

شما فرمودین با دلفی نمیشه ، من گفتم میشه و اینم کدش . لطفا وقتی از چیزی خبر ندارید اینطور با قاطعیت نظر ندین .


موفق باشید

Felony
دوشنبه 08 اسفند 1390, 11:22 صبح
شما فرمودین با دلفی نمیشه ، من گفتم میشه و اینم کدش .
هنوز هم میگم ، پسر خوب کدی که گذاشتی Kernel Mode نیست ، OK ؟

ایشون گفته :


اگه ممکنه با شه میخوام فقط با کدهای نوشته شده این کار رو انجام بدم یعنی بطور مسقیم از سخت افزار:متفکر:


من هم گفتم :


1- زبان برنامه نویسی شما دلفی هست .
2- دلفی ذاتا زبان برنامه نویسی تحت ویندوز هست .
3- تو ویندوز جناب عالی در User Mode قرار داری و ارتباط مستقیم با سخت افزار یعنی ارتباط با هسته سیستم عامل ( Kernel ) .
4- با دلفی نمیتونی برنامه Kernel Mode بنویسی .

بنابراین اون حرفتون معنایی نداره !



لطفا وقتی از چیزی خبر ندارید اینطور با قاطعیت نظر ندین .

من نیازی ندارم تا شما تائید کنید از چیزی اطلاع دارم یا نه ، با این 2 تا پستتون تو این تاپیک با صراحت میتونم بگم جناب عالی در حدی نیستی که بخوای در مورد دانسته های من نظر بدی .

اون کدی هم که نوشتی من تو همون پست اولم گفتم راه حل استفاده از WMI و اون 2 تا کلاس هست .

برای اینکه با Kernel Mode آشنا بشی و بفهمی بچه بازی نیست این لینک ها رو مطالع کن :

http://en.wikipedia.org/wiki/Ring_(computer_security)
http://en.wikipedia.org/wiki/Kernel-Mode_Driver_Framework
http://www.linfo.org/kernel_mode.html
http://www.codinghorror.com/blog/2008/01/understanding-user-and-kernel-mode.html

جزء واجباتی هست که یک برنامه نویس ویندوز باید حداقل بدونه چی هست !

بهروز عباسی
دوشنبه 08 اسفند 1390, 11:44 صبح
درود به همه

ممنون از کمک اگه بخوام برنامه Kernel Mode بنویسم باید از چه زبانی استفاده کنم?
باC++‎Builder میشه این کارو کرد یا حتمابایدباC بنویسم

Mask
دوشنبه 08 اسفند 1390, 12:39 عصر
از دو دوست بزرگوار خواهش دارم بحث رو یکم مودبانه تر و صمیمیتر و دوستانه تر ادامه بدهند.:خجالت::لبخندساده:

Felony
دوشنبه 08 اسفند 1390, 13:27 عصر
برای نوشتن درایور Kernel Mode باید از ++C استفاده کنید ، البته مدتی پیش یک کیت توسعه نرم افزاری ( SDK ) برای دلفی عرضه شده بود که به واسطه اون میشد Kernel Mode کد زد ولی کامل نبود و یکسری باگ داشت و توسعه هم داده نشد .

BORHAN TEC
چهارشنبه 10 اسفند 1390, 09:00 صبح
امروز داشتم در اینترنت جستجو می کردم که به یک سایت رسیدم که یک SDK ساخته که با دلفی هم می توان از آن برای ایجاد برنامه های Kernel Mode استفاده کرد. البته نمیدونم که منظور آقای تاجیک همین بوده یا نه! :متفکر:
سایت مربوطه به زبان آلمانی است که پیشنهاد می کنم که متن آنرا با Google Translate به زبان انگلیسی تبدیل کنید و بخوانید.
این هم از سایتش:
http://www.kithara.de/

بهروز عباسی
چهارشنبه 10 اسفند 1390, 12:14 عصر
ممنون از راهنمای همه

میخواستم بدونم میشه با C++ یک .dll کرنل مد نوشت که کار مورد نظرو انجام بده بعد اونو داخل دلفی فراخوانی کرد یا باید کل برنامه کرنل مد باشه

BORHAN TEC
چهارشنبه 10 اسفند 1390, 12:52 عصر
میخواستم بدونم میشه با C++‎ یک .dll کرنل مد نوشت که کار مورد نظرو انجام بده بعد اونو داخل دلفی فراخوانی کرد
بله، میشه این کار رو انجام داد. اگه در اون سایتی که معرفی کرده ام هم دقت می کردید این رو متوجه می شدید. در قسمتی نوشته شده که می تونید برای این کار یک DLL بسازید و از آن در زبان های دیگری مثل C# و ... استفاده کنید.

stn-it
سه شنبه 26 خرداد 1394, 08:42 صبح
با سلام خدمت دوستان
من برای به دست آوردن دمای پردازنده از کلاس Win32_TemperatureProbe (http://msdn.microsoft.com/en-us/library/windows/desktop/aa394493%28v=vs.85%29.aspx) استفاده می کنم
ولی بیشتر چیزهارو نمایش میده
می خوام ببینم مشکل از سیستم من هست یا اینکه بستگی به نوع مادربرد و cpu داره؟

Delphi Coder
جمعه 29 خرداد 1394, 00:27 صبح
اون پیجی که شما لینک گذاشتید یکی از صفحات msdn هست که کلاسی از WMI رو در این رابطه توضیح داده. یعنی چیزی چاپ نمیکنه اگر برنامه ای برای این کار نوشتید بهتره سورس رو بزارید تا بشه در موردش نظر داد.
---------------------------------
پ ن:
مدتی پیش من هم میخواستم یه برنامه کوچک برای کنترل فن یک سیستم قدیمی P1 بنویسم. یه چند تا سرچ که زدم دیدم کار یکم پیچیده تر از اونی هست که در ابتدا به نظر میاد. برنامه SpeenFan تقریبا میشه گفت معروفترین برنامه موجود برای کنترل فن هست با دلفی نوشته شده خوب هم کار میکنه با کلی امکانات دیگه ولی سورس باز نیست. مشخص هم نیست با SMBus کار کرده یا با توابع ACPI. چیزی که در استفاده و تست این برنامه میشه متوجه شد این هست که خواندن و نوشتن این مقادیر کار روتینی نیست و بسته به سخت افزارهای مختلف متفاوت هست (یعنی حتی نحوه config کردن برنامه برای کار روی سیستم های مختلف متفاوت بود) برای همین هم بیخیال شدم. یه سورس کد هم در همین رابطه پیدا کرده بودم که روی سخت افزارهای مشخصی جواب میده.
Intel 82801 and 82371AB/EB PIIX4
attach کردم اگر خواستید یه نگاهی بکنید.