Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
14-03-2010 13:54 | Комментарий к предыдущим ответам
14-03-2010 12:49 | Комментарий к предыдущим ответам
Я с удовольствием подискутирую на тему совместимости и использования возможностей системы, но так как вопрос выходит за рамки "как узнать имя CPU", может, нам куда-то переместиться ?
14-03-2010 05:30 | Комментарий к предыдущим ответам
У меня есть одно замечание или скорее вопрос (а может пожелание) на эту тему, тоже общетеоретическое, но не писал, т.к. не хотел тему засорять. если переместитесь в легкодоступное место, напишу. ))
14-03-2010 05:05 | Комментарий к предыдущим ответам
Не засоряем ли мы топик автора ? Я с удовольствием подискутирую на тему совместимости и использования возможностей системы, но так как вопрос выходит за рамки "как узнать имя CPU", может, нам куда-то переместиться ? Глядишь, еще кто-нибудь подтянется :)
Причем, это не документировано (или документировано?).
14-03-2010 01:21 | Комментарий к предыдущим ответам
>>> Странно, открыл сейчас About запущенных программ (PL/SQL Developer, Delphi 2006, Process Explorer) - нигде не увидел информацию о железе
Я имел в виду попсовые программы, так как серьезные разработчики очень избирательно относятся к новомодным веяниям от Микрософт. Кстати, погонял VS Office 2003. Действительно, там в окошке About осталась только кнопка для просмотра конфигурации. Значит мода уже прошла. Давненько я не заглядывал в About ;-)
>>> Некоторое время назад MS, начиная с логотипа Windows 95 Compatible активно рекомендовали пользоваться именно реестром для хранения данных программы. На этой волне крайне много программ хранят свои данные в реестре
Это все так. И возможность обращения к ключам реестра, скорее всего, проживет долго. Даже если изменится организация реестра, функции API по работе с узлами все равно останутся. И пользовательская программа, хранящая данные в реестре останется работоспособной. А вот то, что структура узлов реестра для хранения данных самой ОС будет неизменной -- это уже большой вопрос. Возможно, Микрософт как-то по другому организует структуру дерева для хранения параметров ОС, возможно, часть данных будет перенесена из реестра еще куда-то. Потому что для этих данных имеются специальные функции API, и Микрософт не предполагает, что кто-то будет сам рыться в реестре в поисках нужных узлов вместо того, чтобы воспользоваться готовой функцией и получить нужные данные.
Раз уж мы сошлись в очередной дискуссии, то замечу, что идея хранить все настройки всех программ в реестре была... э-э-э... не самой удачной: завязывание на один единственный формат -- это не всегда удобно. Я для себя принял несколько другой подход. В реестре храним только необходимый минимум -- ссылку на саму программу (может быть, версия и еще что-то минимальное) в HKLM\Software. А дальше уже сама программа знает, где именно и в каком виде она хранит остальные настройки. Если судить по содержимому C:\Documents and Settings\***\Application Data\, то так думаю не только я.
>>> "Hello, world", написанный 20 лет назад тоже работает. Наверное к реестру не обращается
Во-первых, не будем равнять продукты Питера Нортона и "Hello, world". Во-вторых, речь идет вовсе не про обращение к реестру. Дело в том, что Питер Нортон в своих разработках старался по-возможности использовать те механизмы, которые будут оставаться работоспособными очень долго. Если есть какай-то документированная возможнойсть ОС, и эта возможность работает с приемлемым качеством, он пользовался именно ей.
Возвращаясь к нашим баранам... Есть реестр, в котором в определенном узле в версии Windows XP Микрософт хранит имя процессора. Причем, это не документировано (или документировано?). И есть документированная функция API, возвращающая имя процессора. Какой вариант из двух предположительно окажется более долгоживущим?
>>> Кстати, программы от Питера Нортона, написанные 20 лет назад, на Windows 7 в 64-битной редакции работать не будут. Ни одна.
Лишний повод не переходить на ОС семейства Виста. Ну как можно работать на компьютере, где даже Norton Commander не идет :D
Когда я открываю окошко About, то я хочу получить информацию о программе, а не об ОС и не о железе (для них есть свои программы). Но почему-то Микрософт начал эту инфу вставлять в About, а остальные разработчики собезьянничали и тоже стали вставлять.
Странно, открыл сейчас About запущенных программ (PL/SQL Developer, Delphi 2006, Process Explorer) - нигде не увидел информацию о железе.
В чем проще поддерживать совместимость: в формате запросов или в структуре реестра?
Не вижу принципиальной разницы. И то, и то надо поддерживать, и то, и то используется и будет использоваться. Некоторое время назад MS, начиная с логотипа Windows 95 Compatible активно рекомендовали пользоваться именно реестром для хранения данных программы. На этой волне крайне много программ хранят свои данные в реестре, в том числе и сама операционная система, и изменять структуру реестра в такой ситуации, является самоубийством.
А продукты Питера Нортона до сих пор работают. Уже больше 20 лет. И заслуга в этом не только Микрософта, который здорово обеспечивает обратную совместимость
"Hello, world", написанный 20 лет назад тоже работает. Наверное к реестру не обращается.
А вот игрушка Lines2, для DOS, 16-битная, мало того, что не работает в 32-х битных редакциях системы выше XP, так еще и в 64-битной Windows 7 напрочь отказывается :)
Я к чему такой длинный монолог затеял - за те 17 лет, что существует Win32, технологий различного рода от Microsoft сменилось - мало не покажется. Когда-нибудь и WMI может постигнуть та же судьба, по меньшей мере никто не даст гарантии, что интерфейсы WMI не изменятся быстрее, чем структура реестра.
Кстати, программы от Питера Нортона, написанные 20 лет назад, на Windows 7 в 64-битной редакции работать не будут. Ни одна.
13-03-2010 13:41 | Комментарий к предыдущим ответам
>>> Я предлагаю еще один механизм (простой), для тех, кому неудобно встраивать CPUID или не всегда удобно тащить за своим приложением обращение к WMI.
Пардон, на самое главное я и не ответил.
Я не хочу сказать, что этот способ неправильный и им ни в коем случае нельзя пользоваться. В конце концов, в том блоге Александра Алексеева есть упоминание программ (игрушек), время жизни которых -- три месяца. За это время всяко Винда не успеет кардинально измениться :-)
Но для меня идеалом является Питер Нортон, а не какая-нибудь СуперМегаГеймСофт, которая штампует по десятку игр в год, срубая на этом нехилые бабки с игроков-наркоманов. А продукты Питера Нортона до сих пор работают. Уже больше 20 лет. И заслуга в этом не только Микрософта, который здорово обеспечивает обратную совместимость.
13-03-2010 13:35 | Комментарий к предыдущим ответам
>>> Или в очередной версии Windows изменится механизм запросов к WMI
В чем проще поддерживать совместимость: в формате запросов или в структуре реестра? Особенно, если народ начинает потихонечку плеваться на большую свалку бесполезных данных, называемую реестром, и Микрософот (теоретически) может вообще от реестра в существующем ныне виде отказаться.
Наверное, все что угодно, мы можем получить, поковырявшись в системных файлах ОС. Но почему-то имеется огромный API. И разработчики предпочитают пользоваться им. И что-то я уже не вижу программ, которые анализировали бы файлы Win.ini и System.ini (хотя что-то такое по-прежнему где-то там болтается)
>>> А что касается изменения механизмов работы в будущих версиях Windows, есть хорошая статья
А что касается хорошей статьи, то применительно к теме этой дискуссии можно сказать так: можно ли считать, что программа стала неработоспособной, если она всего лишь перестала в окошке About правильно выводить информацию о процессоре?
P.S. Кстати, это какой-то идиотизм. Когда я открываю окошко About, то я хочу получить информацию о программе, а не об ОС и не о железе (для них есть свои программы). Но почему-то Микрософт начал эту инфу вставлять в About, а остальные разработчики собезьянничали и тоже стали вставлять.
А потом в очередной версии Windows Микрософт чуть-чуть изменит структуру реестра, и программа, работающая напрямую с реестром, станет неработоспособной. Как я понимаю, именно для устранения таких коллизий Микрософт предложил WMI
Или в очередной версии Windows изменится механизм запросов к WMI, или команда CPUID перейдет в разряд привилегированных, или взбунтуются ходжентские лепешечники и канибадамские маслоделы откажутся платить подати :)
Я предлагаю еще один механизм (простой), для тех, кому неудобно встраивать CPUID или
не всегда удобно тащить за своим приложением обращение к WMI.
13-03-2010 09:20 | Комментарий к предыдущим ответам
>>> Все уже придумано до нас
А потом в очередной версии Windows Микрософт чуть-чуть изменит структуру реестра, и программа, работающая напрямую с реестром, станет неработоспособной. Как я понимаю, именно для устранения таких коллизий Микрософт предложил WMI.
Geo
>>> Лишнее знание... э-э-э... иногда... только вредит. Я Вам ссылку с поисковым
>>> запросом подготовил, сходили бы по ней. На всякий случай поясняю, CPU в переводе >>> на русский звучит как "процессор" ;-)
ППЦ
>>> Почему громоздко?
Надо тащить компоненты ради получения одного единственного параметра?
Sapersky
FastCode смотрел буквально вчера. Нужного мне там нет.
Только можно проверить поддержку доп. инструкций процессора, что
можно сделать и системно.
function CPUInfo2Str(Const cInfo : TCPUInfo; SpeedMhz : Integer = 0;
StartCpuFeature : TCPUFeature = cfMMX): String;
Const
FeatureNames : array [TCPUFeature] of String =
('CX8', 'CMOV', 'MMX', 'MMX2', 'SSE', 'SSE2', '3DNow','3DNow2');
Var i : Integer;
s, s1 : String;
f : TCPUFeature;
begin
If Pos('Intel', cInfo.VendorID) > 0 then begin
Case cInfo.Family of
6 : Case cInfo.Model of
3..6 : s := 'Pentium 2';
7, 8, $A, $B : s := 'Pentium 3';
9, $D, $E : s := 'Pentium M';
$F : s := 'CoreDuo';
end;
$F : s := 'Pentium 4';
end;
s := 'Intel ' + s;
end else
If Pos('AMD', cInfo.VendorID) > 0 then begin
Case cInfo.Family of
6 : Case cInfo.Model of
3,6 : s := 'Duron';
1,2,4 : s := 'Athlon';
else s := 'AthlonXP';
end;
$F : s := 'Athlon64';
end;
s := 'AMD ' + s;
end else
s := cInfo.VendorID;
If (SpeedMhz <> 0) then begin
Str(SpeedMhz, s1); s := s + ', ' + s1 + ' Mhz';
end;
Str(cInfo.CPUCount, s1);
Result := s + '; Count/Cores: ' + s1;//Num_2Str(cInfo.CPUCount);
If StartCpuFeature < High(TCPUFeature) then begin
Result := Result + '; Features: ';
i := 0;
For f := StartCpuFeature to High(TCPUFeature) do
If (f in cInfo.Features) then begin
If (i > 0) then Result := Result + ', ';
Result := Result + FeatureNames[f];
Inc(i);
end;
end;
end;
Довольно примитивно, без нюансов, но в принципе можно усовершенствовать, порывшись в документации по CPUID.
Ещё пример работы с CPUID есть в FastCode, более развёрнутый, где-то даже слишком (занимает целый модуль приличного размера).
Частота процессора в Мгц (не всегда точно):
// from "Delphi in a Nutshell" book
function Sys_GetCPUSpeed(MeasTime : Integer = 100): Integer;
//Const DelayTime = 100; // measure time in ms
Var
TimerHi, TimerLo: DWord;
PriorityClass, Priority: Integer;
begin
PriorityClass:=GetPriorityClass(GetCurrentProcess);
Priority:=GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
dw 310Fh // rdtsc
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(MeasTime);
asm
dw 310Fh // rdtsc
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result := Round(TimerLo / (1000.0 * MeasTime));
end;
13-03-2010 02:59 | Комментарий к предыдущим ответам
В статье, на которую я дал ссылке, автор пишет, что нуэно установить WMI SDK. Я думаю, что это - не необходимо, достаточно импортировать библиотеку типов WbemScripting (действие - на 2 минуты). И после этого можно использовать готовый код автора статьи.
>>> Тащить WMI слишком громоздко
Почему громоздко? Что в этом громоздкого? Наоборот, Вы уменьшаете размер своего кода и повышаете го универсальность, так как будете пользоваться готовым механизмом ОС.
>>> Поиск на счёт CPU выдаёт только "как узнать нагрузку CPU" и всё
Лишнее знание... э-э-э... иногда... только вредит. Я Вам ссылку с поисковым запросом подготовил, сходили бы по ней. На всякий случай поясняю, CPU в переводе на русский звучит как "процессор" ;-)
Как вариант - asm-команда CPUID, но с ней придётся повозиться, готовой строки она не даёт, нужно формировать на основании полученных параметров. Пример использования CPUID - в FastLib (там же, кстати, см. заполнение цветом и прочая, прочая). Если интересно, могу выложить свою функцию для формирования строки по TCPUInfo, но она весьма приблизительно (и не всегда верно) определяет современные процессоры, надо дорабатывать.
WMI, скорее всего, будет проще.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.