Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2011, 11:03   #1
Lindemann66
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 127
Вопрос В чём может быть ошибка?

Всем привет!
Вот 2ой день разбираюсь с CpuUsage (Qt + WinApi)
Наконец-то при сборке нет ошибок
Но толку мало
Есть код:
Код:
//
//    The performance data is accessed through the registry key 
//    HKEY_PEFORMANCE_DATA.
//    However, although we use the registry to collect performance data, 
//    the data is not stored in the registry database.
//    Instead, calling the registry functions with the HKEY_PEFORMANCE_DATA key 
//    causes the system to collect the data from the appropriate system 
//    object managers.
//
//    QueryPerformanceData allocates memory block for getting the
//    performance data.
//
//
void QueryPerformanceData(PERF_DATA_BLOCK **pPerfData, DWORD dwObjectIndex, DWORD dwCounterIndex) {
    //
    // Since i want to use the same allocated area for each query,
    // i declare CBuffer as static.
    // The allocated is changed only when RegQueryValueEx return ERROR_MORE_DATA
    //
    static CBuffer Buffer(TOTALBYTES);

    DWORD BufferSize = Buffer.GetSize();
    LONG lRes;

    char keyName[32];
    sprintf(keyName,"%d",dwObjectIndex);

    Buffer.Reset();
    while( (lRes = RegQueryValueEx( HKEY_PERFORMANCE_DATA, 
                          keyName,
                          NULL,
                          NULL,
                          Buffer,
                          &BufferSize )) == ERROR_MORE_DATA ) {
        // Get a buffer that is big enough.

        BufferSize += BYTEINCREMENT;
        Buffer.Realloc(BufferSize);
    }
    *pPerfData = (PPERF_DATA_BLOCK) Buffer.m_pBuffer;
}
В Visual Studio он выполняется, само собой, корректно, и в результате выполнения
pPerfData->TotalByteLength = 1232
и
pPerfData->NumObjectTypes = 1
Как и должно быть
Чтобы этот код работал в Qt, я его немного подправил:
Код:
//
//    The performance data is accessed through the registry key
//    HKEY_PEFORMANCE_DATA.
//    However, although we use the registry to collect performance data,
//    the data is not stored in the registry database.
//    Instead, calling the registry functions with the HKEY_PEFORMANCE_DATA key
//    causes the system to collect the data from the appropriate system
//    object managers.
//
//    QueryPerformanceData allocates memory block for getting the
//    performance data.
//
//
void QueryPerformanceData(PERF_DATA_BLOCK **pPerfData, DWORD dwObjectIndex) {
    //
    // Since i want to use the same allocated area for each query,
    // i declare CBuffer as static.
    // The allocated is changed only when RegQueryValueEx return ERROR_MORE_DATA
    //
    static CBuffer Buffer(TOTALBYTES);
 
    DWORD BufferSize = Buffer.GetSize();
    LONG lRes;

    QString str = QString::number(dwObjectIndex);
    wchar_t* keyName = new wchar_t[str.length()];
    str.toWCharArray(keyName);

    Buffer.Reset();
    while( (lRes = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                           keyName,
                           NULL,
                           NULL,
                           Buffer,
                           &BufferSize )) == ERROR_MORE_DATA ) {
        // Get a buffer that is big enough.
        BufferSize += BYTEINCREMENT;
        Buffer.Realloc(BufferSize);
    }
    *pPerfData = (PPERF_DATA_BLOCK) Buffer.m_pBuffer;
}
В итоге, код стал отрабатывать неправильно
Важные значения
pPerfData->TotalByteLength = 104
и
pPerfData->NumObjectTypes = 0
Через Watch смотрел все переменные - значения те же
НО - работает по-другому

Может кто-то может сказать, что я в чём-то ошибся, или что-то сделал некорректно?
Буду благодарен за любые советы!
Lindemann66 вне форума Ответить с цитированием
Старый 18.08.2011, 13:52   #2
Lindemann66
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 127
По умолчанию

Всё дело было в том, что я забыл подставить завершающий 0 вот в этом месте
Код:
    QString str = QString::number(dwObjectIndex);
    wchar_t* keyName = new wchar_t[str.length()];
    str.toWCharArray(keyName);
В итоге получилось:
Код:
    QString str = QString::number(dwObjectIndex);
    wchar_t* keyName = new wchar_t[str.length() + 1];

    str.toWCharArray(keyName);
    keyName[str.length()] = '\0';

Последний раз редактировалось Lindemann66; 18.08.2011 в 13:55.
Lindemann66 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где может быть ошибка? Tricko C# (си шарп) 3 26.06.2011 12:42
В чём может быть ошибка. Dj Troy C++ Builder 2 20.04.2011 20:40
В чем может быть ошибка? nervniy БД в Delphi 2 21.10.2010 15:47
помотрите в чем может быть ошибка zizu Помощь студентам 2 26.04.2010 10:16
где может быть ошибка? maksim_serg Microsoft Office Excel 2 21.04.2010 10:42