Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 1 521

/ вопрос открыт /

Здравствуйте глубокоуважаемые! Подскажите как средствами WIN API получить информацию о материнской плате и процессоре (производитель, модель, чипсет, тактовая частота........)

Sanek Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Sanek (статус: Посетитель)
Вопрос отправлен: 23 апреля 2008, 16:30
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, Sanek!
Тема очень интересная и большая. Она не раз обсуждалась. По материнкам сказать ничего не могу, а по процессорам смотрите в приложении примеры:
1. Получение количества установленных процессоров;
2. Получение уровня процессора;
3. Как определить наличие сопроцессора;
4. Определение поддержки SSE;
5. Определение поддержки SSE2;
6. Определение фирмы производителя CPU;
7. Поддерживает ли процессор технологию 3DNow;
8. Как узнать тип процессора (через реестр);
9. Как узнать скорость процессора.
А так же в Атаче всем известный модуль CpuID.pas - 32 kb.
P.S. Желаю удачи.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Приложение:
  1.  
  2. function GettingProcNum: string; //Win95 or later and NT3.1 or later
  3. var
  4. Struc: _SYSTEM_INFO;
  5. begin
  6. GetSystemInfo(Struc);
  7. Result:=IntToStr(Struc.dwNumberOfProcessors);
  8. end;
  9.  
  10.  
  11. function GettingProcLevel: string; //Win95 or later and NT3.1 or later
  12. var
  13. Struc: _SYSTEM_INFO;
  14. begin
  15. GetSystemInfo(Struc);
  16. Case Struc.wProcessorLevel of
  17. 3: Result:='Intel 80386';
  18. 4: Result:='Intel 80486';
  19. 5: Result:='Intel Pentium';
  20. 6: Result:='Intel Pentium II or better';
  21. end;
  22. end;
  23.  
  24.  
  25. {$IFDEF WIN32}
  26.  
  27. uses Registry;
  28.  
  29. {$ENDIF}
  30.  
  31. function HasCoProcesser : bool;
  32. {$IFDEF WIN32}
  33. var
  34. TheKey : hKey;
  35. {$ENDIF}
  36. begin
  37. Result := true;
  38. {$IFNDEF WIN32}
  39. if GetWinFlags and Wf_80x87 = 0 then
  40. Result := false;
  41. {$ELSE}
  42. if RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  43. 'HARDWAREDESCRIPTIONSystemFloatingPointProcessor',0,
  44. KEY_EXECUTE, TheKey) <> ERROR_SUCCESS then result := false;
  45. RegCloseKey(TheKey);
  46. {$ENDIF}
  47. end;
  48.  
  49. procedure TForm1.Button1Click(Sender: TObject);
  50. begin
  51. if HasCoProcesser then
  52. ShowMessage('Has CoProcessor')
  53. else
  54. ShowMessage('No CoProcessor - Windows Emulation Mode');
  55. end;
  56.  
  57.  
  58. { **** UBPFD *********** by delphibase.endimus.com ****
  59.  
  60.  
  61.  
  62.  
  63. Copyright: Unknown
  64.  
  65. ***************************************************** }
  66.  
  67. function CheckSSE: Boolean;
  68. var
  69. TempCheck: dword;
  70. begin
  71. TempCheck := 1;
  72. asm
  73. push ebx
  74. mov eax,1
  75. db $0F,$A2
  76. test edx,$2000000
  77. jz @NOSSE
  78. mov edx,0
  79. mov TempCheck,edx
  80. @NOSSE:
  81. pop ebx
  82. end;
  83. CheckSSE := (TempCheck = 0);
  84. end;
  85.  
  86.  
  87. { **** UBPFD *********** by delphibase.endimus.com ****
  88.  
  89.  
  90.  
  91.  
  92. Copyright: Unknown
  93.  
  94. ***************************************************** }
  95.  
  96. function CheckSSE2: Boolean;
  97. var
  98. TempCheck: dword;
  99. begin
  100. TempCheck := 1;
  101. asm
  102. push ebx
  103. mov eax,1
  104. db $0F,$A2
  105. test edx,$4000000
  106. jz @NOSSE2
  107. mov edx,0
  108. mov TempCheck,edx
  109. @NOSSE2:
  110. pop ebx
  111. end;
  112. CheckSSE2 := (TempCheck = 0);
  113. end;
  114.  
  115.  
  116. { **** UBPFD *********** by delphibase.endimus.com ****
  117.  
  118.  
  119.  
  120.  
  121. Copyright:
  122.  
  123. ***************************************************** }
  124.  
  125. type
  126. TVendor = array[0..11] of char;
  127.  
  128. .........................
  129.  
  130. function GetCPUVendor: TVendor; assembler; register;
  131. asm
  132. PUSH EBX {Save affected register}
  133. PUSH EDI
  134. MOV EDI,EAX {@Result (TVendor)}
  135. MOV EAX,0
  136. DW $A20F {CPUID Command}
  137. MOV EAX,EBX
  138. XCHG EBX,ECX {save ECX result}
  139. MOV ECX,4
  140. @1:
  141. STOSB
  142. SHR EAX,8
  143. LOOP @1
  144. MOV EAX,EDX
  145. MOV ECX,4
  146. @2:
  147. STOSB
  148. SHR EAX,8
  149. LOOP @2
  150. MOV EAX,EBX
  151. MOV ECX,4
  152. @3:
  153. STOSB
  154. SHR EAX,8
  155. LOOP @3
  156. POP EDI {Restore registers}
  157. POP EBX
  158. end;
  159.  
  160.  
  161.  
  162.  
  163. function 3DNowSupport: Boolean; assembler;
  164. asm
  165. push ebx
  166. mov @Result, True
  167. mov eax, $80000000
  168. dw $A20F
  169. cmp eax, $80000000
  170.  
  171. mov eax, $80000001
  172. dw $A20F
  173. test edx, $80000000
  174.  
  175. @NOEXTENDED:
  176. mov @Result, False
  177. @EXIT:
  178. pop ebx
  179. end;
  180. {$endif}
  181.  
  182.  
  183. function CPUType: string;
  184. var
  185. Reg: TRegistry;
  186. begin
  187. CPUType := '';
  188. Reg := TRegistry.Create;
  189. try
  190. Reg.RootKey := HKEY_LOCAL_MACHINE;
  191. if Reg.OpenKey('HardwareDescriptionSystemCentralProcessor', False) then
  192. CPUType := Reg.ReadString('Identifier');
  193. finally
  194. Reg.Free;
  195. end;
  196. end;
  197.  
  198.  
  199. function GetCPUSpeed: Double;
  200. const DelayTime = 500;
  201. var TimerHi : DWORD;
  202. TimerLo : DWORD;
  203. PriorityClass : Integer;
  204. Priority : Integer;
  205. begin
  206. PriorityClass := GetPriorityClass(GetCurrentProcess);
  207. Priority := GetThreadPriority(GetCurrentThread);
  208. SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
  209. SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
  210. Sleep(10);
  211. asm
  212. DW 310Fh // rdtsc
  213. MOV TimerLo, EAX
  214. MOV TimerHi, EDX
  215. end;
  216. Sleep(DelayTime);
  217. asm
  218. DW 310Fh // rdtsc
  219. SUB EAX, TimerLo
  220. SBB EDX, TimerHi
  221. MOV TimerLo, EAX
  222. MOV TimerHi, EDX
  223. end;
  224. SetThreadPriority(GetCurrentThread, Priority);
  225. SetPriorityClass(GetCurrentProcess, PriorityClass);
  226. Result := TimerLo / (1000.0 * DelayTime);
  227. end;
  228.  
  229. // Usage ...
  230.  
  231. LabelCPUSpeed.Caption := Format('CPU speed: %f MHz', [GetCPUSpeed]);
  232.  
  233.  
  234. function GetCPUSpeed: real;
  235.  
  236. function IsCPUID_Available: Boolean; assembler; register;
  237. asm
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248. MOV AL,True { Result=True }
  249. @exit:
  250. end;
  251.  
  252. function hasTSC: Boolean;
  253. var
  254. Features: Longword;
  255. begin
  256. asm
  257. MOV Features,0 { Features = 0 }
  258.  
  259. PUSH EBX
  260. XOR EAX,EAX
  261. DW $A20F
  262. POP EBX
  263.  
  264. CMP EAX,$01
  265. JL @Fail
  266.  
  267. XOR EAX,EAX
  268. MOV EAX,$01
  269. PUSH EBX
  270. DW $A20F
  271. MOV Features,EDX
  272. POP EBX
  273. @Fail:
  274. end;
  275.  
  276. hasTSC := (Features and $10) <> 0;
  277. end;
  278.  
  279. const
  280. DELAY = 500;
  281. var
  282. TimerHi, TimerLo: Integer;
  283. PriorityClass, Priority: Integer;
  284. begin
  285. Result := 0;
  286. if not (IsCPUID_Available and hasTSC) then Exit;
  287. PriorityClass := GetPriorityClass(GetCurrentProcess);
  288. Priority := GetThreadPriority(GetCurrentThread);
  289.  
  290. SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
  291. SetThreadPriority(GetCurrentThread,
  292. THREAD_PRIORITY_TIME_CRITICAL);
  293.  
  294. SleepEx(10, FALSE);
  295.  
  296. asm
  297.  
  298.  
  299. MOV TimerLo,EAX
  300. MOV TimerHi,EDX
  301. end;
  302.  
  303. SleepEx(DELAY, FALSE);
  304.  
  305. asm
  306.  
  307.  
  308. SUB EAX,TimerLo
  309. SBB EDX,TimerHi
  310. MOV TimerLo,EAX
  311. MOV TimerHi,EDX
  312. end;
  313.  
  314. SetThreadPriority(GetCurrentThread, Priority);
  315. SetPriorityClass(GetCurrentProcess, PriorityClass);
  316. Result := TimerLo / (1000 * DELAY);
  317. end;
  318.  
  319.  
  320. const
  321. ID_BIT=$200000; // EFLAGS ID bit
  322.  
  323. function GetCPUSpeed: Double;
  324. const
  325. DelayTime = 500;
  326. var
  327. TimerHi, TimerLo: DWORD;
  328. PriorityClass, Priority: Integer;
  329. begin
  330. try
  331. PriorityClass := GetPriorityClass(GetCurrentProcess);
  332. Priority := GetThreadPriority(GetCurrentThread);
  333.  
  334. SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
  335. SetThreadPriorit(GetCurrentThread,THREAD_PRIORITY_TIME_CRITICAL);
  336.  
  337. Sleep(10);
  338. asm
  339. dw 310Fh // rdtsc
  340. mov TimerLo, eax
  341. mov TimerHi, edx
  342. end;
  343. Sleep(DelayTime);
  344. asm
  345. dw 310Fh // rdtsc
  346. sub eax, TimerLo
  347. sbb edx, TimerHi
  348. mov TimerLo, eax
  349. mov TimerHi, edx
  350. end;
  351.  
  352. SetThreadPriority(GetCurrentThread, Priority);
  353. SetPriorityClass(GetCurrentProcess, PriorityClass);
  354.  
  355. Result := TimerLo / (1000.0 * DelayTime);
  356. except end;
  357. end;
  358.  
  359.  
  360. procedure TForm1.Button1Click(Sender: TObject);
  361. var cpuspeed:string;
  362. begin
  363. cpuspeed:=Format('%f MHz', [GetCPUSpeed]);
  364. edit1.text := cpuspeed;
  365. end;
  366.  
  367.  
  368. function RdTSC : int64; register;
  369. asm
  370. db $0f, $31
  371. end;
  372.  
  373. function GetCyclesPerSecond : int64;
  374. var
  375. hF, T, et, sc : int64;
  376. begin
  377. QueryPerformanceFrequency(hF); // HiTicks / second
  378. QueryPerformanceCounter(T); // Determine start HiTicks
  379. et := T + hF; // (Cycles are passing, but we can still USE them!)
  380. sc := RdTSC; // Get start cycles
  381. repeat // Use Hi Perf Timer to loop for 1 second
  382. QueryPerformanceCounter(T); // Check ticks NOW
  383. until (T >= et); // Break the moment we equal or exceed et
  384. Result := RdTSC - sc; // Get stop cycles and calculate result
  385. end;


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 23 апреля 2008, 17:16
Оценка за ответ: 4

Комментарий к оценке: Спасибо огромное за ответ. Жаль что по материнкам не можешь подсказать.

Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 17 августа 2017, 11:01
Выполнено за 0.05 сек.
Рейтинг@Mail.ru