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

Ошибка перечисления драйверов

07.08.2013, 11:13. Показов 1944. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При перечислении драйверов программа на первом же шаге выдает ошибку NO_ITEM_DATA.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SP_DRVINFO_DATA driveInfo;
        driveInfo.cbSize = sizeof(SP_DRVINFO_DATA);
 
        for(int i = 0; SetupDiEnumDriverInfo(classHandle, &devData, SPDIT_COMPATDRIVER, i, &driveInfo); i++)
        {
            SP_DRVINFO_DETAIL_DATA driverDetailData;
            driverDetailData.cbSize = sizeof(SP_DRVINFO_DETAIL_DATA);
 
            if (!SetupDiGetDriverInfoDetail(
                    classHandle,
                    &devData,
                    &driveInfo,
                    &driverDetailData,
                    buffersize,
                    &buffersize))
                qDebug("Error!");            
 
        ui->listDriverFiles->addItem(QString::fromUtf16((ushort*)driverDetailData.DrvDescription));
 
        }
        qDebug(qPrintable(QString::number(GetLastError())));
        SetupDiDestroyDriverInfoList(classHandle, &devData, SPDIT_COMPATDRIVER);
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.08.2013, 11:13
Ответы с готовыми решениями:

Ошибка C2665, пример перечисления
Здравствуйте! Объясните пожалуйста. Уже 2 часа сижу и пытаюсь понять свою ошибку. На примере в книге указан такой код: ...

Ошибка при выборе элемента перечисления
Здравствуйте,столкнулся с такой проблемой. нужно на форме с помощью 2-х реквизитов выполнить операции(сложение,вычитание,умножение) и...

Ошибка C2665, определение и использование перечисления C++/CLI
Здравствуйте! Меня с ветки C++ для начинающих отправили сюда. Не знал что C++ бывает разным. Объясните пожалуйста. Уже 2 часа сижу и...

12
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
07.08.2013, 16:36
Где вызов SetupDiGetClassDevs ? А SetupDiBuildDriverInfoList ?
Лучше приведите код целиком.
0
5 / 5 / 1
Регистрация: 10.07.2013
Сообщений: 99
07.08.2013, 21:38  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Где вызов SetupDiGetClassDevs ? А SetupDiBuildDriverInfoList ?
Лучше приведите код целиком.
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
void DeviceProperty::setDevice(GUID *guid, int index)
{
    currentGUID = guid;
    currentIndex = index;
    ui->tabMain->removeTab(3);
    HDEVINFO classHandle;
    SP_DEVINFO_DATA devData;
    int deviceInfoGet();
    classHandle = SetupDiGetClassDevs(guid, NULL, 0, DIGCF_PRESENT);
    if (classHandle == INVALID_HANDLE_VALUE) return;
    devData.cbSize = sizeof(SP_DEVINFO_DATA);
    SetupDiEnumDeviceInfo(classHandle, index, &devData);
        DWORD DataT;
        QChar* devbuffer = NULL;
        DWORD buffersize = 0;
        //НАЗВАНИЕ УСТРОЙСТВА
        while (!SetupDiGetDeviceRegistryProperty(
                    classHandle,
                    &devData,
                    SPDRP_DEVICEDESC,
                    &DataT,
                    (PBYTE)devbuffer,
                    buffersize,
                    &buffersize))
        {
            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
            {
                if (devbuffer) free(devbuffer);
                devbuffer = (QChar*)malloc(buffersize * 2);
            }
            else break;
        }
 
        this->setWindowTitle(QString::fromUtf16((ushort*)devbuffer));
        if (devbuffer) free(devbuffer);
        buffersize = 0;
        devbuffer = NULL;
        //РАСПОЛОЖЕНИЕ
        while (!SetupDiGetDeviceRegistryProperty(
                    classHandle,
                    &devData,
                    SPDRP_CLASS,
                    &DataT,
                    (PBYTE)devbuffer,
                    buffersize,
                    &buffersize))
        {
            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
            {
                if (devbuffer) free(devbuffer);
                devbuffer = (QChar*)malloc(buffersize * 2);
            }
            else break;
        }
        if (buffersize == 0) ui->labelType->setText(INF_LABEL_TYPE + INF_DONOTEXIST);
        else ui->labelType->setText( INF_LABEL_TYPE + QString::fromUtf16((ushort*)devbuffer));
        if (devbuffer) free(devbuffer);
        buffersize = 0;
        devbuffer = NULL;
        //ПРОИЗВОДИТЕЛЬ
        while (!SetupDiGetDeviceRegistryProperty(//UNICODE версия функции
                    classHandle,
                    &devData,
                    SPDRP_MFG,
                    &DataT,
                    (PBYTE)devbuffer,
                    buffersize,
                    &buffersize))
        {
            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
            {
                if (devbuffer) free(devbuffer);
                devbuffer = (QChar*)malloc(buffersize * 2);
            }
            else break;
        }
        if (buffersize == 0) ui->labelProvider->setText(INF_LABEL_PROVIDER + INF_DONOTEXIST);
        else ui->labelProvider->setText( INF_LABEL_PROVIDER + QString::fromUtf16((ushort*)devbuffer));
        if (devbuffer) free(devbuffer);
        buffersize = 0;
        devbuffer = NULL;
        /РАСПОЛОЖЕНИЕ
        while (!SetupDiGetDeviceRegistryProperty(
                    classHandle,
                    &devData,
                    SPDRP_LOCATION_INFORMATION,
                    &DataT,
                    (PBYTE)devbuffer,
                    buffersize,
                    &buffersize))
        {
            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
            {
                if (devbuffer) free(devbuffer);
                devbuffer = (QChar*)malloc(buffersize * 2);
            }
            else break;
        }
        if (buffersize == 0) ui->labelLocation->setText(INF_LABEL_LOCATION + INF_DONOTEXIST);
        else ui->labelLocation->setText(INF_LABEL_LOCATION + QString::fromUtf16((ushort*)devbuffer));
        if (devbuffer) free(devbuffer);
        buffersize = 0;
       devbuffer = NULL;
        CONFIGRET deviceStatus;
        PULONG pulStatus, problemNumber;
        pulStatus = new ulong;
        problemNumber = new ulong;
        deviceStatus = CM_Get_DevNode_Status(pulStatus, problemNumber, devData.DevInst, 0);
        if (deviceStatus == CR_SUCCESS)
        {
            if (*problemNumber == 0) // ((*pulStatus & DN_HAS_PROBLEM) != 0)
                ui->deviceStatusEdit->setText(INF_STATUS_WORK);
            else
            {
                ui->deviceStatusEdit->append(INF_STATUS_PROBLEM + QString::number(*problemNumber));
 
                switch (*problemNumber)
                {
                case 22: ui->deviceStatusEdit->append("\n\rDevice is disable."); break;
                }
            }
        }
 
        SP_DRVINFO_DATA driveInfo;
        driveInfo.cbSize = sizeof(SP_DRVINFO_DATA);
 
        for(int i = 0; SetupDiEnumDriverInfo(classHandle, &devData, SPDIT_COMPATDRIVER, i, &driveInfo); i++)
        {
            SP_DRVINFO_DETAIL_DATA driverDetailData;
            driverDetailData.cbSize = sizeof(SP_DRVINFO_DETAIL_DATA);
 
            if (!SetupDiGetDriverInfoDetail(//UNICODE версия функции
                    classHandle,
                    &devData,
                    &driveInfo,
                    &driverDetailData,
                    buffersize,
                    &buffersize))
                 qDebug("Error!");
 
        ui->listDriverFiles->addItem(QString::fromUtf16((ushort*)driverDetailData.DrvDescription));
 
        }
        qDebug(qPrintable(QString::number(GetLastError())));
        SetupDiDestroyDriverInfoList(classHandle, &devData, SPDIT_COMPATDRIVER);
        SetupDiDestroyDeviceInfoList(classHandle);
        informationView(ui->comboBoxInformation->currentText());
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
07.08.2013, 22:49
Перед вызовом SetupDiEnumDriverInfo нужно "добавить" драйверы в список
device information set. Для этого нужно вызвать функцию SetupDiBuildDriverInfoList.

Добавлено через 5 минут
Строка 12

SetupDiEnumDeviceInfo(classHandle, index, &devData);
Где проверка возвращаемого значения ?
Вообще, эту функцию нужно вызывать несколько раз, увеличивая Index на каждом шаге,
пока не будет возвращена ошибка, а GetLastError даст ERROR_NO_MORE_ITEMS.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for(int i = 0; SetupDiEnumDriverInfo(classHandle, &devData, SPDIT_COMPATDRIVER, i, &driveInfo); i++)
        {
            SP_DRVINFO_DETAIL_DATA driverDetailData;
            driverDetailData.cbSize = sizeof(SP_DRVINFO_DETAIL_DATA);
 
            if (!SetupDiGetDriverInfoDetail(//UNICODE версия функции
                    classHandle,
                    &devData,
                    &driveInfo,
                    &driverDetailData,
                    buffersize,
                    &buffersize))
                 qDebug("Error!");
 
        ui->listDriverFiles->addItem(QString::fromUtf16((ushort*)driverDetailData.DrvDescription));
 
        }
Здесь тоже не видно проверки значения, возвращаемого SetupDiEnumDriverInfo.
И под буфер для SetupDiGetDriverInfoDetail нужно места выделять больше, чем sizeof (SP_DRVINFO_DETAIL_DATA).
1
5 / 5 / 1
Регистрация: 10.07.2013
Сообщений: 99
08.08.2013, 09:51  [ТС]
Перед вызовом SetupDiEnumDriverInfo нужно "добавить" драйверы в список
device information set. Для этого нужно вызвать функцию SetupDiBuildDriverInfoList.
Вот это я и упустил.
Где проверка возвращаемого значения ?
Да, действительно забыл проверку.
Вообще, эту функцию нужно вызывать несколько раз, увеличивая Index на каждом шаге,
пока не будет возвращена ошибка, а GetLastError даст ERROR_NO_MORE_ITEMS.
Здесь мне не нужно выводить все устройства, а только одно, по уже заранее известному индексу в перечислении.
Здесь тоже не видно проверки значения, возвращаемого SetupDiEnumDriverInfo.
Проверкой в данном случае является for который в случае возврата 0 не войдет внутрь цикла.
И под буфер для SetupDiGetDriverInfoDetail нужно места выделять больше, чем sizeof (SP_DRVINFO_DETAIL_DATA).
Я так понимаю, при нехватке места, выделять buffersize*2 ? А сколько тогда первично выделить?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
08.08.2013, 11:14
Цитата Сообщение от dBuSh83 Посмотреть сообщение
Проверкой в данном случае является for который в случае возврата 0 не войдет внутрь цикла.
Да, но так Вы не узнаете, вернула ли функция ERROR_NO_MORE_ITEMS, что является
штатным поведением, или другой код ошибки.

Цитата Сообщение от dBuSh83 Посмотреть сообщение
Я так понимаю, при нехватке места, выделять buffersize*2 ? А сколько тогда первично выделить?
Самый надежный способ - цикл.
На первой итерации передаете buffer = NULL, size = 0. Функция возвращает ошибку с кодом
ERROR_INSUFFICIENT_BUFFER, помещая в RequiredSize необходимый размер буфера, в байтах.
Далее выделяете буфер и вызываете функцию с новыми значениями buffer и size.
Если и на этот раз ошибка - выделяете буфер снова, и так до тех пор, пока функция не
вернет код успеха или код ошибки, отличный от ERROR_INSUFFICIENT_BUFFER.
На каждой итерации нужно перед вызовом функции устанавливать SP_DRVINFO_DETAIL_DATA.cbSize.
1
5 / 5 / 1
Регистрация: 10.07.2013
Сообщений: 99
08.08.2013, 11:46  [ТС]
Да, но так Вы не узнаете, вернула ли функция ERROR_NO_MORE_ITEMS, что является
штатным поведением, или другой код ошибки.
Понял и сделал проверку!
Самый надежный способ - цикл.
Вроде сделал что-то похожее.
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
if (!SetupDiBuildDriverList(classHandle, &devData, SPDIT_COMPATDRIVER))
{
    //вывод ошибки
    SetupDiDestroyDeviceInfoList(classHandle);
    return;
}
 
for(int i = 0; SetupDiEnumDriverInfo(classHandle, &devData, SPDIT_COMPATDRIVER, i, &driveInfo); i++)
        {
            SP_DRVINFO_DETAIL_DATA driverDetailData;
            buffersize = sizeof(SP_DRVINFO_DETAIL_DATA);
            driverDetailData.cbSize = buffersize;
 
            while (!SetupDiGetDriverInfoDetail(
                    classHandle,
                    &devData,
                    &driveInfo,
                    &driverDetailData,
                    buffersize,
                    &buffersize))
            {
                if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
                {
                    driverDetailData.cbSize = buffersize * 2;
                }
                else 
                {
                    //вывод ошибки
                    break;
                }
            }
        ui->listDriverFiles->addItem(QString::fromUtf16((ushort*)driverDetailData.DrvDescription));
        }
        if (GetLastError != ERROR_NO_MORE_ITEMS)
           //Вывод ошибки
Вроде работает, но SetupDiGetDriverInfoDetail уходит в ошибку (попадает на else), но при этом добросовестно выводит описание драйвера (driverDetailData.DrvDescription).
И еще вопрос: как узнать, какой из драйверов используется в данный момент? Например, у видеокарты 2 драйвера: стандартный vga и nvidia. Используется, соответсвенно, nvidia. Как это определить программно?

Добавлено через 10 минут
Ошибка ERROR_INVALID_USER_BUFFER.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
08.08.2013, 14:43
Цитата Сообщение от dBuSh83 Посмотреть сообщение
Вроде работает, но SetupDiGetDriverInfoDetail уходит в ошибку (попадает на else), но при этом добросовестно выводит описание драйвера (driverDetailData.DrvDescription).
Код неправильный.
Вы должны сначала вызвать эту функцию с DriverInfoDetailData = NULL и DriverInfoDetailDataSize = 0.
При нормальном развитии событий функция вернет FALSE с кодом ошибки ERROR_INSUFFICIENT_BUFFER,
сообщая что буфер слишком мал, и запишет требуемый размер в переменную DWORD, на которую указывает
последний параметр (RequiredSize). Далее вы должны выделить буфер указанного (или большего) размера,
привести его к указателю на SP_DRVINFO_DETAIL_DATA и вписать туда cbSize = sizeof (SP_DRVINFO_DETAIL_DATA).

В cbSize указывается размер структуры, не всего буфера. Буфер может быть неопределенно большого размера.

После этого функция вызывается повторно, только теперь в DriverInfoDetailData передается указатель на
выделенный буфер, а в DriverInfoDetailDataSize его размер.

Почему я говорил о цикле, как о самом надежном средстве ?
Да потому, что между первым и вторым вызовом функции существует (пусть и незначительная, но все же)
вероятность, что другой процесс поменяет что-то в конфигурации устройства и буфер снова окажется
слишком мал.
1
5 / 5 / 1
Регистрация: 10.07.2013
Сообщений: 99
09.08.2013, 11:36  [ТС]
Вот как то так получается:
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
SP_DRVINFO_DETAIL_DATA driverDetailData= NULL;
            buffersize = 0;
            (!SetupDiGetDriverInfoDetail(  //Первый вызов уйдет в ERROR_INSUFFICIENT_BUFFER
                    classHandle,
                    &devData,
                    &driveInfo,
                    &driverDetailData,
                    buffersize,
                    &buffersize))  //запишется требуемый размер буффера 
            {
                if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
                {
                    driverDetailDatacbSize = sizeof (SP_DRVINFO_DETAIL_DATA);
                }
                else 
                {
                    //вывод ошибки
                    SetupDiDestroyDriverInfoList(classHandle, &devData, SPDIT_COMPATDRIVER);
                    SetupDiDestroyDeviceInfoList(classHandle);
                    return;
                }
            }
            LPTSTR buffer = NULL;
            buffer = (LPTSTR)malloc(buffersize); //указываем требуемый размер буффера
            while (!SetupDiGetDriverInfoDetail(  
                    classHandle,
                    &devData,
                    &driveInfo,
                    buffer,          //указываем буффер
                    buffersize,
                    &buffersize))  //запишется требуемый размер буффера 
            {
                if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
                {
                    if (buffer) = free(buffer);                 //В случае, если размер изменился, изменяем размер буффера
                    buffer = (LPTSTR)malloc(buffersize);
                }
                else 
                {
                    //вывод ошибки
                    break;
                }
                //выводим нужную информацию. (работаем с буффером)
            }
        //
        }
Добавлено через 36 секунд
Я правильно понял идею?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.08.2013, 14:06
Цитата Сообщение от dBuSh83 Посмотреть сообщение
Я правильно понял идею?
Снова нет.
Но не вижу смысла опять повторять все, что я написал выше.

C++
1
2
LPTSTR buffer = NULL;
buffer = (LPTSTR)malloc(buffersize); //указываем требуемый размер буффера
В результате оптимизации компилятор выкинет первую строчку.
На работе ДАННОГО кода это не отразится.
Но поставьте new вместо malloc и код станет небезопасным.
Здесь нужен компиляторный барьер _ReadWriteBarrier (Visual C++).
1
5 / 5 / 1
Регистрация: 10.07.2013
Сообщений: 99
09.08.2013, 17:16  [ТС]
В результате оптимизации компилятор выкинет первую строчку.
Забыл что buffer уже создана, поэтому не нужно создавать ее снова, иначе компилятор в ошибку бы ушел:
C++
1
buffer = NULL;
Совсем забыл про:
... привести его к указателю на SP_DRVINFO_DETAIL_DATA и вписать туда cbSize = sizeof (SP_DRVINFO_DETAIL_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
46
47
48
SP_DRVINFO_DETAIL_DATA driverDetailData= NULL;
            buffersize = 0;
            (!SetupDiGetDriverInfoDetail(  //Первый вызов уйдет в ERROR_INSUFFICIENT_BUFFER
                    classHandle,
                    &devData,
                    &driveInfo,
                    &driverDetailData,
                    buffersize,
                    &buffersize))  //запишется требуемый размер буффера 
            {
                if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
                {
                    driverDetailDatacbSize = sizeof (SP_DRVINFO_DETAIL_DATA);
                }
                else 
                {
                    //вывод ошибки
                    SetupDiDestroyDriverInfoList(classHandle, &devData, SPDIT_COMPATDRIVER);
                    SetupDiDestroyDeviceInfoList(classHandle);
                    return;
                }
            }
            buffer = NULL;
            buffer = (QChar*)malloc(buffersize); //выделяем требуемый размер буффера
            (SP_DRVINFO_DETAIL_DATA*)buffer->cbsize = sizeof(SP_DRVINFO_DETAIL_DATA);
            while (!SetupDiGetDriverInfoDetail(  
                    classHandle,
                    &devData,
                    &driveInfo,
                    (SP_DRVINFO_DETAIL_DATA*)buffer,          //указываем буффер
                    buffersize,
                    &buffersize))  //запишется требуемый размер буффера 
            {
                if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
                {
                    if (buffer) = free(buffer);                 //В случае, если размер изменился, изменяем размер буффера
                    buffer = (LPTSTR)malloc(buffersize);
                    (SP_DRVINFO_DETAIL_DATA*)buffer->cbsize = sizeof(SP_DRVINFO_DETAIL_DATA);
                }
                else 
                {
                    //вывод ошибки
                    break;
                }
                //выводим нужную информацию. (работаем с буффером)
            }
        //
        }
Здесь нужен компиляторный барьер _ReadWriteBarrier (Visual C++).
Для чего он нужен я не понял.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.08.2013, 21:15
Да, вот сейчас правильно. С одной ремаркой (выделил жирным):

SP_DRVINFO_DETAIL_DATA driverDetailData= NULL;
buffersize = 0;

(!SetupDiGetDriverInfoDetail( //Первый вызов уйдет в ERROR_INSUFFICIENT_BUFFER
classHandle,
&devData,
&driveInfo,
&driverDetailData,
buffersize,
&buffersize)) //запишется требуемый размер буффера
Нужно просто driverDetailData (без оператора взятия адреса). Или сразу NULL.

Цитата Сообщение от dBuSh83 Посмотреть сообщение
Для чего он (барьер компилятора) нужен я не понял.
Вообще-то в данном случае он не нужен. Это я погорячился.
1
5 / 5 / 1
Регистрация: 10.07.2013
Сообщений: 99
12.08.2013, 10:39  [ТС]
Спасибо за помощь! Буду разбираться дальше!

Осталось еще пару вопросов по драйверам:
1) Как выловить используемый устройством драйвер? Из полученных выше способом нужно как-то выделить драйвер используемый устройством в данный момент.
2) Как получить список файлов(dll) используемых драйвером.

Или для этих вопросов лучше создать отдельные темы?

Добавлено через 53 минуты
Второй вопрос отпал сам собой: в .inf файле содержится эта информация. Но если это можно с помощью winAPI реализовать, будет гораздо лучше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.08.2013, 10:39
Помогаю со студенческими работами здесь

Ошибка при передаче перечисления как параметра
Здравствуйте! Я пока в С++ начинающий студия 2012, проблема такая учусь по книжки Хортона, создал пример указанный в книги (там студия...

Перечисления фиксированного типа ( enum-base ). Ошибка при компиляции
Если я правильно понимаю, следующий enum ( далее — енум ): enum : < type > { < CONST_NAME > }; , где < type > — некий скалярный...

OpenGL - после установки драйверов, выдалась ошибка "Драйвер дисплея AMD - Ошибка! 90 мБайт"
Для игры Minecraft требуется OpenGL, после установки драйверов, выдалась ошибка "Драйвер дисплея AMD - Ошибка! 90 мБайт"....

Ошибка установки драйверов
Здравствуйте. Не устанавливаются драйвера на все, что связано с видео ни в автоматическом режиме, ни в ручном. Пример: видео тюнер...

Ошибка установки драйверов модема 3G
Всем привет! Я установил программу Megafon Modem на Windows 7, но драйвера Huawei Mobile не хотят ставится. На Ubuntu всё работает. Месяц...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru