C++ #define UNICODE

233
30 ноября 2018, 20:40

Код:

#ifndef UNICODE
#define UNICODE
#endif 
#include <windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
 switch(uMsg) {
  case WM_DESTROY:
   PostQuitMessage(0);
   return 0;
  case WM_PAINT: {
   PAINTSTRUCT ps;
   HDC hdc = BeginPaint(hwnd, &ps);
   FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
   EndPaint(hwnd, &ps);
   return 0;
  }
 }
 return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) {
 // Register the window class.
 const wchar_t CLASS_NAME[] = L"Sample Window Class";
 WNDCLASS wc = {};
 wc.lpfnWndProc = WindowProc;
 wc.hInstance = hInstance;
 wc.lpszClassName = CLASS_NAME;
 RegisterClass(&wc);
 // Create the window.
 HWND hwnd = CreateWindowEx(
  0,                              // Optional window styles.
  CLASS_NAME,                     // Window class
  L"Learn to Program Windows",    // Window text
  WS_OVERLAPPEDWINDOW,            // Window style
                                // Size and position
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  NULL,       // Parent window    
  NULL,       // Menu
  hInstance,  // Instance handle
  NULL        // Additional application data
 );
 if(hwnd == NULL) {
  return 0;
 }
 ShowWindow(hwnd, nCmdShow);
 // Run the message loop.
 MSG msg = {};
 while (GetMessage(&msg, NULL, 0, 0)) {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 return 0;
}

Вопросы:

  1. Что делают препроцессорные директивы?
  2. Что делает L перед string? (L"Sample Window Class";)
  3. Можно ли без препроцессорных директив?
Answer 1

Большинство функций WinAPI существуют в двух вариантах: ANSI (использующие текущую кодовую страницу системы) и Unicode. Эти варианты называются наборами символов (character sets). Если открыть заголовочные файлы Windows SDK, можно увидеть, что функции в них объявлены так:

#ifdef UNICODE
#define CreateFile  CreateFileW
#else
#define CreateFile  CreateFileA
#endif // !UNICODE

Использование символа препроцессора UNICODE позволяет писать код, не привязываясь к определенному набору символов: добавляя или убирая его определение, можно легко переключиться с одного на другой. Эта функциональность была полезна во времена, когда нужно было собирать приложения как под Windows 9x, не поддерживающую Unicode, так и под Windows XP. Определить символ препроцессора можно не только из кода, но и параметром компилятора (например, ключ /D в Visual C++), что позволяло иметь одинаковый код проекта и собирать его в студии разными конфигурациями под разные ОС.

Кроме того, в Visual C++ есть заголовочный файл tchar.h, который использует похожий механизм для функций стандартной библиотеки, но он использует другой символ препроцессора - _UNICODE.

READ ALSO
Есть ли android x зависимость для navigation?

Есть ли android x зависимость для navigation?

Вот решил попробовать поработать с Navigation Architecture component

160
Запись файлов, производительность

Запись файлов, производительность

При параллельной многопоточности, с точки зрения производительности, важен ли порядок следования записей в выходных файлах?

178
Поменять логин на имя Chat App

Поменять логин на имя Chat App

Я создал приложение-мессенджер на FirebaseПо принципу одного общего чата

182
как получить файл из network, используя java+selenium+webdriver

как получить файл из network, используя java+selenium+webdriver

Нужно получить файл из network, во вкладке HeadersИз localStorage получаю значение переменной как-то так:

196