Форум: "Система";
Текущий архив: 2002.07.04;
Скачать: [xml.tar.bz2];
ВнизПомогите в Систем Инфо !! Найти похожие ветки
← →
SPeller (2002-03-31 16:33) [0]Нужна вот информация о системе пользователя. Подскажите, как можно раздобыть следующее:
- Название проца;
- Название видюхи;
- Объём видеопамяти;
- Имеющиеся в системе диски;
- Кол-во свободных системных ресурсов.
Прошу помочь, очень надо.
← →
Song (2002-03-31 16:47) [1]Помнится мне, какой-то компонентик здесь ходил... А так - из реестра.
← →
SPeller (2002-03-31 17:11) [2]И кол-во ресурсов тоже из реестра?
← →
SPeller (2002-03-31 23:47) [3]Ну што, никто не знает что-ли ?
← →
DC-AC (2002-04-01 07:44) [4]LMDSysInfo из LMD-Tools
← →
SPeller (2002-04-01 08:21) [5]DC-AС
Спасибо. Но остались ещё вопросы:
- Название видюхи;
- Объём видеопамяти;
- Имеющиеся в системе диски;
← →
Donal_Graeme (2002-04-01 10:26) [6]для видео - это только наброски.. эти функции работают, но не всегда... во-первых, в реестре может быть не указана данная информация, а во-вторых ключ в реестре может быть и 0001 и 0002 и т.п.
function GetVideoAdapterName: AnsiString;
var Reg : TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
Reg.OpenKey ("System\CurrentControlSet\Services\Class\Display\0000", False);
Result := Reg.ReadString ("DriverDesc");
Reg.Free;
end;
function GetVideoMemory: DWord;
var Reg : TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
Reg.OpenKey ("System\CurrentControlSet\Services\Class\Display\0000\Info", False);
Result := Reg.ReadInteger ("VideoMemory");
Reg.Free;
end;
← →
SPeller (2002-04-01 11:06) [7]Спасибо и за этот пример. А в реестре один ключ 0000, 0001 или 0002 или их может быть одновременно несколько ? Если один, то вычислить его труда не составит.
← →
Donal_Graeme (2002-04-01 15:01) [8]бывает и несколько
← →
SPeller (2002-04-02 02:54) [9]А если несколько, то это 2 видюхи ? Тогда можно выбрать любую из них. И ещё ненайденные мною вопросы:
- Список дисков
- Почему функция GlobalMemoryStatus возвращает меньшее кол-во оперативки чем на самом деле ? Например для 160 т.е 167772160 байт она выдаёт 167239680, что равно 159,49 метров?
← →
Poirot (2002-04-02 07:18) [10]
> SPeller ©
1- если список логических дисков и CD(DVD)-ROM, FLOPPY - то ручками пробиваем по всем букавкам GetDriveType...
А вот если винтик хотите найти то поступаем тем же манером как и с видео, но учтите что в Вынь2К винтики в реестре упомянаются все, даже если вы подключили какой-то когда-то и потом убрали - он там.... а ручками удалить не получается - кричит....
2 - не знаю....
PS: Здесь в форуме был пример с выводом названия видюхи (помоему через АПИ)... Я что-то в рассылке не могу найти...
← →
Donal_Graeme (2002-04-02 10:09) [11]насчёт видео, я не уверен, но по-моему вовсе не обязательно, что наличие двух разделов (0001 и 0002, например) означает присутствие двух видеокарт. могут остаться старые разделы при смене видео.
← →
SPeller (2002-04-02 11:13) [12]Donal_Graeme (02.04.02 10:09)
И как тогда определить какая из них сейчас стоит ?
← →
SPeller (2002-04-03 02:55) [13]>Poirot © (02.04.02 11:33)
Можешь на мыло скинуть этот определитель ?
>Donal_Graeme (02.04.02 11:51)
Рыться в реестре занятие не из приятных... А нельзя ли как-нибудь через биос, он-то верочно знает про видюху, или нет ?
← →
Donal_Graeme (2002-04-03 13:23) [14]через БИОС не знаю как... правда мне думается, что это нереально...
← →
SPeller (2002-04-03 15:12) [15]Но как-то ж можно, винда ведь как-то делает это и не важно какая она старая или новая, всё-равно определяет. Неужели никто незнает?
← →
ДЕД МАСТДАЙ (2002-04-03 16:38) [16]Народ вы хоть знаете что такое процессор, его команды? А про системную область биоса с адресса 0F000h слышали? Так вот вся инфа про процессор получаеться после команды CPUID с кодом 0F A2 что для Делфи будет $0F $A2 понятно? Значения CPUID зависит от значения регистра EAX. И в последствии возращает значения в ECX,EDX,EBX. Так это я начсет проца. Дальше начсет видокарты. Есть такое великолепное прерывание BIOS"a int 10h посвященное видеосервису, советую про него прочитать. Ну да ладно с ним. Про системное определение, нате пример:
procedure TForm1.button1click(Sender: TObject);
var
lpDisplayDevice: TDisplayDevice;
dwFlags: DWORD;
cc: DWORD;
begin
form1.memo1.Clear;
lpDisplayDevice.cb := sizeof(lpDisplayDevice);
dwFlags := 0;
cc:= 0;
while EnumDisplayDevices(nil, cc, lpDisplayDevice , dwFlags) do
begin
Inc(cc);
form1.memo1.lines.add(lpDisplayDevice.DeviceString);
end;
end;
И еще всем, скажите что это за програмаирование когда ты ипсользуешь компоненты? А, да никакое это не программирование а использование чужих идей!
← →
SPeller (2002-04-03 16:57) [17]ДЕД МАСТДАЙ
А мож про ресурсы чего-нить знаешь ?
← →
ДЕД МАСТДАЙ (2002-04-03 17:28) [18]Слушай SPeller может мне еще всю сисинфу написать а потом подписать ее "made by SPeller" ?
← →
SPeller (2002-04-03 17:32) [19]>ДЕД МАСТДАЙ (03.04.02 17:28)
>Слушай SPeller может мне еще всю сисинфу написать а потом подписать ее "made by SPeller" ?
Я задал вопрос, причём тут "made by SPeller" ?? Нельзя чтоли нормально ответить ? Или это не форум ?
← →
Donal_Graeme (2002-04-03 18:36) [20]2 ДЕД :
раз такой крутой, может ещё приведёшь возможные варианты данных из CPUID для разных процов? например, коды для Cyrix"ов
2 SPeller :
у нас тут рассматривание пальцев ДЕДА :-)))
← →
SPeller (2002-04-03 18:42) [21]Donal_Graeme (03.04.02 18:36)
Дед не дед, пальцы не пальцы, а вопрос остаётся не решённым. Хулиду называется.
← →
Donal_Graeme (2002-04-03 18:55) [22]я и сам раньше бился с этой проблемой (объём видеопамяти), и программер на одной из моих прошлых работ тоже бился, так и не решил, хотя он круче меня раз в 10 :-) я лучшего варианта, как через реестр не нашёл.
← →
ДЕД МАСТДАЙ (2002-04-03 19:28) [23]2 Donal_Graeme:
Слышь если кто-то знает больше, то не надо завидовать, че ж ты сам не подсказал? А если сам умный, про Cyrix спрашивать то за всей инфой лезь к ним и SDK у них качай да архитектуру поизучай. А вообще ты хоть сам понял что написал "коды для Cyrix"oв". Какие коды? Есть команды, а offset код для всех один 0Fh 0A2. Всю документацию про Cyrix писать не буду на тебе кусочек. Пока что известны такие значения для Cyrix.
При значение регитра EAX = 1 бит 6 содержит информацию про поддержку процессора PTE (Page Table Entries). На этом при вызове EAX=1 на Cyrix инфа закончилась, т.к все остальне 30 бит значения зарезервированый под процессоры Intel и AMD. При значении EAX=80000001h бит 24 соддержит информацию о поддержки Cyrix процессора расширения MMX. Расширения 3DNow узнаються таже как и на процессорах AMD. Другие значения одинаковы.
Доволен?
Я вообще не понимаю я к вам с дельным советом, а вы сразу так "крутой".
2 SPeller: использование реестра не поможет. Я точно не помню, как это сделать, если найду скжау или напишу.
2Donal_Graeme: Кто кому еще пальцы будет смотреть :)
← →
Cheb (2002-04-03 21:22) [24]DirectX знает всё о видеокартах и их параметрах, у него и спрашивайте.
(В том числе, AGP видеокарта или PCI, и какие видеорежимы поддерживает).
Там же и объём видеопамяти где-то спрятан.
А вообще, с точки зрения системы, видеопамять даже одной карточки может
представлять собой несколько блоков разного размера и назначения.
Например у 12Мб Voodoo2 на самом деле целых 3 видеопамяти: 4Мб собственно
видеопамяти (для экрана и Z-буфера) и 2 блока по 4Мб, пригодных только для
размещения текстур.
А в реестре действительно накапливается информация о всех видеокартах,
когда-либо вставлявшихся в данный комп - проверено на практике.
Procedure CheckForPentium;
var PrId: ShortString;
begin
Try
PrId:=" ";
Try
Asm
MOV EAX, 0
db $0F,$A2 /// CPUID
MOV DWORD PTR PrId[1], EBX
MOV DWORD PTR PrId[5], EDX
MOV DWORD PTR PrId[9], ECX
MOV BYTE PTR PrId[0], 12
End;
Except
End;
If PrId = "GenuineIntel" then ProcessorVendor:="Intel";
If (PrId = "AuthenticAMD") or(PrId = "AMD ISBETTER")
then ProcessorVendor:="AMD";
If PrId = "CyrixInstead" then ProcessorVendor:="Cyrix";
If PrId = "CentaurHauls" then ProcessorVendor:="IDT";
If PrId = "RiseRiseRise" then ProcessorVendor:="RISE";
Asm
DB $0F, $31; //RDTSC
End;
Except
Die("Процессор подавился командой RDTSC. (0F31h)"#13+
"Интересно: а это, вообще-то, Пентиум?.."#13+
"См. инструкцию, раздел "системные требования".",
"Processor has choked with a RDTSC command (OF31h)."#13+
"Maybe it""s not a Pentium ?.."#13+
"Refer to manual, section "System requirements".");
End;
end;
Или ещё прикол: мою видеокарту с TV-OUT даже DirectX видит, как две
видеокарты, из которых одна - AGP, а другая - PCI, не говоря уже о самой
Windows, где от этого безобразия врубилась поддержка работы с несколькими
мониторами... Вот и верь после этого системе!
Procedure GetProcVendor;
var PrId: ShortString;
begin
Try
PrId:="";
Try
Asm
MOV EAX, 0
db $0F,$A2 /// CPUID
MOV DWORD PTR PrId[1], EBX
MOV DWORD PTR PrId[5], EDX
MOV DWORD PTR PrId[9], ECX
MOV BYTE PTR PrId[0], 12
End;
Except
End;
ProcessorVendor:="Новая или малоизвестная марка";
If PrId = "GenuineIntel" then ProcessorVendor:="Intel";
If (PrId = "AuthenticAMD") or(PrId = "AMD ISBETTER")
then ProcessorVendor:="AMD";
If PrId = "CyrixInstead" then ProcessorVendor:="Cyrix";
If PrId = "CentaurHauls" then ProcessorVendor:="IDT";
If PrId = "RiseRiseRise" then ProcessorVendor:="RISE";
Except
ProcessorVendor:="процессор не поддерживает идентификацию. Вероятно, это 80486 или ниже";
End;
end;
← →
Cheb (2002-04-03 21:27) [25]Блин!...
Извиняюсь за CheckForPentium - случайно просочилась. Это то, из чего я пример
делал (т.е. только 2я процедура правильная)
← →
Cheb (2002-04-03 21:40) [26]..Да, и ещё:
var V: Cardinal;
...
Try
ASM
MOV EAX, 1
db $0F,$A2 /// CPUID
AND EAX, 00000FF0h
MOV [V], EAX
End;
Except
V:=0;
End;
...
if ProcessorVendor = "AMD" then begin
If V=$580 then ProcessorVendor:=ProcessorVendor+" K6-2";
If V=$590 then ProcessorVendor:=ProcessorVendor+" K6-3";
...Ну и так далее - подробные коды для конкретных моделей конкретных фирм можно найти
на сайтах производителей или ещё где-нибудь.
Но этот путь-тупиковый: такая прога не сможет узнвть имена новых процессоров, а новые
версии Windows-смогут. И ещё многопроцессорные системы уже появились (хотя вряд ли
можно будет совместно использовать процессоры разных моделей)
Зато так вы спрашиваете имя-фамилию напрямую у процессора, не связываясь с Windows.
← →
Cheb (2002-04-03 22:04) [27]Да! чуть не забыл про то, как тактовую частоту процессора мерить (причём, с учётом разгона).
Метод может давать некоторую погрешность
function MeasureProcessorClock: Int64;
var
Stamp, Count1, Count2, Freq: Int64;
PriorityClass, Priority : Integer;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
QueryPerformanceFrequency(Freq);
If Freq=0 then begin
MeasureProcessorClock:=0; //таковое условие невозможно, но-на всякий случай...
EXIT;
end;
Count2:=0;
Try
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
//не знаю, как это пройдёт под NT и потомством. Там это зависит от прав процессов, но, кажется,
//при отсутствии прав на изменение приоритета запрос просто игнорируется, не вызывая ошибки
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
asm
db $0F,$31 /// rdtsc
MOV DWORD PTR Stamp, EAX
MOV DWORD PTR Stamp + 4, EDX
end;
QueryPerformanceCounter(Count1);
Sleep(100);
asm
db $0F,$31 /// rdtsc
SUB EAX, DWORD PTR Stamp
SBB EDX, DWORD PTR Stamp + 4
MOV DWORD PTR Stamp, EAX
MOV DWORD PTR Stamp + 4, EDX
end;
QueryPerformanceCounter(Count2);
Finally
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
End;
If Count2 > 0 //т.е. не было исключений в процессе измерения,
//(например, если процессор не знает команды RDTSC)
then
MeasureProcessorClock:=Round(Stamp*1.0*Freq/(Count2-Count1))
else
MeasureProcessorClock:=0;
end;
Вот, вроде всё.
← →
SPeller (2002-04-04 01:35) [28]>All
Всё что здесь обсуждается, приводятся примеры, всё это у меня уже есть. Ну где про ресурсы и реальный пример с видюхой ?
← →
Donal_Graeme (2002-04-04 10:21) [29]2 ДЕД :
не подсказал потому, что было сказано про LMD и SPeller сказал, что вопрос отпал.
под кодами я имел ввиду содержимое регистров после вызова CPUID.
Про Сайрикс спросил потому, что в своё время искал по ним данные (правда неактивно) и не нашёл :-)
А вот насчёт дельных советов... Да, совет действительно дельный, но вот тон, каким был этот совет дан...Если я неправильно его понял, то извини.
← →
KSergey (2002-04-04 11:58) [30]Про узнвание загружености процессора можно тут поузнавать
http://www.sources.ru/delphi/delphi_get_active_threads.shtml
[я этого не знал]
← →
SPeller (2002-04-04 14:16) [31]>Poirot © (02.04.02 07:18)
>1- если список логических дисков и CD(DVD)-ROM, FLOPPY - то ручками пробиваем по всем букавкам GetDriveType...
Делаю всё так, но вот почему-то диск С: пропускается таким образом (вылазит A: D: E:).
>All
Ну плиз, про ресурсы чего-нибудь, а то выдирать это из LMD долго и много.
← →
DenKop (2002-04-05 13:45) [32]Могу намылить набор компонентов по этой теме.
← →
SPeller (2002-04-05 14:01) [33]DenKop © (05.04.02 13:45)
Валяйте, буду очень благодарен !
← →
SPeller (2002-04-07 06:42) [34]Ну и где это хреново мыло ???
.......
Вот редиска...........
← →
La2Sc (2002-04-08 14:27) [35]Простой компонент. Лови.
← →
DenKop (2002-04-09 00:00) [36]Намылил, принимай.
← →
Poirot (2002-04-09 08:09) [37]
> SPeller ©
Делаю всё так, но вот почему-то диск С: пропускается таким образом (вылазит A: D: E:).
А у меня всё OK...
← →
SPeller (2002-04-09 10:58) [38]>Poirot © (09.04.02 08:09)
Делаю вот так:
function GetDrives:string;
var i:integer;st,tm:string;
begin
st:="";
for i:=ord("A") to ord("Z") do begin
tm:=chr(i)+":";
if getdrivetype(pchar(tm))>1 then st:=st+tm+" ";
end;
result:=st;
end;
Отсюда вылазит строка "A: D: E:"
Чё это такое ?
← →
Donal_Graeme (2002-04-09 15:39) [39]tm:=chr(i)+":\";
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.07.04;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.006 c