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

Функции Setup API, ошибка при выводе списка устройств

20.12.2016, 06:52. Показов 2512. Ответов 1

Студворк — интернет-сервис помощи студентам
Вывожу данные о системной информации ПК, список устройств в файл, но компилятор указывает на невозможность использовать данные функции.

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
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <fstream>
#include <devguid.h>
#include <SetupAPI.h>
#include <stdio.h>
 
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
 
    ofstream oFile("SystemInfo.txt");
 
    SYSTEM_INFO siSysInfo;
    GetSystemInfo(&siSysInfo);
    oFile << "[Информация о процессоре]\n";
    oFile << "Число процессоров: " << siSysInfo.dwNumberOfProcessors;
    oFile << "\n";
    switch (siSysInfo.dwProcessorType)
    {
    case 386: 
        oFile << "Тип процессора i386 (80386)\n"; break;
    case 486:
        oFile << "Тип процессора i486 (80486)\n"; break;
    case 586:
        oFile << "Тип процессора i586 (тип Pentium) \n"; break;
    case 2200:
        oFile << "Тип процессора IA64 (Intel Architecture-64)\n"; break;
    case 8664: 
        oFile << "Тип процессора X8664 (Advanced RISC Machine)\n"; break;
 
    }
    switch (siSysInfo.wProcessorArchitecture)
    {
    case 0:
        oFile << "Архитектура процессора c установленной ОС: х86\n"; break;
    case 5:
        oFile << "Архитектура процессора c установленной ОС: ARM\n"; break;
    case 6:
        oFile << "Архитектура процессора c установленной ОС:Intel Itanium-based\n"; break;
    case 9:
        oFile << "Архитектура процессора c установленной ОС: x64 (AMD or Intel)\n"; break;
    default:
        oFile << "Архитектура процессора c установленной ОС: Неизвестная архитектура!\n";
        break;
    }
 
    oFile << "\n";
    oFile << "[Информация об оперативной памяти]\n";
    MEMORYSTATUS MemStat;
    GlobalMemoryStatus(&MemStat);
 
    oFile << "Физической памяти всего: " << MemStat.dwTotalPhys / 1024 / 1024 << " Мб \n";
    oFile << "Физической памяти доступно: " << MemStat.dwAvailPhys / 1024 / 1024 << " Мб \n";
    oFile << "Виртуальной памяти всего: " << MemStat.dwTotalVirtual / 1024 / 1024 << " Мб \n";
    oFile << "Виртуальной памяти доступно: " << MemStat.dwAvailVirtual / 1024 / 1024 << " Мб \n";
    oFile << "Занято пространства в файле подкачки: " << MemStat.dwTotalPageFile - MemStat.dwAvailPageFile << " Мб \n";
    oFile << "Свободно пространства в файле подкачки: " << MemStat.dwAvailPageFile / 1024 / 1024 << " Мб \n";
 
    HDEVINFO hDevInfo;
    SP_DEVINFO_DATA DeviceInfoData;
    hDevInfo = SetupDiGetClassDevs(NULL,NULL,NULL,DIGCF_PRESENT | DIGCF_ALLCLASSES);
 
    if (hDevInfo == INVALID_HANDLE_VALUE) // если список не удалось получить
    {
        oFile <<  "ERORR! Не удалось получить список\n";
    }
 
    // Перечисление всех устройств в наборе
    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i,
        &DeviceInfoData); i++)
    {
        DWORD DataT; 
        LPTSTR buffer = NULL;
        DWORD buffersize = 0;
 
        while (!SetupDiGetDeviceRegistryProperty(
            hDevInfo,
            &DeviceInfoData,
            SPDRP_DEVICEDESC,
            &DataT,
            (PBYTE)buffer,
            buffersize,
            &buffersize))
        {
            if (GetLastError() ==
                ERROR_INSUFFICIENT_BUFFER)
            {
                // изменение размера буфера
                if (buffer) LocalFree(buffer);
                // удвоение буфера в случае не хватки места
                buffer = (LPTSTR)LocalAlloc(LPTR, buffersize * 2);
            }
            else
            {
                oFile << "ERORR! Не удалось получить список\n";
                break;
            }
        }
 
        oFile <<  "%i %s\n" << (i + 1) << buffer; //  вывод списка в файл
 
        if (buffer) LocalFree(buffer);
    }
 
 
    if (GetLastError() != NO_ERROR &&
        GetLastError() != ERROR_NO_MORE_ITEMS)
    {
        oFile << "ERORR! Не удалось получить список\n";
    }
    //  очистка памяти от списка
    SetupDiDestroyDeviceInfoList(hDevInfo);
 
    oFile.close();
    system("pause");
 
    return 0;
}
список ошибок:

1>ConsoleApplication1.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__SetupDiEnumDeviceInfo@12 в функции _wmain
1>ConsoleApplication1.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__SetupDiDestroyDeviceInfoList@4 в функции _wmain
1>ConsoleApplication1.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__SetupDiGetClassDevsW@16 в функции _wmain
1>ConsoleApplication1.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__SetupDiGetDeviceRegistryPropertyW @28 в функции _wmain

Помогите разобраться где ошибка, да и за критику кода буду благодарен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.12.2016, 06:52
Ответы с готовыми решениями:

Ошибка кодировки при выводе оригинального и отсортированного списка
Здравствуйте, уважаемые форумчане! Не могу понять, почему трабла с кодировкой? При выводе оригинального и отсортированного списка...

Ошибка при выводе таблицы значений функции
программа которая делает таблицу от -2 к 2 с шагом 0.5 #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { float y,x; ...

При выводе значений функции появляется ошибка
Здравствуйте. При выводе значений функции выскакивает ошибка &quot;Значения функции в противоположных точках должно иметь противоположные...

1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.12.2016, 14:28
Цитата Сообщение от _Шаман_ Посмотреть сообщение
ссылка на неразрешенный внешний символ __imp__SetupDiEnumDeviceInfo
Тебе нужно подключить библиотеку (lib) SetupAPI.
Например, так:
C++
1
#pragma comment(lib, "setupapi.lib")
Цитата Сообщение от _Шаман_ Посмотреть сообщение
oFile << "Число процессоров: " << siSysInfo.dwNumberOfProcessors;
Здесь показывается количество логических процессоров.
То есть, количество HT-потоков * к-во ядер * к-во физических процессоров.

Цитата Сообщение от _Шаман_ Посмотреть сообщение
C++
1
2
3
4
    case 2200:
        oFile << "Тип процессора IA64 (Intel Architecture-64)\n"; break;
    case 8664: 
        oFile << "Тип процессора X8664 (Advanced RISC Machine)\n"; break;
C++
1
 
Мне кажется, что это лишнее. Код, скомпилированный для x86/x64, все равно
не запустится на RISC.

Цитата Сообщение от _Шаман_ Посмотреть сообщение
C++
1
2
3
    oFile << "[Информация об оперативной памяти]\n";
    MEMORYSTATUS MemStat;
    GlobalMemoryStatus(&MemStat);
C++
1
 
А здесь лучше GlobalMemoryStatusEx. Потому что GlobalMemoryStatus не
умеет работать с объемами > 4GB.

Цитата Сообщение от _Шаман_ Посмотреть сообщение
C++
1
oFile << "Физической памяти всего: " << MemStat.dwTotalPhys / 1024 / 1024 << " Мб \n";
Кстати, этот параметр показывает, сколько физической памяти в данный момент доступно, а
не объем установленной RAM.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.12.2016, 14:28
Помогаю со студенческими работами здесь

Вызов API функции. Функция перечисляет классы устройств в системе
Доброго времечка! Подскажите пожалуйста про функцию API CM_Enumerate_Classes. Функция перечисляет классы устройств в системе. Вопрос на...

При выводе значений функции возникает ошибка "Это вычисление не приближается к решению"
Добрый вечер. При выводе значений функции возникает ошибка &quot;Это вычисление не приближается к решению&quot;. Хотя сама функция от отдельных...

Ошибка при java setup
Возникает при установке вот такая ошибка(см. скрин). Похожая ошибка возникает при установке новой версии iTunes и т.д. Раньше такого не...

Ошибка при запуске setup
Добрый вечер помогите, написал не большую программу. Пытаясь запустить setup выдает ошибку &quot;Application cannot be started.Contact the...

При добавлении студента, сбивается вся структура, и при выводе всего списка студентов, выводит какой то мусор
Суть действий: При добавлении студента, сбивается вся структура, и при выводе всего списка студентов, выводит какой то мусор. Раньше я...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru