Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Кирилл2100
1 / 1 / 0
Регистрация: 29.08.2013
Сообщений: 48
#1

Определение процессора без доступа к реестру - C++

24.06.2014, 09:35. Просмотров 939. Ответов 9
Метки нет (Все метки)

Необходимо получить строку
Процессор: Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz
Через регистр делается все крайне просто

C++
1
2
3
4
5
6
AnsiString ProcessorName;
TRegistry *reg = new TRegistry;
reg->RootKey = HKEY_LOCAL_MACHINE;
reg->OpenKey(«Hardware\\Description\\System\\CentralProcessor\», false);
ProcessorName=reg->ReadString(«ProcessorNameString»);
delete reg;
Однако не на всех учетках есть доступ к регистру.

Нашел функцию cpuid, но уже который час пытаюсь ее завести, но желаемая строка не формируется. Если кто уже сталкивался с cpuid, подскажите пожалста

Добавлено через 22 минуты
Возможно ли получить эту информацию через диспетчер устройств?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2014, 09:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определение процессора без доступа к реестру (C++):

Права доступа к определенным веткам реестра.Доступ к реестру. - C++ Builder
Уважаемые специалисты. Подскажите пожалуйста, как програмно получить права на чтение и изменение определенных веток реестра. А именно...

Определение частоты процессора в реальном времени - C++ Builder
#include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- ...

XE5 тормозит без доступа к интернету - C++ Builder
Возможно кто-то уже сталкивался с подобной проблемой и может посоветовать как ее обойти. Извиняюсь,если не в том разделе создал тему

Доступ к реестру - C++ Builder
Здравствуйте!!! Ребята, подскажите по такому вопросу. Есть ли универсальные функции доступа к реестру, а именно чтобы можно было влесть в...

Определение частоты процессора - Visual C++
Всем доброго времени суток! Хотелось бы узнать, как считать частоту процессора. В интернете нарыл только ассемблер.

Курсовой Visual C++. Определение типа, скорости процессора - Visual C++
С++ только первый курс, пишем только самые простые консольные приложения, а тут на тебе, курсак. В курсовом нужно решить следующие...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-=ЮрА=-
Заблокирован
Автор FAQ
24.06.2014, 09:45 #2
Цитата Сообщение от Кирилл2100 Посмотреть сообщение
Однако не на всех учетках есть доступ к регистру.
- к реестру а не регистру
Информация о системе посмотри пункты
Инфо о системе и Инфо о проце
1
Кирилл2100
1 / 1 / 0
Регистрация: 29.08.2013
Сообщений: 48
24.06.2014, 10:39  [ТС] #3
Да, реестр. Заговариваюсь уже.

За код спасибо. Получил окошко такого вида:
Определение процессора без доступа к реестру

Из него возможно получить информацию вида:
Процессор: Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz
?
0
-=ЮрА=-
Заблокирован
Автор FAQ
24.06.2014, 20:25 #4
Кирилл2100, неужели не видишь что в коде использована АПИ функция?
void WINAPI GetSystemInfo(
_Out_ LPSYSTEM_INFO lpSystemInfo
);
идёшь в справку по ней
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
и смотришь что выходным параметром функции являются поля структуры SYSTEM_INFO
на той же странице идёшь по линку на расшифровку полей структуры
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
и читай конкретное значений полей структуры Members там же всё написано!
0
_lunar_
1288 / 1214 / 86
Регистрация: 03.05.2011
Сообщений: 2,864
Записей в блоге: 6
Завершенные тесты: 1
24.06.2014, 20:42 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Кирилл2100 Посмотреть сообщение
Нашел функцию cpuid, но уже который час пытаюсь ее завести, но желаемая строка не формируется. Если кто уже сталкивался с cpuid, подскажите пожалста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
 
using namespace std;
 
void main()
{
    int CPUInfo[4] = { -1 };
 
    __cpuid(CPUInfo, 0x80000000);
 
    unsigned int ID = CPUInfo[0];
 
    char CPUName[0x256] = { 0 };
 
    for (unsigned int i = 0x80000000; i <= ID; ++i)
    {
        __cpuid(CPUInfo, i);
 
        if (i == 0x80000002)
            memcpy(CPUName, CPUInfo, sizeof(CPUInfo));
 
        else if (i == 0x80000003)
            memcpy(CPUName + 16, CPUInfo, sizeof(CPUInfo));
 
        else if (i == 0x80000004)
            memcpy(CPUName + 32, CPUInfo, sizeof(CPUInfo));
    }
 
    cout << CPUName << endl;
 
    cin.get();
}
на всякий случай, для GPU есть amp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <amp.h>
 
using namespace std;
using namespace concurrency;
 
void main()
{
    accelerator GPUName;
    wcout << GPUName.description << endl;
 
    cin.get();
}
3
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
24.06.2014, 21:58 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Кирилл2100 Посмотреть сообщение
Однако не на всех учетках есть доступ к регистру.
К этим разделам доступ на чтение есть у всех учеток.
1
Кирилл2100
1 / 1 / 0
Регистрация: 29.08.2013
Сообщений: 48
25.06.2014, 08:32  [ТС] #7
Юра,я эту структуру знаю и всю ее посмотрел. Нужную строку через нее я получить не смог. Поэтому и спрашиваю.
_lunar_, спасибо большое за пример. Обязательно попробую.
Убежденный, спасибо тебе огромное! Нашел твои комментарий "Для чтения реестра достаточно KEY_READ." и все пошло. Жаль вчера не нашел это сразу, так не пришлось бы день тратить.

Стало быть конечный вариант:

C++
1
2
3
4
TRegistry *reg = new TRegistry(KEY_READ);
 reg->RootKey = HKEY_LOCAL_MACHINE;
 reg->OpenKeyReadOnly("Hardware\\Description\\System\\CentralProcessor\\0");
 AnsiString ProcessorName = reg->ReadString("ProcessorNameString");
0
-=ЮрА=-
Заблокирован
Автор FAQ
25.06.2014, 10:02 #8
Цитата Сообщение от Кирилл2100 Посмотреть сообщение
Юра,я эту структуру знаю и всю ее посмотрел. Нужную строку через нее я получить не смог. Поэтому и спрашиваю.
- SystemInfo позволяет установить архитектуру процессора, чипсет и много остальных парамтров. Если ты не собираешся писать софт который использует непосредственный токен
Цитата Сообщение от Кирилл2100 Посмотреть сообщение
Процессор: Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz
то поля SYSTEM_INFO позволяют сказать сразу сказать, что за железо стоит на борту, в то время как в токене
Процессор: Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz
- данные о процессоре ещё нужно поискать и извлечь!
Скажем у тебя двухядерный AMD скажи если будет записано AMD 3.2 GHz Duo что это тебе даст?
А если я сам возьму и изменю ветку реестра написав там "Процессор бла бла бла", сможешь определить характеристики?
Вот для таких случаев и служит SYSTEM_INFO которая даёт однозначный ответ - процессор такой-то архитектуры с таким-то чипсетом такого-то класса. Единственный случай когда мог бы пригодиться строковый токен - это создания ключа для привязки софта к конкретному железу, да и то тут можно было обойтись тем что в SYSTEM_INFO записано.
Касательно твоей проблеммы у тебя были записаны неверно кавычки
Цитата Сообщение от Кирилл2100 Посмотреть сообщение
«
вместо
"
и вдобавок в стркое был ненужный слеш
Цитата Сообщение от Кирилл2100 Посмотреть сообщение
\
уверен твой код либо не компилировался либо выдавал ворнинг unknown extra character или что то подобное. Остаётся добавить что в твоём итоговом варианте
Цитата Сообщение от Кирилл2100 Посмотреть сообщение
\\0
вконце вообще не нужен
0
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
25.06.2014, 10:25 #9
Кирилл2100, имей в виду, что processor-поля структуры SYSTEM_INFO
относятся к операционной системе, а не к процессору. Например, GetNativeSystemInfo,
вызванная на 64-битной системе, установит wProcessorArchitecture в значение
PROCESSOR_ARCHITECTURE_AMD64, даже если стоит процессор Intel.
То же самое касается остальных полей - dwProcessorType, например.
Так что cpuid - самое правильное и надежное. В крайнем случае можно через
Setup API вытащить название процессора, как оно отображается в диспетчере устройств.
Но эта информация тоже легко меняется (есть специальные утилиты).
Так что я бы советовал поднапрячься и разобраться таки с cpuid, с ее помощью
можно гору самой разной информации вытащить, вплоть до определения поддержки
всяких там SSE, размеров и топологии кэша.
1
Кирилл2100
1 / 1 / 0
Регистрация: 29.08.2013
Сообщений: 48
25.06.2014, 13:24  [ТС] #10
Убежденный, хорошо, учту. Еще раз спасибо =)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2014, 13:24
Привет! Вот еще темы с ответами:

Программное разрешение/запрет доступа к реестру - C++ WinAPI
знаю что есть для этого 2 функции: RegGetKeySecurity и RegSetKeySecurity. Например, есть ветка в реестре:...

Определение колличества ядер процессора - C++
#include &lt;stdio.h&gt; #include &lt;tchar.h&gt; #include &lt;iostream&gt; #include &lt;windows.h&gt; #include &lt;omp.h&gt; using namespace std; int...

Определение типа процессора, в какой версии запускать лучше? - C++
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;memory.h&gt; extern void...

Определение класса leverage и метода для доступа к закрытому полю - C++
Напишите определение класса leverage, включающего одно закрытое поле типа int с именем crowbar. Напишите метод getcrow() для класса...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.06.2014, 13:24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru