Jump to content
IzzyForum
Sign in to follow this  
Енотыч

Кирилица в С/С++

Recommended Posts

Первое с чем придется столкнутся начинающему русскоязычному программисту - это конечно поддержка кириллицы и других языков, в том числе китайских и любых других. Почему это по моему мнению невероятно важно: потому что имена папок пользователя обычно называются по имени пользователя ОС (C:\Uses\USERNAME\), а в них хранится множество данных которые могут быть необходимы, имена папок могут быть китайскими, могут быть и русскими, а могут состоять из карточных мастей (лично я встречал пару-тройку таких ауешников) и если мы все сделаем неправильно - для латиницы, то у нас будет не очень хорошая программа. Мы же международные хацкеры, верно?

Цитата

#include "windows.h"


int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{
  wchar_t username[_MAX_PATH + 1];
  DWORD username_len = _MAX_PATH + 1;
  GetUserNameW(username, &username_len);
  MessageBoxW(NULL, username, L"Здарова!", MB_OK);
}

Шо у нас тут такое? Это сразу оговорюсь С/C++, нам пригодится для того что бы понять что будем делать дальше. Тут простой пример программы, которая у нас получает имя пользователя и выводит его на экран в окошке. Компилировать можно и в Visual Studio и в GCC. Вообщем разберетесь как поймете что тут творится, а пользоваться мы будем стандратной библиотекой Винды. И использовать стандратные WinApi функции. Такие как - GetUserNameW() и MessageBoxW(); Так по порядку теперь -  что у нас в каждой строчке?

 

Подключение заголовков

Цитата

#include "windows.h"

Тут мы подключаем заголовочный файл с импортом функций WinApi - GetUserNameW() и MessageBoxW(), на самом деле они там не находятся, а просто описываются и импортируются из библиотек advapi32.dll и user32.dll - соответсвенно. А находятся эти библиотеки в папке - C:\Windows\System32\
Что из этого следует - а то что другие программисты за нас уже потрудились и написали все основные функции, которые нам понадобятся для успешного ленивого программирования. И их множество, и их всех можно изучить и использовать.

 

Главная функция

Цитата

 

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{

  // код туточки

}

 

Далее у нас идет ГЛАВНАЯ ФУНКЦИЯ. Она в большинстве примеров в интернетах ваших показана в другом варианте int main () { // четатам } - этот вариант консольный он нам не нужен абсолютно. Почему? А мы будем делать оконную программу. И не будем печатать ничего в консоль, потому что "Молчание - Золото". Наша программа будет невидима, до того момента, до которого мы захотим...

 

Переменные

 

Цитата

 

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{

  wchar_t username[_MAX_PATH + 1];

}

 

тут мы создаем первую переменную со смыслом. переменная будет называться - "username", а так же содержать в себе символы WCHAR - те длинные буковки, которые будут на столько длинными что уместят в себя китайские иероглифы. в противоположность им есть обычные CHAR, на которых написано множество исходников англ программ, и вы можете путаться и бомбить сракотан из за проблем с ними. Берегу Ваш бесценный сракотан сейчас... Так продолжим. Те - мы содаем переменную - так:
ТИППЕРЕМЕННОЙ ИМЯПЕРЕМЕННОЙ

wchar_t  USERNAME

Далее у нас идет размер [_MAX_PATH + 1] переменной который мы хотим зарезервировать для нее в оперативной памяти. Сделаем его достаточно большим, что бы поместилась какая угодно билеберда (напоминаю про ауе-юзеров)

 

Функции

Теперь нужно записать что то в эту переменную, например имя пользователя? Для этого и пригодится нам функция GetUserNameW(), Ей нужно по документации передать два параметра. Первый параметр - это наша переменная, которая будет заполнятся именем пользователя, а вторая это так же предполагаемый размер имени пользователя. Странная хуйня, ну да ладно. Не я писал эти библиотеки.

Цитата

 

#include "windows.h"


int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{
  wchar_t username[_MAX_PATH + 1];
  DWORD username_len = _MAX_PATH + 1;
  GetUserNameW(username, &username_len);

}

 

В итоге мы имеем действие в результате которого в пустую переменную - username - запишется имя нашего пользователя. Верно? ДА! Как проверить? Для этого есть другая функция - которая создаст окошко в котором будет написано имя нашего пользователя -  MessageBoxW()
Разберемся и в этой функции :

MessageBoxW(NULL, username, L"Здарова!", MB_OK);

MessageBoxW - это имя функции.
NULL - это первый параметр, который равен - ничему, нулю, 0 - ну вы поняли
L"Здарова!" - это текст по-русски - приставка L очень важна  почему важна? она сообщает что это русский текст в WCHAR. если ее убрать - будет белиберда. я потом покажу. это так же заголовок самого окошка...
MB_OK - это у нас кнопочка окей - тип окна...
Итак и самое гланое - username это текст который у нас будет выводится внутри окна!

Компилируем имеем - профит. Всплывающее окошко с именем пользователя.
 

  • Like 1

Share this post


Link to post
Share on other sites

Но ведь не кросплатформерно же, есть же сверхразумы, сидящие на гну/торвальдс и использующие там русские буковы.

Share this post


Link to post
Share on other sites
On 3/11/2019 at 1:40 AM, CuteCelery said:

Но ведь не кросплатформерно же, есть же сверхразумы, сидящие на гну/торвальдс и использующие там русские буковы.

опять адепты со своей кроссплатформенностью... тьфу на тебя, алексей навальный CuteCelery!

Share this post


Link to post
Share on other sites

А вообще, тов. Енотыч получает ШПАЛУ за:

wchar_t username[_MAX_PATH + 1]

потомучто это потанцевальная потеря информации - фу таким быть! Уволю!

GetUserName() надо вызвать дважды, в первый раз она вернёт размер буфера, что ей трЭба, тебе надо выделить эту память и вызвать функцию повторно. Только так. А то ай ай ай за такие практики.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×