Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502

Непонятный ключ HKEY_PERFORMANCE_DATA

04.05.2014, 13:09. Показов 4336. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте ! Программисты , очень нужна Ваша помощь . Уже сил нету . Как работать с ключом HKEY_PERFORMANCE_DATA? Нужно определить значение основных счётчиков продуктивности . Уже перечетал вс

Добавлено через 7 минут
Здравствуйте ! Программисты , очень нужна Ваша помощь . Уже сил нету . Как работать с ключом HKEY_PERFORMANCE_DATA? Нужно определить значение основных счётчиков продуктивности . Уже перечитал всё , что можно и нельзя,но так и не разобрался .

Как считать с этого ключа данные ?
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
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "stdafx.h"
#include <windows.h>
#include <malloc.h>
#include <stdio.h>
 
#define TOTALBYTES    8192
#define BYTEINCREMENT 4096
 
void main()
{
    DWORD BufferSize = TOTALBYTES;
    DWORD cbData;
    DWORD dwRet;
 
    PPERF_DATA_BLOCK PerfData = (PPERF_DATA_BLOCK) malloc( BufferSize );
    cbData = BufferSize;
 
    printf("\nRetrieving the data...");
 
    dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                             TEXT("Global"),
                             NULL,
                             NULL,
                             (LPBYTE) PerfData,
                             &cbData );
    while( dwRet == ERROR_MORE_DATA )
    {
        // Get a buffer that is big enough.
 
        BufferSize += BYTEINCREMENT;
        PerfData = (PPERF_DATA_BLOCK) realloc( PerfData, BufferSize );
        cbData = BufferSize;
 
        printf(".");
        dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                         TEXT("Global"),
                         NULL,
                         NULL,
                         (LPBYTE) PerfData,
                         &cbData );
    }
    if( dwRet == ERROR_SUCCESS )
        printf("\n\nFinal buffer size is %d\n", BufferSize);
    else printf("\nRegQueryValueEx failed (%d)\n", dwRet);
}
прочитал , что список активных счётчиков лежит в HKLM\Software\Microsoft\Windows NT\Corrent Version\PerfLib
понял , что там изображены счётчики и их индексы

Я так понимаю, что для каждого счётчика нужно использовать свой индекс?
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "stdafx.h"
#include <windows.h>
#include <malloc.h>
#include <stdio.h>
#include <iostream>
using namespace std;
 
#define TOTALBYTES    8192
#define BYTEINCREMENT 4096
const int Process_Index = 230;
const int PID_Process = 784;
 
void main()
{
    DWORD BufferSize = TOTALBYTES;   //размер буфера
    DWORD cbData;
    DWORD dwRet;   //код возврата
 
    PPERF_DATA_BLOCK PerfData = (PPERF_DATA_BLOCK) malloc( BufferSize );
    PPERF_OBJECT_TYPE PerObjType;
    PPERF_INSTANCE_DEFINITION  PerDefin;
    PPERF_COUNTER_BLOCK  PerCount;
 
    int i,k,j; //для циклов
    string name;
    cbData = BufferSize;
 
    printf("\nRetrieving the data...");
 
    dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                             TEXT("Global"),
                             NULL,
                             NULL,
                             (LPBYTE) PerfData,
                             &cbData );
    while( dwRet == ERROR_MORE_DATA )
    {
        // Get a buffer that is big enough.
 
        BufferSize += BYTEINCREMENT;
        PerfData = (PPERF_DATA_BLOCK) realloc( PerfData, BufferSize );
        cbData = BufferSize;
 
        printf(".");
        dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                         TEXT("Global"),
                         NULL,
                         NULL,
                         (LPBYTE) PerfData,
                         &cbData );
    }
    if( dwRet == ERROR_SUCCESS )
       { printf("\n\nFinal buffer size is %d\n", BufferSize);
       // cout<<PerfData<<" "<<endl;
    }
        
    else printf("\nRegQueryValueEx failed (%d)\n", dwRet);
 
    RegCloseKey(HKEY_PERFORMANCE_DATA);
 
    for (i=0;i<PerfData->NumObjectTypes;i++)
    {
    //ищем объект Process (индекс 230)
        if(PerObjType->ObjectNameTitleIndex=Process_Index)
        {   //заполняем расположение описаний счётчиков PERE_COUNTER_DEFINITION
 
            PerCount=/*....*/
        }
    //  Получаем экземпляры объекта Process, если они есть
    
        if(PerObjType->NumInstances>0)
            //получаем указатель на первую структуру PERF_INFINITION
                PerDefin=/*...*/
 
    
    
    }}
Как это всё обрабатывать то? ((

Как узнать , например , загрузку процессора или ещё что-нибудь?

Не знаю, что и делать

Помогите , пожалуйста , подтолкните в правильное русло

Добавлено через 51 минуту
ну хоть кто-нибудь , отзовитесь
неужели никто не знает такого?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.05.2014, 13:09
Ответы с готовыми решениями:

Непонятный ключ системного реестра
Вот начал изучать параллельно и MFC. Хотелось бы узнать ответ на такой вопрос: В системном реестре после этого возникает ключ с именем...

непонятный ключ: -platform linux-g++ (qt стат. сборка в ubuntu)
Что обозначает ключ platform linux-g++ (qt стат. сборка в ubuntu). Когда ввожу ./configure -h, там ни слова про него не говорится, если...

RSA, как найти закрытый ключ имея открытый ключ, p и q
Прив, задание такое - Как найти закрытый ключ d, если мы знаем открытый ключ e, который равен 5, и простые числа p и q, которые равны 2 и...

36
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.05.2014, 13:18
Гуглится же все за 5 минут !

Using the Registry Functions to Consume Counter Data
http://msdn.microsoft.com/en-u... 85%29.aspx

Note You should not use the registry functions to consume counter data.
Instead, you should use the Performance Data Helper (PDH) functions to
consume counter data. The PDH functions are easier to use, oriented more
towards operations on single counters rather than groups of counters,
and can be used to access counter data from current activity or log files.
Performance Counters
http://msdn.microsoft.com/en-u... 85%29.aspx

Using the PDH Functions to Consume Counter Data
http://msdn.microsoft.com/en-u... 85%29.aspx

KB 287158: How To Retrieve Performance Counter Value Using PDH
http://support.microsoft.com/kb/287158/en
1
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
04.05.2014, 13:45  [ТС]
Да что я уже только не гуглил..очень сложно разобраться мне

Такой вопрос : при использовании этих функций (PDH) - идёт обращение к HKEY_PERFORMANCE_DATA ? Просто у меня стоит такой условие , что нужно найти значение счётчиков именно через этот ключ

(я просто никогда ранее не сталкивался с этими функциями )
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.05.2014, 13:48
Цитата Сообщение от NNN7 Посмотреть сообщение
Такой вопрос : при использовании этих функций (PDH) - идёт обращение к HKEY_PERFORMANCE_DATA ? Просто у меня стоит такой условие , что нужно найти значение счётчиков именно через этот ключ
Вероятнее всего, так. Но фишка в том, что внутренности ключа HKEY_PERFORMANCE_DATA
недокументированны, а значит, могут измениться в любой момент, с выходом какого-нибудь
очередного апдейта Windows. А публичный API наоборот - фиксирован и меняться не будет.
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
04.05.2014, 13:53  [ТС]
Я вот бегло просмотрел пример:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include "stdafx.h"
#include <windows.h>
#include <pdh.h>
#include <stdio.h>
 
BOOL WINAPI GetCounterValues(LPTSTR serverName);
 
void main(int argc, char *argv[])
{
    if (argc > 1)
    {
        // argv[1] - Server Name
 
        GetCounterValues(argv[1]);
    }
    else
    {
        // Local System
 
        GetCounterValues(NULL);
    }
}
 
BOOL WINAPI GetCounterValues(LPTSTR serverName)
{
    PDH_STATUS s;
 
    HQUERY hQuery;
 
    // Array to specify the performance object, counter and instance for
    // which performance data should be collected.
 
    // typedef struct _PDH_COUNTER_PATH_ELEMENTS {
    //   LPTSTR  szMachineName;
    //   LPTSTR  szObjectName;
    //   LPTSTR  szInstanceName;
    //   LPTSTR  szParentInstance;
    //   DWORD   dwInstanceIndex;
    //   LPTSTR  szCounterName;
    // } PDH_COUNTER_PATH_ELEMENTS, *PPDH_COUNTER_PATH_ELEMENTS;
 
    // Each element in the array is a PDH_COUNTER_PATH_ELEMENTS structure.
    PDH_COUNTER_PATH_ELEMENTS cpe[] =
    {
        { NULL, "Memory", NULL, NULL, -1, "Cache Bytes" },
        { NULL, "Memory", NULL, NULL, -1, "Available Bytes" },
        { NULL, "Processor", "_Total", NULL, -1, "% Processor Time" }
    };
 
    HCOUNTER hCounter[sizeof(cpe)/sizeof(cpe[0])];
 
    char szFullPath[MAX_PATH];
    DWORD cbPathSize;
    int   i, j;
 
    BOOL  ret = FALSE;
 
    PDH_FMT_COUNTERVALUE counterValue;
 
    // Only do this setup once.
    if ((s = PdhOpenQuery(NULL, 0, &hQuery)) != ERROR_SUCCESS)
    {
        fprintf(stderr, "POQ failed %08x\n", s);
        return ret;
    }
 
    for (i = 0; i < sizeof(hCounter)/sizeof(hCounter[0]); i++)
    {
        cbPathSize = sizeof(szFullPath);
 
        cpe[i].szMachineName = serverName;
 
        if ((s = PdhMakeCounterPath(&cpe[i],
            szFullPath, &cbPathSize, 0)) != ERROR_SUCCESS)
        {
            fprintf(stderr,"MCP failed %08x\n", s);
            return ret;
        }
 
        if (cpe[i].szInstanceName)
        {
            printf("Adding [%s\\%s\\%s]\n",
                    cpe[i].szObjectName,
                    cpe[i].szCounterName,
                    cpe[i].szInstanceName);
        }
        else
            printf("Adding [%s\\%s]\n",
                    cpe[i].szObjectName,
                    cpe[i].szCounterName);
 
        if ((s = PdhAddCounter(hQuery, szFullPath, 0, &hCounter[i]))
            != ERROR_SUCCESS)
        {
            fprintf(stderr, "PAC failed %08x\n", s);
            return ret;
        }
    }
 
    for (i = 0; i < 20; i++)
    {
        Sleep(100);
 
        // Collect data as often as you need to.
        if ((s = PdhCollectQueryData(hQuery)) != ERROR_SUCCESS)
        {
            fprintf(stderr, "PCQD failed %08x\n", s);
            return ret;
        }
 
        if (i == 0) continue;
 
        // Extract the calculated performance counter value for each counter or
        // instance.
        for (j = 0; j < sizeof(hCounter)/sizeof(hCounter[0]); j++)
        {
            if ((s = PdhGetFormattedCounterValue(hCounter[j], PDH_FMT_DOUBLE,
                NULL, &counterValue)) != ERROR_SUCCESS)
            {
                fprintf(stderr, "PGFCV failed %08x\n", s);
                continue;
            }
            if (cpe[j].szInstanceName)
            {
                printf("%s\\%s\\%s\t\t : [%3.3f]\n",
                    cpe[j].szObjectName,
                    cpe[j].szCounterName,
                    cpe[j].szInstanceName,
                    counterValue.doubleValue);
            }
            else
                printf("%s\\%s\t\t : [%3.3f]\n",
                    cpe[j].szObjectName,
                    cpe[j].szCounterName,
                    counterValue.doubleValue);
        }
    }
 
    // Remove all the counters from the query.
    for (i = 0; i < sizeof(hCounter)/sizeof(hCounter[0]); i++)
    {
        PdhRemoveCounter(hCounter[i]);
    }
 
    // Only do this cleanup once.
    PdhCloseQuery(hQuery);
 
    return TRUE;
}
Он у меня что-то не запускается, выдаёт ошибки :
error LNK2019: unresolved external symbol _PdhOpenQueryA@12 referenced in function "int __stdcall GetCounterValues(char *)" (?GetCounterValues@@YGHPAD@Z)
1>ConsoleApplication5.obj : error LNK2019: unresolved external symbol _PdhAddCounterA@16 referenced in function "int __stdcall GetCounterValues(char *)" (?GetCounterValues@@YGHPAD@Z)
1>ConsoleApplication5.obj : error LNK2019: unresolved external symbol _PdhRemoveCounter@4 referenced in function "int __stdcall GetCounterValues(char *)" (?GetCounterValues@@YGHPAD@Z)
1>ConsoleApplication5.obj : error LNK2019: unresolved external symbol _PdhCollectQueryData@4 referenced in function "int __stdcall GetCounterValues(char *)" (?GetCounterValues@@YGHPAD@Z)
1>ConsoleApplication5.obj : error LNK2019: unresolved external symbol _PdhCloseQuery@4 referenced in function "int __stdcall GetCounterValues(char *)" (?GetCounterValues@@YGHPAD@Z)
1>ConsoleApplication5.obj : error LNK2019: unresolved external symbol _PdhGetFormattedCounterValue@16 referenced in function "int __stdcall GetCounterValues(char *)" (?GetCounterValues@@YGHPAD@Z)
1>ConsoleApplication5.obj : error LNK2019: unresolved external symbol _PdhMakeCounterPathA@16 referenced in function "int __stdcall GetCounterValues(char *)" (?GetCounterValues@@YGHPAD@Z)
1>c:\users\samsung\documents\visual studio 2012\Projects\ConsoleApplication5\Debug\ ConsoleApplication5.exe : fatal error LNK1120: 7 unresolved externals


и я что-то не пойму , где именно здесь используется ключ HKEY_PERFORMANCE_DATA?

может есть ещё что-то , для обработки этого ключа? сколько не читаю- нигде не примеров нормальных найти не могу , ничего вообще , кроме примера на msdn про открытия ключа :
C++
1
2
3
4
5
6
 dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                             TEXT("2 4"),
                             NULL,
                             NULL,
                             (LPBYTE) PerfData,
                             &cbData );
- будет извлекать данные для Memory и System
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.05.2014, 13:58
"Unresolved external symbol" - это значит, что компоновщик не может найти
тело функции. А тело функции находится где-то в одной из системных dll-ок.
Решается так: берем одну из функций из логов ошибки, пусть будет самая
первая - PdhOpenQuery, ищем ее на MSDN:

PdhOpenQuery function (Windows)
http://msdn.microsoft.com/en-u... 85%29.aspx

Смотрим внизу:
Minimum supported client Windows XP [desktop apps only]

Minimum supported server Windows Server 2003 [desktop apps only]

Header Pdh.h

Library Pdh.lib

DLL Pdh.dll
Теперь добавляем в исходник такую строчку:
C
1
#pragma comment(lib, "pdh.lib")
И все должно работать.
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
04.05.2014, 14:07  [ТС]
Добавил:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// ConsoleApplication5.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <windows.h>
#include <pdh.h>
#include <stdio.h>
#pragma comment(lib, "pdh.lib")
 
 
BOOL WINAPI GetCounterValues(LPTSTR serverName);
 
void main(int argc, char *argv[])
{
    if (argc > 1)
    {
        // argv[1] - Server Name
 
        GetCounterValues(argv[1]);
    }
    else
    {
        // Local System
 
        GetCounterValues(NULL);
    }
}
 
BOOL WINAPI GetCounterValues(LPTSTR serverName)
{
    PDH_STATUS s;
 
    HQUERY hQuery;
 
    // Array to specify the performance object, counter and instance for
    // which performance data should be collected.
 
    // typedef struct _PDH_COUNTER_PATH_ELEMENTS {
    //   LPTSTR  szMachineName;
    //   LPTSTR  szObjectName;
    //   LPTSTR  szInstanceName;
    //   LPTSTR  szParentInstance;
    //   DWORD   dwInstanceIndex;
    //   LPTSTR  szCounterName;
    // } PDH_COUNTER_PATH_ELEMENTS, *PPDH_COUNTER_PATH_ELEMENTS;
 
    // Each element in the array is a PDH_COUNTER_PATH_ELEMENTS structure.
    PDH_COUNTER_PATH_ELEMENTS cpe[] =
    {
        { NULL, "Memory", NULL, NULL, -1, "Cache Bytes" },
        { NULL, "Memory", NULL, NULL, -1, "Available Bytes" },
        { NULL, "Processor", "_Total", NULL, -1, "% Processor Time" }
    };
 
    HCOUNTER hCounter[sizeof(cpe)/sizeof(cpe[0])];
 
    char szFullPath[MAX_PATH];
    DWORD cbPathSize;
    int   i, j;
 
    BOOL  ret = FALSE;
 
    PDH_FMT_COUNTERVALUE counterValue;
 
    // Only do this setup once.
    if ((s = PdhOpenQuery(NULL, 0, &hQuery)) != ERROR_SUCCESS)
    {
        fprintf(stderr, "POQ failed %08x\n", s);
        return ret;
    }
 
    for (i = 0; i < sizeof(hCounter)/sizeof(hCounter[0]); i++)
    {
        cbPathSize = sizeof(szFullPath);
 
        cpe[i].szMachineName = serverName;
 
        if ((s = PdhMakeCounterPath(&cpe[i],
            szFullPath, &cbPathSize, 0)) != ERROR_SUCCESS)
        {
            fprintf(stderr,"MCP failed %08x\n", s);
            return ret;
        }
 
        if (cpe[i].szInstanceName)
        {
            printf("Adding [%s\\%s\\%s]\n",
                    cpe[i].szObjectName,
                    cpe[i].szCounterName,
                    cpe[i].szInstanceName);
        }
        else
            printf("Adding [%s\\%s]\n",
                    cpe[i].szObjectName,
                    cpe[i].szCounterName);
 
        if ((s = PdhAddCounter(hQuery, szFullPath, 0, &hCounter[i]))
            != ERROR_SUCCESS)
        {
            fprintf(stderr, "PAC failed %08x\n", s);
            return ret;
        }
    }
 
    for (i = 0; i < 20; i++)
    {
        Sleep(100);
 
        // Collect data as often as you need to.
        if ((s = PdhCollectQueryData(hQuery)) != ERROR_SUCCESS)
        {
            fprintf(stderr, "PCQD failed %08x\n", s);
            return ret;
        }
 
        if (i == 0) continue;
 
        // Extract the calculated performance counter value for each counter or
        // instance.
        for (j = 0; j < sizeof(hCounter)/sizeof(hCounter[0]); j++)
        {
            if ((s = PdhGetFormattedCounterValue(hCounter[j], PDH_FMT_DOUBLE,
                NULL, &counterValue)) != ERROR_SUCCESS)
            {
                fprintf(stderr, "PGFCV failed %08x\n", s);
                continue;
            }
            if (cpe[j].szInstanceName)
            {
                printf("%s\\%s\\%s\t\t : [%3.3f]\n",
                    cpe[j].szObjectName,
                    cpe[j].szCounterName,
                    cpe[j].szInstanceName,
                    counterValue.doubleValue);
            }
            else
                printf("%s\\%s\t\t : [%3.3f]\n",
                    cpe[j].szObjectName,
                    cpe[j].szCounterName,
                    counterValue.doubleValue);
        }
    }
 
    // Remove all the counters from the query.
    for (i = 0; i < sizeof(hCounter)/sizeof(hCounter[0]); i++)
    {
        PdhRemoveCounter(hCounter[i]);
    }
 
    // Only do this cleanup once.
    PdhCloseQuery(hQuery);
 
    return TRUE;
}
Но не работает , при запуске вот такое (фото)

И всё равно , кажется , что это не совсем то , что нужно. Не пойму , где именно идёт обращение к HKEY_PERFORMANCE_DATA ?

может есть ещё способы какие-то?(
Миниатюры
Непонятный ключ HKEY_PERFORMANCE_DATA  
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.05.2014, 14:32
Цитата Сообщение от NNN7 Посмотреть сообщение
Просто у меня стоит такой условие , что нужно найти значение счётчиков именно через этот ключ
Поиск по слову "HKEY_PERFORMANCE_DATA", первая ссылка в Гугле:
http://tripsin.narod.ru/articl... gistry.htm
1
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
04.05.2014, 18:14  [ТС]
Да это я читал уже ..

А вот с функциями PDH - что неправильно то? Подскажите, пожалуйста

Добавлено через 1 час 34 минуты
Можно такой вопрос задать Вам : а как правильно получить путь к счётчику? если смотреть в реестре , то описание счётчиков(имя и индекс) лежит в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wi ndows NT\CurrentVersion\Perflib\009 , но не писать же этот путь?

просто в функции PdhAddCounter () 2-ой параметр - это путь к счётчику, не знаю, где его взять можно

Добавлено через 48 минут
Вот пытался сделать через PDH функции :

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <pdh.h>
#include <pdhmsg.h>
#include <iostream>
#pragma comment(lib, "pdh.lib")
 
CONST ULONG SAMPLE_INTERVAL_MS    = 1000;
CONST PWSTR BROWSE_DIALOG_CAPTION = L"Select a counter to monitor.";
 
void wmain(void)
{
    PDH_STATUS Status;
    HQUERY Query = NULL;
    HCOUNTER Counter;
    DWORD CounterType;
    SYSTEMTIME SampleTime;
    PDH_FMT_COUNTERVALUE DisplayValue;
 
 
   //Создаём запрос 
    Status = PdhOpenQuery(NULL, NULL, &Query);  //запрос на использование счётчиков производительности
    if (Status != ERROR_SUCCESS) 
    {
      wprintf(L"\nPdhOpenQuery failed with status 0x%x.", Status);
      
    }
 
    /*Добавить счётчик в запрос*/
    Status = PdhAddCounter(Query, (LPCTSTR)"\\Processor(0)\\% Processor Time", 0, &Counter);
    if (Status != ERROR_SUCCESS) 
    {
        wprintf(L"\nPdhAddCounter failed with status 0x%x.", Status);
        
    }
    
    /*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
    и обновляет код состояния каждого счетчика*/
    Status = PdhCollectQueryData(Query);  
    if (Status != ERROR_SUCCESS) 
    {
       wprintf(L"\nPdhCollectQueryData failed with 0x%x.\n", Status);
    }
    
     /*Вычислить отображаемое  значение для указанного счетчика.*/
    Status = PdhGetFormattedCounterValue(Counter,
                                             PDH_FMT_DOUBLE,
                                             &CounterType,
                                             &DisplayValue);
   if (Status != ERROR_SUCCESS) 
    {
            wprintf(L"\nPdhGetFormattedCounterValue failed with status 0x%x.", Status);
    }
 
        wprintf(L"\"%.20g\"", DisplayValue.doubleValue);
    
 
//Cleanup:
 
    //
    // Close the query.
    //
    if (Query) 
    {
       PdhCloseQuery(Query);
    }
}
Но все функции возвращают faild((

Что не так , вроде всё правильно , ошибок не выдаёт у меня ...
Подскажите , пожалуйста
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.05.2014, 18:28
Цитата Сообщение от NNN7 Посмотреть сообщение
Status = PdhAddCounter(Query, (LPCTSTR)"\\Processor(0)\\% Processor Time", 0, &Counter);
Уберите приведение типа (LPCTSTR), это ошибка.
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
04.05.2014, 18:39  [ТС]
и это всё равно не помогло
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.05.2014, 18:42
Выложите код еще разок (исправленный).
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
04.05.2014, 18:46  [ТС]
Я вот исправил сам текст пути к счётчику ( написал на русском ) :

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <pdh.h>
#include <pdhmsg.h>
#include <iostream>
#pragma comment(lib, "pdh.lib")
 
CONST ULONG SAMPLE_INTERVAL_MS    = 1000;
CONST PWSTR BROWSE_DIALOG_CAPTION = L"Select a counter to monitor.";
 
void wmain(void)
{
    PDH_STATUS Status;
    HQUERY Query = NULL;
    HCOUNTER Counter;
    DWORD CounterType;
    SYSTEMTIME SampleTime;
    PDH_FMT_COUNTERVALUE DisplayValue;
 
   //Создаём запрос 
    Status = PdhOpenQuery(NULL, NULL, &Query);  //запрос на использование счётчиков производительности
    if (Status != ERROR_SUCCESS) 
    {
      wprintf(L"\nPdhOpenQuery failed with status 0x%x.", Status);
      
    }
    else
    {
        wprintf(L"\nOpenQuary - OK");
    }
 
    /*Добавить счётчик в запрос*/
  Status = PdhAddCounter(Query, (LPCSTR)"\\Процессор(_Total)\\% загруженности процессора", 0, &Counter);
    if (Status != ERROR_SUCCESS) 
    {
        wprintf(L"\nPdhAddCounter failed with status 0x%x.", Status);
        
    }
    else 
    {   std::cout<<std::endl;
        wprintf(L"\nAddCounter - OK");
    }
    
    /*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
    и обновляет код состояния каждого счетчика*/
   Status = PdhCollectQueryData(Query);  
    if (Status != ERROR_SUCCESS) 
    {
       wprintf(L"\nPdhCollectQueryData failed with 0x%x.\n", Status);
    }
    else 
    {    std::cout<<std::endl;
         wprintf(L"\CollectQueryData -OK\n");
    }
    
    /*Вычислить отображаемое  значение для указанного счетчика.*/
   Status = PdhGetFormattedCounterValue(Counter,
                                             PDH_FMT_DOUBLE,
                                             &CounterType,
                                             &DisplayValue);
   if (Status != ERROR_SUCCESS) 
    {
            wprintf(L"\nPdhGetFormattedCounterValue failed with status 0x%x.", Status);
    }
   
    else 
    {    std::cout<<std::endl;
         wprintf(L"\Formatted -OK\n");
    }
    
 
//Cleanup:
 
    //
    // Close the query.
    //
    if (Query) 
    {
       PdhCloseQuery(Query);
    }
}
3 функции пишет , что всё работает , а самая главная - последняя выдаёт ошибку
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.05.2014, 18:53
C++
1
Status = PdhAddCounter(Query, (LPCSTR)"\\Процессор(_Total)\\% загруженности процессора", 0, &Counter);
Ну я же написал - уберите приведение типа (LPCSTR).
Если проект настроен на использование Unicode, - а судя по wmain так и есть, -
то такое приведение в корне ошибочно, т.к. PdhAddCounter на самом деле
макрос, который будет расширяться или в PdhAddCounterA, или в PdhAddCounterW.
Первый тип работает с char-строками, второй с wchar_t-строками.
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
04.05.2014, 18:58  [ТС]
Unicode включенный .
Написал:
C++
1
Status = PdhAddCounter(Query,"\\Процессор(_Total)\\% загруженности процессора", 0, &Counter);
выдало мне такую вещь:
error C2664: 'PdhAddCounterW' : cannot convert parameter 2 from 'const char [46]' to 'LPCWSTR'
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.05.2014, 19:24
Должно быть так:
L"\\Процессор(_Total)\\...

Кстати, Вы уверены, что имена счетчиков можно указывать
на русском языке ?

Что-то здесь такого не наблюдается...
http://technet.microsoft.com/r... 10%29.aspx

Добавлено через 8 минут
У меня, например, L"\\Process(*)\\% User Time" прокатывает без
ошибок (PdhOpenQueryW -> PdhAddCounterW -> PdhCollectQueryData ->
PdhGetFprmattedCounterValue). Только вот что дальше делать с этими
данными я уже без понятия, если честно...
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
04.05.2014, 19:31  [ТС]
И так сделал уже:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <pdh.h>
#include <pdhmsg.h>
#include <iostream>
#pragma comment(lib, "pdh.lib")
 
CONST ULONG SAMPLE_INTERVAL_MS    = 1000;
CONST PWSTR BROWSE_DIALOG_CAPTION = L"Select a counter to monitor.";
 
void wmain(void)
{
    PDH_STATUS Status;
    HQUERY Query = NULL;
    HCOUNTER Counter;
    DWORD CounterType;
    SYSTEMTIME SampleTime;
    PDH_FMT_COUNTERVALUE DisplayValue;
 
   //Создаём запрос 
    Status = PdhOpenQueryW(NULL, NULL, &Query);  //запрос на использование счётчиков производительности
    if (Status != ERROR_SUCCESS) 
    {
      wprintf(L"\nPdhOpenQuery failed with status 0x%x.", Status);
      
    }
    else
    {
        wprintf(L"\nOpenQuary - OK");
    }
 
    /*Добавить счётчик в запрос*/
     
Status = PdhAddCounterW(Query,L"\\Процессор(_Total)\\% загруженности процессора", 0, &Counter);
    if (Status != ERROR_SUCCESS) 
    {
        wprintf(L"\nPdhAddCounter failed with status 0x%x.", Status);
        
    }
    else 
    {   std::cout<<std::endl;
        wprintf(L"\nAddCounter - OK");
    }
    
    /*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
    и обновляет код состояния каждого счетчика*/
   Status = PdhCollectQueryData(Query);  
    if (Status != ERROR_SUCCESS) 
    {
       wprintf(L"\nPdhCollectQueryData failed with 0x%x.\n", Status);
       /*int error =0;
       error=GetLastError();
            std::cout<<"error="<<error<<std::endl;*/
    }
    else 
    {    std::cout<<std::endl;
         wprintf(L"\CollectQueryData -OK\n");
    }
    
    /*Вычислить отображаемое  значение для указанного счетчика.*/
   Status = PdhGetFormattedCounterValue(Counter,
                                             PDH_FMT_DOUBLE,
                                             &CounterType,
                                             &DisplayValue);
   if (Status != ERROR_SUCCESS) 
    {
           // wprintf(L"\nPdhGetFormattedCounterValue failed with status 0x%x.", Status);
            /*int error =GetLastError();
            std::cout<<"error="<<error;*/
    }
   
    else 
    {    std::cout<<std::endl;
         wprintf(L"\ Formatted -OK\n");
    }
    
 
    wprintf(L",\"%.20g\"", DisplayValue.doubleValue);
//Cleanup:
 
    //
    // Close the query.
    //
    if (Query) 
    {
       PdhCloseQuery(Query);
    }
}
Ничего не хочет работать ((
не знаю уже , что со всем этим делать

Я просто читал , что , вроде , в русскоязычных системах нужно писать на русском ..

И что , у Вас выводит значение?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.05.2014, 19:35
Цитата Сообщение от NNN7 Посмотреть сообщение
Я просто читал , что , вроде , в русскоязычных системах нужно писать на русском .
Где именно читали ? Я в MSDN такого не нашел.
Все может быть, конечно, но логика мне подсказывает, что вряд ли
системные объекты назвали бы локализованными именами.

Цитата Сообщение от NNN7 Посмотреть сообщение
И что , у Вас выводит значение?
Да, выводит, но я пока сам не понимаю, как правильно его толковать.
Когда требуется получить загрузку CPU, обычно прибегают к функциям
типа NtQuerySystemInformation, GetCpuTimes и т.п., а не счетчикам
производительности...
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
04.05.2014, 19:44  [ТС]
Да на форуме где-то вычитал , писали , что работает так

Число выводит ? Какое , примерно?

Можете , пожалуйста , запустить .exe файл с архива , я там вписал на английском языке путь , как у Вас , но у меня всё равно не выводит ничего . Просто интересно , в чём проблема может выражаться
Вложения
Тип файла: rar ConsoleApplication7.rar (8.25 Мб, 3 просмотров)
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
04.05.2014, 19:48  [ТС]
Да я бы с радостью что-то легче выбрал для этого , но увы , задание такое дали . Ещё и не объясняют ничего совсем
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.05.2014, 19:48
Помогаю со студенческими работами здесь

Не удается преобразовать ключ в токен -- Недействительный открытый ключ сборки
Задал вчера строго имя сборки(есть файл .pfx), сегодня хочу через sn вывести открытый ключ, пишет &quot;Не удается преобразовать ключ в...

Зачем нужен ключ сессии(секретный ключ) при HTTPS
Как я понимаю устройство HTTPS. Есть открытый и закрытый ключ. Как я понимаю клиент и сервер на основе своих закрытых ключей...

Замена данных в таблице по связи Первичный ключ - Вторичный ключ
Есть главная таблица и есть от нее зависимая. Требуется: чтоб в зависимую таблицу, в колонку вторичного ключа - подставились данные из...

Выбрать из файла содержащую заданный ключ строку и следующие за ней строки до строки, содержащей другой ключ
Добрый день! Нужно написать регулярное выражение которое из файла выбирает строку и следующие за ней строки, до следующего ключа. ...

Непонятный PR
Поясните мне такую вещь... Есть сайт www.XXXX.ru , у него довольно большой PR (6), так вот, планировалось разместить на нем рекламу,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru