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

Получение инофрмации об, ос, памяти, процессоре, количество системных дисков и названия дисков

30.07.2020, 16:02. Показов 2139. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, прошу помощи!

Пишу программку которая собирает данные об операционной системе
и отправляла их на сервер

данные должна получать такие как:

1 - ос
2 - память
3 - процессор
4 - количество системных дисков и накопителей, размер, название дисков типо А, С, D и остальные.

вот код накидал но он отрабатывает не верно, а также отправляет все данные в int, а нужно чтобы строки были именно названия

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
        char          com[MAX_PATH] = { 0 };
    char            *userNameA;
    char            *compNameA;
    DWORD         CPU;
    wchar_t         userName[MAX_PATH] = { 0 };
    wchar_t         compName[MAX_PATH] = { 0 };
    DWORD          nameSize = MAX_PATH;
    SYSTEM_INFO      info = { 0 };
    OSVERSIONINFOEXA osVersion = { 0 };
 
    GetUserNameW(userName, &nameSize);
    nameSize = MAX_PATH;
    GetComputerNameW(compName, &nameSize);
 
    userNameA = isMemory.Utf16toUtf8(userName);
    compNameA = isMemory.Utf16toUtf8(compName);
 
    GetSystemInfo(&info);
 
    CPU = info.dwNumberOfProcessors;
 
    osVersion.dwOSVersionInfoSize = sizeof(osVersion);
 
    GetVersionExW((OSVERSIONINFO*)&osVersion);
 
           WCHAR szDrive[] = L"A";
 
    // logical drive mask
 
    DWORD uDriveMask = GetLogicalDrives();
 
    
 
    // Display the drive mask    
 
    //printf("The bitmask of the logical drives in hex : 0X % .8X\n", uDriveMask);
 
    //printf("The bitmask of the logical drives in decimal : %.8d\n", uDriveMask);
 
    decnumtobin(uDriveMask);
 
    //printf("Initial dummy drive string : %s\n", szDrive);
 
 
 
    // Verify the returned drive mask
 
    if (uDriveMask == 0)
 
        //printf("GetLogicalDrives() failed with error code : %d\n", GetLastError());
 
    else
 
    {
 
        //printf("This machine has the following logical drives : \n");
 
        while (uDriveMask)
 
        {
 
            // use the bitwise AND, 1–available (1 & 1), 0-not available
 
            // the binary representation is in reverse lol
 
            if (uDriveMask & 1)
 
            {
 
                // Just print out the available drives
 
                //printf("Bitwise AND result = %u, drive %s\n", (uDriveMask & 1), szDrive);
 
 
            //wnsprintfW(foundedDrive, 7, L"\\\\?\\%c:", drive + L'A');
 
            //QueueUserWorkItem((LPTHREAD_START_ROUTINE)findFiles, foundedDrive, 0);
 
            wsprintfA
                (
                com,
                "data|%d|%d|%d|%d|%d|%s|%d|%s|%s|%s|%d",
                osVersion.dwMajorVersion,
                osVersion.dwMinorVersion,
                osVersion.wServicePackMajor,
                CPU,
                osVersion.dwOSVersionInfoSize,
                !(osVersion.wProductType == VER_NT_WORKSTATION),
                compNameA,
                userNameA,
                foundedDrive,
                (info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64);
 
                       }
 
            // increment for next...
 
            szDrive[1]++;
 
            // shift the bitmask binary right
 
            uDriveMask >>= 1;
 
        }
 
    }
 
 
    char* hPost = hSendRequest(com, NULL);
 
    free(hPost );
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.07.2020, 16:02
Ответы с готовыми решениями:

Программа для мониторинга состояния системных дисков
Доброго времени суток. Тема программы: "Разработать программное обеспечение для мониторинга состояния свободного пространства на системных...

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

SMART дисков. Годность дисков для NAS
Добрый день/вечер подскажите знатоки SMART. Хочу поменять NAS, и хочу переставить диски в новый. Важно установить 1й диск как можно лучше. ...

23
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.07.2020, 16:33
Цитата Сообщение от CyberARM Посмотреть сообщение
вот код накидал но он отрабатывает не верно, а также отправляет все данные в int, а нужно чтобы строки были именно названия
Цитата Сообщение от CyberARM Посмотреть сообщение
OSVERSIONINFOEXA osVersion = { 0 };
OSVERSIONINFOEXW

Добавлено через 26 секунд
Цитата Сообщение от CyberARM Посмотреть сообщение
GetVersionExW((OSVERSIONINFO*)&osVersion );
GetVersionExW(&osVersion)

Добавлено через 6 минут
Цитата Сообщение от CyberARM Посмотреть сообщение
вот код накидал но он отрабатывает не верно, а также отправляет все данные в int, а нужно чтобы строки были именно названия
Что именно отправляет в int?
0
0 / 0 / 0
Регистрация: 24.03.2020
Сообщений: 26
30.07.2020, 16:50  [ТС]
названия дисков посылает на сервер в int к примеру 23465352, а должно так A:\\ C:\\, D:\\, и т.д

Добавлено через 46 секунд
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
OSVERSIONINFOEXW

Добавлено через 26 секунд

GetVersionExW(&osVersion)

Добавлено через 6 минут

Что именно отправляет в int?
названия дисков посылает на сервер в int к примеру 23465352, а должно так A:\\ C:\\, D:\\, и т.д

Добавлено через 3 минуты
Цитата Сообщение от CyberARM Посмотреть сообщение
GetVersionExW((OSVERSIONINFO*)&osVersion );
GetVersionExW(&osVersion)

error C2664: 'BOOL GetVersionExW(LPOSVERSIONINFOW)' : cannot convert argument 1 from 'OSVERSIONINFOEXW *' to 'LPOSVERSIONINFOW'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.07.2020, 16:59
Цитата Сообщение от CyberARM Посмотреть сообщение
названия дисков посылает на сервер в int к примеру 23465352, а должно так A:\\ C:\\, D:\\, и т.д
Цитата Сообщение от CyberARM Посмотреть сообщение
error C2664: 'BOOL GetVersionExW(LPOSVERSIONINFOW)' : cannot convert argument 1 from 'OSVERSIONINFOEXW *' to 'LPOSVERSIONINFOW'
Ну да, здесь всё-таки надо GetVersionExW((OSVERSIONINFOW *)&osVersion);
0
0 / 0 / 0
Регистрация: 24.03.2020
Сообщений: 26
30.07.2020, 17:00  [ТС]
error C2664: 'BOOL GetVersionExW(LPOSVERSIONINFOW)' : cannot convert argument 1 from 'OSVERSIONINFOEXW *' to 'LPOSVERSIONINFOW'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

это поправил. должно быть так
C++
1
GetVersionExW((LPOSVERSIONINFOW)&osVersion);
нужно с этим разобраться

Что именно отправляет в int?
названия дисков посылает на сервер в int к примеру 23465352, а должно так A:\\ C:\\, D:\\, и т.д
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.07.2020, 17:01
Цитата Сообщение от CyberARM Посмотреть сообщение
названия дисков посылает на сервер в int к примеру 23465352, а должно так A:\\ C:\\, D:\\, и т.д
Название диска, это foundedDrive? Чему он равен?
0
0 / 0 / 0
Регистрация: 24.03.2020
Сообщений: 26
30.07.2020, 17:09  [ТС]
4386900 если вы об этом ,
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.07.2020, 17:11
Цитата Сообщение от CyberARM Посмотреть сообщение
4386900 если вы об этом ,
А это разве строка?
Цитата Сообщение от CyberARM Посмотреть сообщение
//wnsprintfW(foundedDrive, 7, L"\\\\?\\%c:", drive + L'A');
Как ты это 4386900 получил?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.07.2020, 17:12
Цитата Сообщение от CyberARM Посмотреть сообщение
4386900 если вы об этом ,
А это разве строка?
Цитата Сообщение от CyberARM Посмотреть сообщение
//wnsprintfW(foundedDrive, 7, L"\\\\?\\%c:", drive + L'A');
Как ты это 4386900 получил?
0
0 / 0 / 0
Регистрация: 24.03.2020
Сообщений: 26
30.07.2020, 17:25  [ТС]
нет это не строка.

foundedDrive отправив POST данные здесь
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
wsprintfA
                (
                com,
                "data|%d|%d|%d|%d|%d|%s|%d|%s|%s|%s|%d",
                osVersion.dwMajorVersion,
                osVersion.dwMinorVersion,
                osVersion.wServicePackMajor,
                CPU,
                osVersion.dwOSVersionInfoSize,
                !(osVersion.wProductType == VER_NT_WORKSTATION),
                compNameA,
                userNameA,
                foundedDrive,
                (info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64);
и на сервер в POST данных приходит этот бред "4386900 "
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.07.2020, 17:28
Цитата Сообщение от CyberARM Посмотреть сообщение
и на сервер в POST данных приходит этот бред "4386900 "
Судя по формату "data|%d|%d|%d|%d|%d|%s|%d|%s|%s|%s|%d" это должна быть строка.
Где ты заполняешь этот foundedDrive?

Добавлено через 26 секунд
Я его вообще не вижу в твоём коде
0
0 / 0 / 0
Регистрация: 24.03.2020
Сообщений: 26
30.07.2020, 20:00  [ТС]
переписал код, все прекрасно отправляется, только проблема осталась с поиском дисков, данными о них и отправка на сервер не могу разобраться что то .

Добавлено через 8 минут
почему он определяет только диск E не подскажите ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DWORD dwMyDisks = GetLogicalDrives();
 
    char temp[2];
 
    
 
    for (int disk = 0;  disk < 32;  disk++)
    {
        if (dwMyDisks & (1 <<  disk))
 
            // disk
 
        {
 
            temp[1] = 0;
 
            temp[0] = 'A' +  disk;
 
            if (temp[0] != 'A') temp;  //показ  дисков
                }
        }
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.07.2020, 20:04
Цитата Сообщение от CyberARM Посмотреть сообщение
почему он определяет только диск E не подскажите ?
Цитата Сообщение от CyberARM Посмотреть сообщение
temp[0] = 'A' +  disk;
Наверное, потому что ты здесь перетираешь меньшие диски.
0
0 / 0 / 0
Регистрация: 24.03.2020
Сообщений: 26
30.07.2020, 20:22  [ТС]
а как правильнее будет сделать ?
0
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,686
04.08.2020, 11:00
Цитата Сообщение от CyberARM Посмотреть сообщение
а как правильнее будет сделать ?
Принцип такой
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
#include <iostream>
#include <Windows.h>
#include <vector>
 
int main()
{
    DWORD diskBitMap = GetLogicalDrives();
    char diskName = 'A';
    std::vector<char> drives;
 
    DWORD check = 0x1;
    while (check)
    {
        if (diskBitMap & check)
            drives.push_back(diskName);
        ++diskName;
        check <<= 1;
    }
 
    for (auto dsk : drives)
        std::cout << dsk << ":\\" << std::endl;
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 24.03.2020
Сообщений: 26
05.08.2020, 16:12  [ТС]
спасибо зак код, но он моему приложению добавляет целых почти 90 кб ) это мне не совсем подходит.
и вопрос как отправить все диски которые есть у меня на сервер этой функцией
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
wsprintfA
                (
                com,
                "data|%d|%d|%d|%d|%d|%s|%d|%s|%s|%s|%d",
                osVersion.dwMajorVersion,
                osVersion.dwMinorVersion,
                osVersion.wServicePackMajor,
                CPU,
                osVersion.dwOSVersionInfoSize,
                !(osVersion.wProductType == VER_NT_WORKSTATION),
                compNameA,
                userNameA,
                foundedDrive,
                (info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64);
не по одному последнему/меньшему диску, а одним запросом все диски которые есть у меня на компе. у меня только по одному сейчас отправляет... (
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
05.08.2020, 16:22
Лучший ответ Сообщение было отмечено CyberARM как решение

Решение

Цитата Сообщение от CyberARM Посмотреть сообщение
спасибо зак код, но он моему приложению добавляет целых почти 90 кб ) это мне не совсем подходит.
Не используй там std::cout и std::vector, используй вместо них printf и массив, не будет добавлять

Добавлено через 6 минут
Цитата Сообщение от CyberARM Посмотреть сообщение
не по одному последнему/меньшему диску, а одним запросом все диски которые есть у меня на компе. у меня только по одному сейчас отправляет... (
C++
1
2
3
4
5
6
7
8
    wchar_t foundedDrive[32 + 1]; 
    wchar_t ltr = L'A';
    size_t n = 0;
    for (DWORD diskBitMap = GetLogicalDrives(); diskBitMap; diskBitMap >>= 1, ++ltr)
        if (diskBitMap & 0x01)
            foundedDrive[n++] = ltr;
 
    foundedDrive[n] = 0;
1
0 / 0 / 0
Регистрация: 24.03.2020
Сообщений: 26
09.08.2020, 20:43  [ТС]
В чем проблема ? постоянно показывает GetLastError() ошибку 123


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WIN32_FIND_DATAA FindFileData;
 
    HANDLE hFile;
 
    LPSTR MyPath = (LPSTR)calloc(MAX_PATH, 1);
 
    if (MyPath == NULL)
        return FALSE;
 
           sprintf_s(MyPath, MAX_PATH, "%s\\*", path);
 
        hFile = FindFirstFileA(MyPath, &FindFileData);
 
        if (hFile == INVALID_HANDLE_VALUE)
        {
            printf("FindFirstFile failed (%d)\n", GetLastError());
        }
        else
        {
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.08.2020, 20:54
Цитата Сообщение от CyberARM Посмотреть сообщение
В чем проблема ? постоянно показывает GetLastError() ошибку 123
ERROR_INVALID_NAME

123 (0x7B)

The filename, directory name, or volume label syntax is incorrect.

Добавлено через 1 минуту
Цитата Сообщение от CyberARM Посмотреть сообщение
sprintf_s(MyPath, MAX_PATH, "%s\\*", path);
Какое имя ты здесь задаёшь?
Ну и, обычно используют *.*
0
0 / 0 / 0
Регистрация: 24.03.2020
Сообщений: 26
09.08.2020, 21:02  [ТС]
т.е изменить так ?

C++
1
sprintf_s(MyPath, MAX_PATH, "*.*", path);
? или я не правильно понимаю ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.08.2020, 21:02
Помогаю со студенческими работами здесь

как определить названия жёстких дисков
Мне нужна команда для программного определения буквы жёсткого диска(логический и физический)

Получение списков дисков
Как получить список дисков, исключая диски без буквы

Получение данных о загрузке дисков
Добрый день. Есть такая конструкция, для получения данных о загрузке дисков в системе посредством системы мониторинга (умеет vb-скрипты)....

DriveInfo - Откуда брать имена, названия, метки жестких дисков и съемных устройств?
Доброго времени суток, товарищи! У меня следующая проблема: Откуда брать имена|названия|лэйблы жестких дисков и съемных...

GetLogicalDrives - получение дисков (в чем трабл?)
Получаю список дисков методом GetLogicalDrives вывожу через цикл Если запускать .exe от администратора, то он не увидит сетевых дисков ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru