Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/55: Рейтинг темы: голосов - 55, средняя оценка - 4.56
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
1

Получение версии Windows

13.09.2017, 23:22. Показов 10687. Ответов 34
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, дорогие форумчане! Столкнулся со следующей проблемой. Есть код, который с помощью системной библиотеки определяет версию Windows. Вот он:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void getRealWindowsVersion(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
 
    RTL_OSVERSIONINFOEXW *pk_OSVer = new RTL_OSVERSIONINFOEXW;
    typedef LONG(WINAPI* tRtlGetVersion)(RTL_OSVERSIONINFOEXW*);
 
    memset(pk_OSVer, 0, sizeof(RTL_OSVERSIONINFOEXW));
    pk_OSVer->dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
 
    HMODULE h_NtDll = GetModuleHandleW(L"ntdll.dll");
    tRtlGetVersion f_RtlGetVersion = (tRtlGetVersion)GetProcAddress(h_NtDll, "RtlGetVersion");
 
    LONG Status = f_RtlGetVersion(pk_OSVer);
    
    if (Status == 0) {
        TCHAR version = TCHAR("Windows") + pk_OSVer->dwMajorVersion + TCHAR(".") + pk_OSVer->dwMinorVersion;
        SendDlgItemMessage(hDlg, IDC_VERSION_OC, LB_ADDSTRING, 0, (LPARAM)version);
    }
    else
    SendDlgItemMessage(hDlg, IDC_VERSION_OC, LB_ADDSTRING, 0, (LPARAM)_T("0"));;
    delete pk_OSVer;
}
При выполнении функции возникает исключение:

Вызвано исключение по адресу 0x766A2410 (user32.dll) в WindowsProject1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x000016C6.

Не знаю как исправить. Надеюсь на Вашу помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.09.2017, 23:22
Ответы с готовыми решениями:

Есть ли какие - то ограничения по минимальной версии Windows / Linux для последней версии Qt?
Привет! Вот тут какие - то непонятки. Скачал Qt последний на Win7 - ворк пёрфеткли, на 8.1 - та же...

Получение версии файла
Подскажите, пожалуйста, как в C# получить версию exe файла?

Получение сведений о версии ОС
Здравствуйте! Спортивный интерес. Как тоже самое переписать для юникодной версии функции ? ...

Резервное получение версии программы
Я написал программу. При запуске она сверяет свою версию с версией на веб-сервере. Дело в том что...

34
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
14.09.2017, 10:34 2
Первое: проверяйте что возвращают функция winAPI, в данном случае - GetProcAddress.
Второе:
C++
1
TCHAR version = TCHAR("Windows") + pk_OSVer->dwMajorVersion + TCHAR(".") + pk_OSVer->dwMinorVersion;
- так объединять строки нельзя, используйте или _tcscat или std::basic_string<TCHAR>

Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
9
10
11
#if define(_UNICODE) || define(UNICODE)
#define _to_tstring(x) (std::to_wstring(x))
#else
#define _to_tstring(x) (std::to_string(x))
#endif
...
auto version = TCHAR("Windows") + 
               _to_tstring(pk_OSVer->dwMajorVersion) + 
               TCHAR(".") + 
               _to_tstring(pk_OSVer->dwMinorVersion);
SendDlgItemMessage(hDlg, IDC_VERSION_OC, LB_ADDSTRING, 0, (LPARAM)version.c_str());
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.09.2017, 12:01 3
Цитата Сообщение от alex9816 Посмотреть сообщение
RtlGetVersion
А чем не устраивает стандартная функция GetVersionEx?
0
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
14.09.2017, 13:37  [ТС] 4
Operok, спасибо, исправлю, не знал. Что возвращает функция - проверю ещё раз и напишу!)

Добавлено через 1 минуту
Убежденный, функция не устраивает тем, что она возвращает одни и тоже значения для всех операционных систем, начиная с Windows 8.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.09.2017, 13:48 5
alex9816, так это довольно легко исправляется добавлением блоков 'compatibility' в
манифест приложения, о чем, кстати говоря, документация на GetVersionEx открыто пишет:
Applications not manifested for Windows 8.1 or Windows 10 will return the Windows 8 OS version value (6.2).
Once an application is manifested for a given operating system version, GetVersionEx will always return the
version that the pplication is manifested for in future releases. To manifest your applications for Windows 8.1 or
Windows 10, refer to Targeting your application for Windows.
А RtlGetVersion делу не поможет, она тоже будет возвращать "виртуализированные", а не
реальные значения dwMajorVersion/dwMinorVersion, если в манифесте нет нужных блоков.
0
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
14.09.2017, 13:53  [ТС] 6
Убежденный, а можно пример реализации с блоками совместимости?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.09.2017, 13:55 7
Глянь еще вот здесь:
Ошибка при сравнении строк

Тут как-то уже писали, что GetVersion(Ex) и RtlGetVersion - это, по сути, одно и то же.
И "неправильные" номера будут в обоих вариантах. Если уж на то пошло, тогда
брать номер версии следует из RtlGetNtVersionNumbers или читать из PEB.

Про манифесты есть здесь (особенно нижнюю ссылку, там есть пример манифеста с
блоком 'compatibility' для Windows 10).

Манифест
Как подключить указанный манифест, чтобы нормально определять Windows 10 через getversionex() ?
0
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
14.09.2017, 14:09  [ТС] 8
Убежденный, а подключать xml файл как в проект? Как в примере? Без #include?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.09.2017, 14:22 9
Тебе нужно добавить его в ресурсы. ID ресурса = 1, тип = 24. Как именно ты это сделаешь - не важно
(есть несколько способов, вплоть до редактирования файла .rc вручную). Ах, да, в Visual C++
компоновщик создает дефолтный манифест, так что если ты добавляешь свой, то дефолтный
нужно отключить (см. свойства проекта, раздел Linker, поставь там Generate Manifest = No).
0
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
14.09.2017, 23:30  [ТС] 10
Убежденный, хорошо, буду пробовать)

Добавлено через 5 часов 21 минуту
Убежденный, отключил создание манифеста в свойствах. Создал файл манифеста аналогично Вашему и подключил его. Теперь на этапе компиляции возникает ошибка, связанная с файлом манифеста.

Добавлено через 10 минут
Убежденный, исправил, пересобрав проект

Добавлено через 3 часа 13 минут
Цитата Сообщение от Operok Посмотреть сообщение
_tcscat или std::basic_string<TCHAR>
в какой они библиотеке находятся?

Добавлено через 16 минут
Цитата Сообщение от Operok Посмотреть сообщение
#if define(_UNICODE) || define(UNICODE)
Здесь появляется ошибка: недопустимый вызов функции в константном выражении.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
14.09.2017, 23:34 11
_tcscat - <tchar.h>
std::basic_string - <string>

Добавлено через 2 минуты
Цитата Сообщение от alex9816 Посмотреть сообщение
Здесь появляется ошибка: недопустимый вызов функции в константном выражении.
сори...
C++
1
#if defined(_UNICODE) || defined(UNICODE)
0
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
14.09.2017, 23:42  [ТС] 12
Цитата Сообщение от Operok Посмотреть сообщение
_tcscat - <tchar.h>
std::basic_string - <string>
Да, это уже нашёл, а вот последнюю ошибку не знаю как исправить.

Добавлено через 37 секунд
Цитата Сообщение от Operok Посмотреть сообщение
#if defined(_UNICODE) || defined(UNICODE)
Сейчас попробую, спасибо!

Добавлено через 2 минуты
Operok,

C++
1
2
3
auto version = TCHAR("Windows") + _to_tstring((osvi.dwMajorVersion)) +
        TCHAR(".") +_to_tstring((osvi.dwMinorVersion));
    SendDlgItemMessage(hDlg, IDC_VERSION_OC, LB_ADDSTRING, 0, (LPARAM)version);
Невозможно преобразовать version в (LPARAM)

Добавлено через 1 минуту
Цитата Сообщение от alex9816 Посмотреть сообщение
Невозможно преобразовать version в (LPARAM)
Передавать по ссылке?

Добавлено через 3 минуты
Цитата Сообщение от alex9816 Посмотреть сообщение
auto version = TCHAR("Windows") + _to_tstring((osvi.dwMajorVersion)) + TCHAR(".") +_to_tstring((osvi.dwMinorVersion));
SendDlgItemMessage(hDlg, IDC_VERSION_OC, LB_ADDSTRING, 0, (LPARAM)version);
"Windows" и "." выводятся иероглифами. Замена TCHAR на _T не помогла.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
15.09.2017, 09:27 13
Цитата Сообщение от alex9816 Посмотреть сообщение
Невозможно преобразовать version в (LPARAM)
а зачем вы пытаетесь version к LPARAM скастить?
Цитата Сообщение от Operok Посмотреть сообщение
C++
1
SendDlgItemMessage(hDlg, IDC_VERSION_OC, LB_ADDSTRING, 0, (LPARAM)version.c_str());
0
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
15.09.2017, 22:32  [ТС] 14
Operok, видимо, потому что до конца ещё не разобрался)
Спасибо, буду пробовать)

Добавлено через 12 часов 52 минуты
Operok, не работает вывод. Вместо windows и . просто квадраты выводятся

Добавлено через 1 минуту
Operok, использую:
Цитата Сообщение от Operok Посмотреть сообщение
SendDlgItemMessage(hDlg, IDC_VERSION_OC, LB_ADDSTRING, 0, (LPARAM)version.c_str());
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
20.09.2017, 21:51 15
Цитата Сообщение от Убежденный Посмотреть сообщение
А чем не устраивает стандартная функция GetVersionEx?
Тем, что она с рандомным шансом на Win 8.1 / 10 на некоторых системах может вернуть версию 6.2 (т.е. Windows 8) даже при наличии манифеста совместимости. При чём может выдавать каждый раз разную версию для одной и той же машины.
Пруф - логи моих программ на VB6 с одного из ПК юзеров (на AutoIt, кстати, тоже). Я конечно не исключаю, что виртуализация через VB6 рантайм или особые опции линковщика накладывают какие-то свои искажения. В программе честный вызов обеих функций через отложенную загрузку dll (см. GetVersion.exe). При том, что GetVersionEx у меня работала исправно на 99% машин.

Если есть желание, можешь собрать тестовую утилиту (желательно с сурцами). У меня остался на примете активный юзер с Win10, у которого воспроизводилась эта проблема. Могу попытаться попросить его протестировать.

P.S. Кстати, на его тестах (на моих тоже) RtlGetVersion нормально отрабатывает и без манифеста совместимости.

Цитата Сообщение от Убежденный Посмотреть сообщение
Если уж на то пошло, тогда
брать номер версии следует из RtlGetNtVersionNumbers или читать из PEB.
Как то не хочется экспериментировать в своей программе с непроверенной инфой (хотя, если хочешь, можешь и такой тест написать). Просто RtlGetVersion как-бы "рекомендует" Майкрософт, ведь:

Цитата Сообщение от MSDN
[GetVersionEx may be altered or unavailable for releases after Windows 8.1. Instead, use the Version Helper functions]
и если погуглить то можно найти сурцы этих макросов, которые раскрываются именно через функцию RtlGetVersion.

А что она делает, RtlGetNtVersionNumbers и на каком уровне документированна? На сколько я понял, читает версию из PEB подгруженной ntdll.dll ?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
21.09.2017, 11:03 16
Цитата Сообщение от Dragokas Посмотреть сообщение
она с рандомным шансом на Win 8.1 / 10 на некоторых системах может вернуть версию 6.2 (т.е. Windows 8) даже при наличии манифеста совместимости.
Да, пользователь может запустить приложение в режиме совместимости с какой-нибудь Windows Vista.
И тогда GetVersionEx будет возвращать 6.0, независимо от манифеста. Этого никто не отменял.
И такое же поведение будет у RtlGetVersion.

Цитата Сообщение от Dragokas Посмотреть сообщение
на его тестах (на моих тоже) RtlGetVersion нормально отрабатывает и без манифеста совместимости.
GetVersionEx и RtlGetVersion - это одно и то же. Точнее говоря, первая является оберткой над второй.
Вот код GetVersionExW из Windows 10 (x64):
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
; KERNELBASE!GetVersionExW:
00007ff8`744fcd30 48895c2408      mov     qword ptr [rsp+8],rbx
00007ff8`744fcd35 57              push    rdi
00007ff8`744fcd36 4883ec20        sub     rsp,20h
00007ff8`744fcd3a 8b01            mov     eax,dword ptr [rcx]
00007ff8`744fcd3c 33ff            xor     edi,edi
00007ff8`744fcd3e 2d14010000      sub     eax,114h
00007ff8`744fcd43 488bd9          mov     rbx,rcx
00007ff8`744fcd46 a9f7ffffff      test    eax,0FFFFFFF7h
00007ff8`744fcd4b 0f85d58f0300    jne     KERNELBASE!GetVersionExW+0x38ff6 (00007ff8`74535d26)
00007ff8`744fcd51 ff1549ba0e00    call    qword ptr [KERNELBASE!_imp_RtlGetVersion (00007ff8`745e87a0)]
; ...
Даже если сегодня RtlGetVersion работает "правильно", никто не даст гарантий, что
завтра будет точно также.

Цитата Сообщение от Dragokas Посмотреть сообщение
Как то не хочется экспериментировать в своей программе с непроверенной инфой (хотя, если хочешь, можешь и такой тест написать). Просто RtlGetVersion как-бы "рекомендует" Майкрософт, ведь:
Где он ее рекомендует?

Цитата Сообщение от Dragokas Посмотреть сообщение
и если погуглить то можно найти сурцы этих макросов, которые раскрываются именно через функцию RtlGetVersion.
Зачем гуглить? Открываем заголовки последних Windows SDK, там все есть:
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
VERSIONHELPERAPI
IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor)
{
    OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 };
    DWORDLONG        const dwlConditionMask = VerSetConditionMask(
        VerSetConditionMask(
        VerSetConditionMask(
            0, VER_MAJORVERSION, VER_GREATER_EQUAL),
               VER_MINORVERSION, VER_GREATER_EQUAL),
               VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
 
    osvi.dwMajorVersion = wMajorVersion;
    osvi.dwMinorVersion = wMinorVersion;
    osvi.wServicePackMajor = wServicePackMajor;
 
    return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
}
 
VERSIONHELPERAPI
IsWindowsXPOrGreater()
{
    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0);
}
 
VERSIONHELPERAPI
IsWindowsXPSP1OrGreater()
{
    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 1);
}
 
// ... И т.д.
Здесь видно, что используется не RtlGetVersion, а VerifyVersionInfoW...

----

Вообще, я против использования каких-либо недокументированных путей без крайней нужды.
Только это хотел подчеркнуть. Если нужно получить номер версии - то делать это следует
сначала "официальными" средствами (GetVersionEx + манифест). И только в том случае,
если это не устраивает и если позарез нужно получить "настоящий" номер версии, независимо
от настроек compatibility и т.п., использовать всякие подводные низкоуровневые примочки.
1
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
21.09.2017, 22:19 17
Цитата Сообщение от Убежденный Посмотреть сообщение
Да, пользователь может запустить приложение в режиме совместимости с какой-нибудь Windows Vista.
И тогда GetVersionEx будет возвращать 6.0, независимо от манифеста. Этого никто не отменял.
И такое же поведение будет у RtlGetVersion.
Это да, хотя compatiblity shim почему-то не действует на GetVersionEx, запущенный из-под приложения на VB6.

Цитата Сообщение от Убежденный Посмотреть сообщение
GetVersionEx и RtlGetVersion - это одно и то же. Точнее говоря, первая является оберткой над второй.
Вот код GetVersionExW из Windows 10 (x64):
Тем не менее, они показывают различное поведение:
1) RtlGetVersion на С++ без манифеста совместимости показывает правильную версию на win10, в отличие от GetVersionEx.
Проверял на таком коде:

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
#include <Windows.h>
#include <stdio.h>
#include <VersionHelpers.h>
 
typedef NTSTATUS(NTAPI* fnRtlGetNtVersionNumbers)(LPDWORD major, LPDWORD minor, LPDWORD build);
typedef NTSTATUS(NTAPI* fnRtlGetVersion)(PRTL_OSVERSIONINFOEXW lpVersionInformation);
 
int main()
{
    DWORD major = 0, minor = 0, build = 0;
 
    auto RtlGetNtVersionNumbers = (fnRtlGetNtVersionNumbers)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlGetNtVersionNumbers");
 
    if (RtlGetNtVersionNumbers)
        RtlGetNtVersionNumbers(&major, &minor, &build);
 
    RTL_OSVERSIONINFOEXW rtovi = { 0 };
 
    rtovi.dwOSVersionInfoSize = sizeof(rtovi);
    auto RtlGetVersion = (fnRtlGetVersion)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlGetVersion");
    if (RtlGetVersion)
        RtlGetVersion(&rtovi);
 
    OSVERSIONINFOEX ovi = { 0 };
 
    ovi.dwOSVersionInfoSize = sizeof(ovi);
 
    GetVersionEx((OSVERSIONINFO*)&ovi);
 
    printf("RtlGetNtVersionNumbers: %u.%u.%u\n", major, minor, build);
    printf("RtlGetVersion           %u.%u.%u\n", rtovi.dwMajorVersion, rtovi.dwMinorVersion, rtovi.dwBuildNumber);
    printf("GetVersionEx:           %u.%u.%u\n", ovi.dwMajorVersion, ovi.dwMinorVersion, ovi.dwBuildNumber);
    printf("VersionHelper:\n  Win 10+: %s\n  Win 8.1+: %s\n  Win 8.0+: %s\n",
        IsWindows10OrGreater() ? "true" : "false",
        IsWindows8Point1OrGreater() ? "true" : "false",
        IsWindows8OrGreater() ? "true" : "false"
    );
 
    system("pause");
 
    return 0;
}
RtlGetNtVersionNumbers: 10.0.4026546233
RtlGetVersion 10.0.14393
GetVersionEx: 6.2.9200
VersionHelper:
Win 10+: false
Win 8.1+: false
Win 8.0+: true
Кстати, RtlGetNtVersionNumbers отображает какой-то странный билд.

2) RtlGetVersion на VB6 для некоторых систем показывает правильный результат в отличие от GetVersionEx. Пруф.

Цитата Сообщение от Убежденный Посмотреть сообщение
Где он ее рекомендует?
...
Зачем гуглить? Открываем заголовки последних Windows SDK, там все есть:
Спасибо за цитату. Да, не посмотрел я SDK, меня сбил с толку этот код VersionHelpers.h

Цитата Сообщение от Убежденный Посмотреть сообщение
Даже если сегодня RtlGetVersion работает "правильно", никто не даст гарантий, что
завтра будет точно также.
И здесь похоже ты тоже прав, по моей же первой ссылке на кибере видно, что обе функции выдали одинаково неверный результат по непонятной причине.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
21.09.2017, 23:05 18
Цитата Сообщение от Dragokas Посмотреть сообщение
compatiblity shim почему-то не действует на GetVersionEx, запущенный из-под приложения на VB6.
Надо под отладчиком смотреть. Возможно, там работает другая compatibility shim

Цитата Сообщение от Dragokas Посмотреть сообщение
RtlGetVersion на С++ без манифеста совместимости показывает правильную версию на win10, в отличие от GetVersionEx.

...

RtlGetVersion на VB6 для некоторых систем показывает правильный результат в отличие от GetVersionEx.
Я раза два или три сталкивался с тем, что у RtlGetVersion "показания" тоже были "сбивчивые",
причем приложение с манифестом + compatibility/trustInfo и никакие настройки совместимости не были
задействованы. Один раз это было в процессе установщика (msiexec.exe), второй - ... уже и не помню,
где именно. Причем один человек из MS на Technet писал, что RtlGetVersion, в отличие от GetVersionEx,
не является частью compatibility shim (OsVersionLie) и, по идее, вообще не должна виртуализироваться...
1
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
02.10.2017, 09:34  [ТС] 19
Operok, не подскажете, как таким же способом вывести значение дискриптора?
C++
1
SendDlgItemMessage(hDlg, IDC_VERSION_OC, LB_ADDSTRING, 0, (LPARAM)version.c_str());
Как только не пробовал явно преобразовать тип дискриптора, результат - компилятор не ругается только на преобразование - (char)переменная со значением дискриптора, но в listbox выводится только "`"
0
15 / 15 / 8
Регистрация: 01.10.2017
Сообщений: 97
02.10.2017, 12:52 20
как вариант версию windows можно получить из ветки реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
0
02.10.2017, 12:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2017, 12:52
Помогаю со студенческими работами здесь

Получение html-версии электронного письма
Доброго времени суток :) Такая проблема, получаю в мемо текст последнего письма с почты по pop3...

Получение версии BIOS-а без использования WMI
Необходимо получить информацию из SMBIOS Structure Table Entry Point под названиями...

Получение DLL в Fortran, из более старой его версии
Добрый день, Знатоки! Вот пришлось столкнуться с таким языком, как Fortran. Ничего против него не...

Восстановление Windows на компьютере, на котором установлены две версии Windows 10
Добрый день есть такая проблема принесли комп На котором на одном разделе Win 10 Home На другом...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru