PDA

View Full Version : سوال: شناسایی سخت افزار - RAM



karimim
چهارشنبه 02 شهریور 1390, 13:11 عصر
سلام
مدتی روی یک برنامه برای شناسایی سخت افزار شامل مدل مادربورد ، سایز رم ، نوع رم و خلاصه یک برنامه جامع درباره شناسایی سخت افزار یک کامپیوتر با سیستم عامل ویندوز (مثلا اکس پی) با استفاده از محیط دلفی 7 دارم کار میکنم.
همه مشخصات سیستم را بدست آوردم ولی مدت زمان زیادی برای بدست آوردن نوع رم ( مثلا SD ، DDR ، DDR2 ، DDR3 ) گذاشتم ولی کاری که میخواستم بکنم انجام نشد که نشد
لطفا اگه تو این زمینه کسی کارکرده و اطلاعاتی داره بذاره ، ممنون ...
لطفا از بیشنهادهای برنامه هایی مثل CPU-Z این چیزها نباشه

نمونه ای از کد های استفاده شده از توابع WIN32 :


GetWMIstring('.', 'root\CIMV2', 'Win32_BaseBoard','Manufacturer');l


البته خودش تابع MemoryType داره ولی جواب نمیده یک چیز کلی میخوام که جواب هم بده ....
خیلی بد جوری گیر کردم دیگه ذهنم جواب نمی ده ...!!!!!!!

BORHAN TEC
چهارشنبه 02 شهریور 1390, 16:24 عصر
میتونید از کد زیر استفاده کنید:
uses
SysUtils, Variants, ActiveX, ComObj;

function GetWMIstring(wmiHost, root, wmiClass, wmiProperty: string): string;
var
objWMIService: OLEVariant;
colItems: OLEVariant;
colItem: OLEVariant;
oEnum: IEnumvariant;
iValue: LongWord;

function GetWMIObject(const objectName: String): IDispatch;
var
chEaten: Integer;
BindCtx: IBindCtx; // for access to a bind context
Moniker: IMoniker; // Enables you to use a moniker object
begin
OleCheck(CreateBindCtx(0, BindCtx));
OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten,
Moniker)); // Converts a string into a moniker that identifies the object named by the string
OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
// Binds to the specified object
end;

begin
objWMIService := GetWMIObject(Format('winmgmts:\\%s\%s', [wmiHost, root]));
colItems := objWMIService.ExecQuery(Format('SELECT * FROM %s', [wmiClass]),
'WQL', 0);
oEnum := IUnknown(colItems._NewEnum) as IEnumvariant;
while oEnum.Next(1, colItem, iValue) = 0 do
begin
Result := colItem.Properties_.Item(wmiProperty, 0); // you can improve this code ;) , storing the results in an TString.
end;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
I: String;
str1: string;
begin
I := GetWMIstring('.', 'root\CIMV2', 'Win32_PhysicalMemory', 'MemoryType');
case StrToInt(I) of
0:
str1 := 'Unknown';
1:
str1 := 'Other';
2:
str1 := 'DRAM';
3:
str1 := 'Synchronous DRAM';
4:
str1 := 'Cache DRAM';
5:
str1 := 'EDO';
6:
str1 := 'EDRAM';
7:
str1 := 'VRAM';
8:
str1 := 'SRAM';
9:
str1 := 'RAM';
10:
str1 := 'ROM';
11:
str1 := 'Flash';
12:
str1 := 'EEPROM';
13:
str1 := 'FEPROM';
14:
str1 := 'EPROM';
15:
str1 := 'CDRAM';
16:
str1 := '3DRAM';
17:
str1 := 'SDRAM';
18:
str1 := 'SGRAM';
19:
str1 := 'RDRAM';
20:
str1 := 'DDR';
21:
str1 := 'DDR-2';
22:
str1 := 'DDR-3';
end;
ShowMessage(str1);
end;

برای کسب توضیحات بیشتر نیز می توانید به آدرسهای زیر مراجعه کنید:
http://msdn.microsoft.com/en-us/library/aa394347(v=VS.85).aspx
و
http://stackoverflow.com/questions/2761328/how-do-i-use-wmi-with-delphi-without-drastically-increasing-the-applications-fil

karimim
چهارشنبه 02 شهریور 1390, 17:49 عصر
شاهین جان دستت درد نکنه
من هم با همین کد کار می کنم ولی متاسفانه همیشه کد صفر یا همون Unknown را بر می
گردونه و این درحالیه که برنامه CPU-Z بدون اشتباه روی همه سیستم ها این کار رو میکنه

کم کم دارم به این نتیجه میرسم که از روی باس یا محاسبه و مقایسه چند پارامتر دیگر این کار رو میکنه من اینترنت تو این چند روز زیر و رو کردم و حتما باید به نتیجه برسم ممنون میشم اگه بازم یک تلاشی واسم بکنی همین طور بقیه دوستان و اساتید ...

با تشکر

BORHAN TEC
چهارشنبه 02 شهریور 1390, 18:37 عصر
من کد بالا رو روی 3 تا سیستم چک کردم و بدون مشکل کار میکنه. نمیدونم چرا روی سیستم شما جواب نمیده؟ راستی RAM شما از چه نوعی است؟

vcldeveloper
پنج شنبه 03 شهریور 1390, 00:50 صبح
باید از کلاس Win32_PhysicalMemory استفاده می کردید:


//-----------------------------------------------------------------------------------------------------
// This code was generated by the Wmi Delphi Code Creator http://theroadtodelphi.wordpress.com
// Version: 1.1.2.85
//
//
//
// LIABILITY DISCLAIMER
// THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.
// YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS,
// DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE.
//
//
//----------------------------------------------------------------------------------------------------
program GetWMI_Info;

{$APPTYPE CONSOLE}

uses
SysUtils,
ActiveX,
ComObj,
Variants;

// The Win32_PhysicalMemory class represents a physical memory device located on a
// computer system as available to the operating system.

procedure GetWin32_PhysicalMemoryInfo;
const
WbemUser ='';
WbemPassword ='';
WbemComputer ='localhost';
wbemFlagForwardOnly = $00000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
begin;
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PhysicalMemory','WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
Writeln(Format('BankLabel %s',[FWbemObject.BankLabel]));// String
Writeln(Format('Capacity %s',[FWbemObject.Capacity]));// Uint64
Writeln(Format('Caption %s',[FWbemObject.Caption]));// String
Writeln(Format('CreationClassName %s',[FWbemObject.CreationClassName]));// String
Writeln(Format('DataWidth %s',[FWbemObject.DataWidth]));// Uint16
Writeln(Format('Description %s',[FWbemObject.Description]));// String
Writeln(Format('DeviceLocator %s',[FWbemObject.DeviceLocator]));// String
Writeln(Format('FormFactor %s',[FWbemObject.FormFactor]));// Uint16
Writeln(Format('HotSwappable %s',[FWbemObject.HotSwappable]));// Boolean
Writeln(Format('InstallDate %s',[FWbemObject.InstallDate]));// Datetime
Writeln(Format('InterleaveDataDepth %s',[FWbemObject.InterleaveDataDepth]));// Uint16
Writeln(Format('InterleavePosition %s',[FWbemObject.InterleavePosition]));// Uint32
Writeln(Format('Manufacturer %s',[FWbemObject.Manufacturer]));// String
Writeln(Format('MemoryType %s',[FWbemObject.MemoryType]));// Uint16
Writeln(Format('Model %s',[FWbemObject.Model]));// String
Writeln(Format('Name %s',[FWbemObject.Name]));// String
Writeln(Format('OtherIdentifyingInfo %s',[FWbemObject.OtherIdentifyingInfo]));// String
Writeln(Format('PartNumber %s',[FWbemObject.PartNumber]));// String
Writeln(Format('PositionInRow %s',[FWbemObject.PositionInRow]));// Uint32
Writeln(Format('PoweredOn %s',[FWbemObject.PoweredOn]));// Boolean
Writeln(Format('Removable %s',[FWbemObject.Removable]));// Boolean
Writeln(Format('Replaceable %s',[FWbemObject.Replaceable]));// Boolean
Writeln(Format('SerialNumber %s',[FWbemObject.SerialNumber]));// String
Writeln(Format('SKU %s',[FWbemObject.SKU]));// String
Writeln(Format('Speed %s',[FWbemObject.Speed]));// Uint32
Writeln(Format('Status %s',[FWbemObject.Status]));// String
Writeln(Format('Tag %s',[FWbemObject.Tag]));// String
Writeln(Format('TotalWidth %s',[FWbemObject.TotalWidth]));// Uint16
Writeln(Format('TypeDetail %s',[FWbemObject.TypeDetail]));// Uint16
Writeln(Format('Version %s',[FWbemObject.Version]));// String

Writeln('');
FWbemObject:=Unassigned;
end;
end;


begin
try
CoInitialize(nil);
try
GetWin32_PhysicalMemoryInfo;
finally
CoUninitialize;
end;
except
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.

در ضمن، وقتی از کدهای نوشته شده توسط دیگران استفاده می کنید، لینک منبع اصلی را درج کنید که ارزش کار نویسنده اصلی حفظ بشه.

BORHAN TEC
پنج شنبه 03 شهریور 1390, 01:45 صبح
در ضمن، وقتی از کدهای نوشته شده توسط دیگران استفاده می کنید، لینک منبع اصلی را درج کنید که ارزش کار نویسنده اصلی حفظ بشه.
اگه به پایین پست 2 نگاه می کردید مشاهده می کردید که منابع رو از همون اول قرار داده بودم. :چشمک:

karimim
پنج شنبه 03 شهریور 1390, 11:16 صبح
علی جان دستت شما هم درد نکنه ...

ولی متاسفانه :گریه: این راه، یعنی کار با تابع Win32_PhysicalMemory کلی نیست مثلا برای سیستم خودم جواب نمی ده در صورتی که من این گزارش از CPU-Z گرفتم با DirectX Diagnostic Tool در ویندوز هم همین جواب را گرفتم من دنبال یک کد کلی هستم که روی تمام سیستم ها کار کنه ...
----------------
این گزارش ها را میذارم تا شما هم بررسی کنید، شاید از توابع دیگری بتونیم درش بیاریم من که حسابی هنگ کردم ... :گیج:
من دو تا رم Kingmax دارم که این تصویر گزارش تهیه شده از طریق دو برنامه بدست آوردم
من فکر می کنم که برنامه ها دارن از Bandwidth استفاده می کنند و نوع رم را تشخیص می دن

74343

این هم خروجی برنامه علی :

74344

:عصبانی++: :عصبانی++: :عصبانی++:


باتشکر فراوان :لبخندساده:

vcldeveloper
پنج شنبه 03 شهریور 1390, 19:07 عصر
ولی متاسفانه :گریه: این راه، یعنی کار با تابع Win32_PhysicalMemory کلی نیست مثلا برای سیستم خودم جواب نمی ده در صورتی که من این گزارش از CPU-Z گرفتم با DirectX Diagnostic Tool در ویندوز هم همین جواب را گرفتم من دنبال یک کد کلی هستم که روی تمام سیستم ها کار کنه ...خروجی که از اون کد گذاشتید، درسته؛ خروجی مربوطه داره میگه که شما دو تا ماجول RAM دارید که هر کدام 2 گیگابایت ظرفیت دارند. فقط نوع RAM شما که DDR3 بوده را به صورت Unknown نمایش داده، و نام شرکت سازنده را درج نکرده.

karimim
جمعه 04 شهریور 1390, 18:56 عصر
خروجی که از اون کد گذاشتید، درسته؛ خروجی مربوطه داره میگه که شما دو تا ماجول RAM دارید که هر کدام 2 گیگابایت ظرفیت دارند. فقط نوع RAM شما که DDR3 بوده را به صورت Unknown نمایش داده، و نام شرکت سازنده را درج نکرده.

دقيقا مشكل من همين جاست چون از اول هم مي تونستم تعداد ماژول ها را داشته باشم ولي نوع آنها را نمي تونستم بدست بياورم و اين چيزي كه من دنبالشم - نوع رم - راستي من اين كد باز هم با يك سيستم DDR2 امتحان كردم متاسفانه جواب نداد ...!!!!!؟

BORHAN TEC
جمعه 04 شهریور 1390, 19:45 عصر
من اين كد باز هم با يك سيستم DDR2 امتحان كردم متاسفانه جواب نداد ...!!!!!؟
من روی سیستمم 2 تا RAM از نوع DDR-2 دارم و کد بالا هم به درستی نوع RAM را نشان می دهد. لطفاً یک ماجول از RAM هایتان را خارج کنید و ببینید که برنامه باز هم می تواند نوع را تشخیص دهد یا نه؟