---- temporal's profile picture

Published by

published

Category: Technology

4--Win32



Mis palabras van a estar en subrayador para comentar porque no puedo romper el formato rápidamente, este blog ya tiene un formato y el html de friendwind no está organizado para tener una lectura rápida :v

Lo siento por la crítica 


Referencia: https://caiorss.github.io/C-Cpp-Notes/WindowsAPI-cpp.html#org8020fa6


Ahora sí que sí

1.8 SAL - Source Code Annotation Language

Annotation such as __In__ or __Out__ commonly found on Windows API documetation, as shown in the code below, is called SAL - Source Code Annotation language. In a C code, it is hard to figure out which parameters are used to return values or are read-only used only as input. The SAL solves this problem by declaring which function parameters are input, read-only and which parameters are output.

SAL is the Microsoft source code annotation language. By using source code annotations, you can make the intent behind your code explicit. These annotations also enable automated static analysis tools to analyze your code more accurately, with significantly fewer false positives and false negatives.

– http://msdn.microsoft.com/en-us/library/hh916383.aspx

<span class="org-type" style="color:rgb(18,255,237);">HANDLE</span> <span class="org-function-name" style="color:rgb(91,161,207);">CreateRemoteThreadEx</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span>
  __in__ <span class="org-type" style="color:rgb(18,255,237);">HANDLE</span>                       <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">hProcess</span>,
  __in__ <span class="org-type" style="color:rgb(18,255,237);">LPSECURITY_ATTRIBUTES</span>        <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">lpThreadAttributes</span>,
  __in__ <span class="org-type" style="color:rgb(18,255,237);">SIZE_T</span>                       <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">dwStackSize</span>,
  __in__ <span class="org-type" style="color:rgb(18,255,237);">LPTHREAD_START_ROUTINE</span>       <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">lpStartAddress</span>,
  __in__ <span class="org-type" style="color:rgb(18,255,237);">LPVOID</span>                       <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">lpParameter</span>,
  __in__ <span class="org-type" style="color:rgb(18,255,237);">DWORD</span>                        <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">dwCreationFlags</span>,
  __in__ <span class="org-type" style="color:rgb(18,255,237);">LPPROC_THREAD_ATTRIBUTE_LIST</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">lpAttributeList</span>,
  __out__ <span class="org-type" style="color:rgb(18,255,237);">LPDWORD</span>                     <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">lpThreadId</span>
<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>;

<span class="org-type" style="color:rgb(18,255,237);">DWORD</span> <span class="org-type" style="color:rgb(18,255,237);">WINAPI</span> <span class="org-function-name" style="color:rgb(91,161,207);">FormatMessage</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span>
   _In_     <span class="org-type" style="color:rgb(18,255,237);">DWORD</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">dwFlags</span>,
   _In_opt_ <span class="org-type" style="color:rgb(18,255,237);">LPCVOID</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">lpSource</span>,
   _In_     <span class="org-type" style="color:rgb(18,255,237);">DWORD</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">dwMessageId</span>,
   _In_     <span class="org-type" style="color:rgb(18,255,237);">DWORD</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">dwLanguageId</span>,
   _Out_    <span class="org-type" style="color:rgb(18,255,237);">LPTSTR</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">lpBuffer</span>,
   _In_     <span class="org-type" style="color:rgb(18,255,237);">DWORD</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">nSize</span>,
   _In_opt_ <span class="org-type" style="color:rgb(18,255,237);">va_list</span> *<span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">Arguments</span>
<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>;

To allow those annotations in the source code, it is necessary to add the header #include <sal.h>. This SAL annotation is not standard among C++ compilers and is not defined by any C or C++ standard, as a result, the annotations only works on MSVC - Microsoft Visual C++ Compiler. This feature can be implemented in a portable way with macros.

SAL Fundamentals:

SAL AnnotatioDescription
_In_Input parameter - read only argument no modified inside the by the function.
 Generally has the const qualifier such as const char*.
_In_Out_Optional input parameter, can be ignored by passing a null pointer.
  
_Out_Output paramenter - Argument is written by the called function. It is generally a pointer.
  
_Out_opt_Optional output parameter. Can be ignored by setting it to null pointer.
  
_Inout_Data is passed to the function and pontentially modified.
  
_Outptr_Output to caller. The value returned by written to the parameter is pointer.
  
_Outptr_opt_Optional output pointer to caller, can be ignored by passing NULL pointer.
  

Note: if the parameter is not annotated with _opt_ the caller is not supposed to pass a NULL pointer, otherwise the parameter must be annotated with _In_opt_, _Out_opt_ and etc.

Usage example:

  • This annotation enhances the readability by telling reader which parameters are input and which parameters are output or used for returning values.

File: sal1.cpp

Expand
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#include</span> <span class="org-string" style="color:#FFD700;"><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);"><</span></span><span class="org-string" style="color:#FFD700;">sal.h</span><span class="org-string" style="color:#FFD700;"><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">></span></span>     <span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">Microsft's Source Code Annotation Language </span>
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#include</span> <span class="org-string" style="color:#FFD700;"><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);"><</span></span><span class="org-string" style="color:#FFD700;">iostream</span><span class="org-string" style="color:#FFD700;"><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">></span></span>

<span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">Computes elementwise product of two vectors </span>
<span class="org-type" style="color:rgb(18,255,237);">void</span> <span class="org-function-name" style="color:rgb(91,161,207);">vector_element_product</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span>
      _In_ <span class="org-type" style="color:rgb(18,255,237);">size_t</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">size</span>,
      <span class="org-type" style="color:rgb(18,255,237);">_In_</span> <span class="org-keyword" style="color:#00FF00;font-weight:bold;">const</span> <span class="org-type" style="color:rgb(18,255,237);">double</span> xs<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">[]</span>,
      <span class="org-type" style="color:rgb(18,255,237);">_In_</span> <span class="org-keyword" style="color:#00FF00;font-weight:bold;">const</span> <span class="org-type" style="color:rgb(18,255,237);">double</span> ys<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">[]</span>,
      _Out_      <span class="org-type" style="color:rgb(18,255,237);">double</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">zs</span><span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">[]</span>
      <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">){</span>
      <span class="org-keyword" style="color:#00FF00;font-weight:bold;">for</span><span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">(</span><span class="org-type" style="color:rgb(18,255,237);">int</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">i</span> = 0; i < size; i++<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">){</span>
          zs<span class="org-rainbow-delimiters-depth-3" style="color:rgb(144,145,131);">[</span>i<span class="org-rainbow-delimiters-depth-3" style="color:rgb(144,145,131);">]</span> = xs<span class="org-rainbow-delimiters-depth-3" style="color:rgb(144,145,131);">[</span>i<span class="org-rainbow-delimiters-depth-3" style="color:rgb(144,145,131);">]</span> * ys<span class="org-rainbow-delimiters-depth-3" style="color:rgb(144,145,131);">[</span>i<span class="org-rainbow-delimiters-depth-3" style="color:rgb(144,145,131);">]</span>;
      <span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">}</span>
<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">}</span>

<span class="org-type" style="color:rgb(18,255,237);">void</span> <span class="org-function-name" style="color:rgb(91,161,207);">showArray</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span><span class="org-type" style="color:rgb(18,255,237);">size_t</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">size</span>, <span class="org-type" style="color:rgb(18,255,237);">double</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">xs</span><span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">[]</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">){</span>
  <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"("</span> << size << <span class="org-string" style="color:#FFD700;">")[ "</span>;
  <span class="org-keyword" style="color:#00FF00;font-weight:bold;">for</span><span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">(</span><span class="org-type" style="color:rgb(18,255,237);">int</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">i</span> = 0; i < size; i++<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">){</span>
    <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << xs<span class="org-rainbow-delimiters-depth-3" style="color:rgb(144,145,131);">[</span>i<span class="org-rainbow-delimiters-depth-3" style="color:rgb(144,145,131);">]</span> << <span class="org-string" style="color:#FFD700;">" "</span>;
  <span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">}</span>
  <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"] "</span>;
<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">}</span>

<span class="org-type" style="color:rgb(18,255,237);">int</span> <span class="org-function-name" style="color:rgb(91,161,207);">main</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(){</span>
  <span class="org-type" style="color:rgb(18,255,237);">double</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">xs</span> <span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">[]</span> = <span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">{</span>4, 5, 6, 10<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">}</span>;
  <span class="org-type" style="color:rgb(18,255,237);">double</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">ys</span> <span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">[]</span> = <span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">{</span>4, 10, 5, 25<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">}</span>;
  <span class="org-type" style="color:rgb(18,255,237);">double</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">zs</span> <span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">[</span>4<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">]</span>;
  vector_element_product<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">(</span>4, xs, ys, zs<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">)</span>;
  <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"xs = "</span>; showArray<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">(</span>4, xs<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">)</span>; <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"\n"</span>;
  <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"ys = "</span>; showArray<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">(</span>4, ys<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">)</span>; <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"\n"</span>;
  <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"zs = "</span>; showArray<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">(</span>4, zs<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">)</span>; <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"\n"</span>;

<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">}</span>

Compiling:

  • MSVC (CL.EXE):
$ cl.exe sal1.cpp /nologo /Fe:sal1-a.exe && sal1-a.exe
sal1.cpp
<span class="org-function-name" style="color:rgb(91,161,207);">C</span>:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\xlocale(313): warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
xs = (4)[ 4 5 6 10 ]
ys = (4)[ 4 10 5 25 ]
zs = (4)[ 16 50 30 250 ]
  • Mingw/G++
$ g++ sal1.cpp -o <span class="org-keyword" style="color:#00FF00;font-weight:bold;">sal1-b.exe</span> -std=c++11 && sal1-b.exe
xs = (4)[ 4 5 6 10 ]
ys = (4)[ 4 10 5 25 ]
zs = (4)[ 16 50 30 250 ]

Note: It doesn't work on Linux or other OSes. But it can be implemented with header files.

Open Source SAL Implementation:

  • Source-code annotation language (SAL) compatibility header - https://github.com/nemequ/salieri
    • "Salieri is a header which provides definitions for Microsoft's source-code annotation language (SAL). Simply drop the header into your code and use it instead of including <sal.h> directly, and you can use SAL annotations even if you want your program to be portable to compilers which don't support it."
    • "SAL provides lots of annotations you can use to describe the behavior of your program. There is a Best Practices and Examples (SAL) page on MSDN if you want to get a very quick idea of how it works, but the basic idea is that you end up with something like this:"

References:





  





1.9 Character Encoding in WinAPI - ANSI x utf8 x utf16 (wchar_t)

1.9.1 Overview

Unlike Linux, MacOSX and BSD where the API supports unicode UTF-8, the Windows API only supports ANSI enconding (char) and UTF16 or Unicode with 2 bytes per character wchar_t.

Macros and types for enconding portability

The following macros are widely used by Windows API for portability between ANSI and Unicode:

  • Strings:
    • <std::string> (UTF8 enconding) - Ordinary string (aka multi-byte string)
    • std::wstring (UTF-16 enconding) - Wide string - string defined as array of wide characters wchar_t.
  • TCHAR (Header: <tchar.h>) - When the UNICODE is defined TCHAR becomes wchar_t, otherwise, it becomes char.
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#ifdef</span> _UNICODE
  <span class="org-keyword" style="color:#00FF00;font-weight:bold;">typedef</span> <span class="org-type" style="color:rgb(18,255,237);">wchar_t</span> <span class="org-type" style="color:rgb(18,255,237);">TCHAR</span>;
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#else</span>
  <span class="org-keyword" style="color:#00FF00;font-weight:bold;">typedef</span> <span class="org-type" style="color:rgb(18,255,237);">char</span> <span class="org-type" style="color:rgb(18,255,237);">TCHAR</span>;
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#endif</span>
  • String Literal _T or TEXT macro.
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#ifdef</span> _UNICODE 
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">   #define</span> <span class="org-function-name" style="color:rgb(91,161,207);">_T</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span><span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">str</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>   L##str
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">   #define</span> <span class="org-function-name" style="color:rgb(91,161,207);">TEXT</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span><span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">c</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>   L##str
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#else</span> 
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">   #define</span> <span class="org-function-name" style="color:rgb(91,161,207);">_T</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span><span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">str</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>     str 
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">   #define</span> <span class="org-function-name" style="color:rgb(91,161,207);">TEXT</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span><span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">str</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>   str
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#endif</span>
  • Character array type definition:
TypeDefinition 
LPSTRchar* 
LPCSTRconst char* 
   
LPWSTRwchar_t* 
LPCWSTRconst wchar_t* 
   
LPTSTRTCHAR* 
LPCTSTRconst TCHAR* 
   

String Literals

  • Utf-8 string literal (narrow characters or multibyte string) - cannot be used with Windows APIs as they will interpret those string literals as ANSI, thus not all characters will be represented.
<span class="org-string" style="color:#FFD700;">"UTF8 - Unicode 8 bits multi-byte literal"</span>;
<span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">Note: It doesn't work with Windows APIs (Windows specific functions)</span>
<span class="org-type" style="color:rgb(18,255,237);">char</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">utf8_text</span> <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">[]</span> = <span class="org-string" style="color:#FFD700;">"Random text in Georgian script (UTF8): ნუსხური"</span>;
  • Utf-16 string literal (wide characters - wchar_t). Windows Unicode APIs or functions only works with wide characters (wchar_t).
L<span class="org-string" style="color:#FFD700;">"UTF16 Wchar wide chracters literal"</span>;
<span class="org-type" style="color:rgb(18,255,237);">wchar_t</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">utf16_text</span> <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">[]</span> = L<span class="org-string" style="color:#FFD700;">"Random text in Georgian script (UTF16): ნუსხური"</span>;
  • String prefixed with _T or TEXT. If Unicode is defined the string literal becomes an unicode UTF16 string literal and prefix 'L' is added to the string, otherwise nothing happens.
<span class="org-type" style="color:rgb(18,255,237);">TCHAR</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">text</span> <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">[]</span> = _T<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span><span class="org-string" style="color:#FFD700;">"Random text in Georgian script  ნუსხური"</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>;
<span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">OR </span>
<span class="org-type" style="color:rgb(18,255,237);">TCHAR</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">text</span> <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">[]</span> = TEXT<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span><span class="org-string" style="color:#FFD700;">"Random text in Georgian script  ნუსხური"</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>;

If UNICODE is not defined, it becomes:

<span class="org-type" style="color:rgb(18,255,237);">char</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">text</span> <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">[]</span> = <span class="org-string" style="color:#FFD700;">"Random text in Georgian script ნუსხური"</span>;

If Unicode is defined, it becomes:

<span class="org-type" style="color:rgb(18,255,237);">wchar_t</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">text</span> <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">[]</span> = L<span class="org-string" style="color:#FFD700;">"Random text in Georgian script ნუსხური"</span>;

Windows APIs - ANSI X Unicode version

Almost every function in Windows API such as CreateDirectory has an ANSI and Unicode UTF16 (with wide chars wchar_t) version. The ANSI version of CreateDirectory API is CreateDirectoryA (suffix A) and the unicode version is CreateDirectoryW. The API CreateDirectory is expanded to CreateDirectoryW if #define UNICODE preprocessor flag is not defined, otherwise it is expanded to CreateDirectoryA.

  • ANSI Version:
<span class="org-type" style="color:rgb(18,255,237);">BOOL</span> <span class="org-function-name" style="color:rgb(91,161,207);">CreateDirectoryA</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span>
  <span class="org-type" style="color:rgb(18,255,237);">LPCSTR</span> <span class="org-comment-delimiter" style="color:rgb(141,141,132);">/* </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">const char */</span>  <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">lpPathName</span>,
  <span class="org-type" style="color:rgb(18,255,237);">LPSECURITY_ATTRIBUTES</span>    <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">lpSecurityAttributes</span>
<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>;
  • Unicode Version:
<span class="org-type" style="color:rgb(18,255,237);">BOOL</span> <span class="org-function-name" style="color:rgb(91,161,207);">CreateDirectoryW</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span>
  <span class="org-type" style="color:rgb(18,255,237);">LPCWSTR</span> <span class="org-comment-delimiter" style="color:rgb(141,141,132);">/* </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">const wchar_t*  */</span>  <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">lpPathName</span>,   
  <span class="org-type" style="color:rgb(18,255,237);">LPSECURITY_ATTRIBUTES</span>          <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">lpSecurityAttributes</span>
<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>;

1.9.2 Unicode UTF8 X Wide Unicode C-strign functions

In C++, it is better and safer to use std::string (UTF8 string) or std::wstring (wchar_t) wide unicode string since they can be modified at runtime and can take care of memory allocation and deallocation. However, it is worth knowing the C-functions for the purposing of reading and understanding Windows API codes which are mostly written in C rather than C++.

The following C-functions are widely used on many C-codes for Windows and Unix-like operating systems. Nowadays, the APIs of most Unix-like operating systems uses unicode UTF8 (char) by default, while most low level Windows API only supports Wide unicode (wchar_t). Windows.

charwchar_t - Wide character 
UTF8UTF16 - Wide UnicodeDescription
strlenwcslenGet string length
strcmpwcscmpComparre string
strcpywcsncpyCopy N-characters from one string to another
strcatwcscatConcatenat string
   
strtodwcstodConvert wide string to double

Signature of Wide unicode functions:

  • Length of wide string
<span class="org-type" style="color:rgb(18,255,237);">size_t</span> <span class="org-function-name" style="color:rgb(91,161,207);">wcslen</span> <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span><span class="org-keyword" style="color:#00FF00;font-weight:bold;">const</span> <span class="org-type" style="color:rgb(18,255,237);">wchar_t</span>* <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">wcs</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>;
  • Copy wide string
<span class="org-type" style="color:rgb(18,255,237);">wchar_t</span>* <span class="org-function-name" style="color:rgb(91,161,207);">wcscpy</span> <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span><span class="org-type" style="color:rgb(18,255,237);">wchar_t</span>* <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">destination</span>, <span class="org-keyword" style="color:#00FF00;font-weight:bold;">const</span> <span class="org-type" style="color:rgb(18,255,237);">wchar_t</span>* <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">source</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>;
  • Concatenate wide string
<span class="org-type" style="color:rgb(18,255,237);">wchar_t</span>* <span class="org-function-name" style="color:rgb(91,161,207);">wcscat</span> <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span><span class="org-type" style="color:rgb(18,255,237);">wchar_t</span>* <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">destination</span>, <span class="org-keyword" style="color:#00FF00;font-weight:bold;">const</span> <span class="org-type" style="color:rgb(18,255,237);">wchar_t</span>* <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">source</span>

1.9.3 Example - ANSI X Unicode and Windows API

Compiling with GCC:

<span class="org-comment-delimiter" style="color:rgb(141,141,132);"># </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">Build </span>
$ g++ winapi-encoding1.cpp -o <span class="org-keyword" style="color:#00FF00;font-weight:bold;">out-gcc.exe</span> -std=c++14  
<span class="org-comment-delimiter" style="color:rgb(141,141,132);"># </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">Compile </span>
$ out-gcc.exe 

Compiling with MSVC:

  • Note: If there is any unicode literal in the source, such as some text in Chinese or Hidi script, it is necessary to compile with the options (/source-charset:utf-8 /execution-charset:utf-8), otherwise the
<span class="org-comment-delimiter" style="color:rgb(141,141,132);"># </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">Build </span>
$ cl.exe winapi-encoding1.cpp user32.lib /EHsc /Zi /nologo /source-charset:utf-8 /execution-charset:utf-8 <span class="org-sh-escaped-newline">\</span>
   /Fe:out-msvc.exe 
<span class="org-comment-delimiter" style="color:rgb(141,141,132);"># </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">Run </span>
$ out-msvc.exe 

Headers:

  • To enable the expansion to unicode versions of WinAPIs, the flags UNICODE and _UNICODE must be enabled. For instance, if those flags are enabled CreateDirectory is expanded to CreateDirectoryW and TCHAR is expanded to wchar_t. Otherwise, CreateDirectory is expanded to CreateDirectoryA and TCHAR to char.
  • Note: The unicode flags must be defined before any windows specific header such as <windows.h> or <tchar.h>.
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#include</span> <span class="org-string" style="color:#FFD700;"><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);"><</span></span><span class="org-string" style="color:#FFD700;">fstream</span><span class="org-string" style="color:#FFD700;"><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">></span></span> 
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#include</span> <span class="org-string" style="color:#FFD700;"><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);"><</span></span><span class="org-string" style="color:#FFD700;">string</span><span class="org-string" style="color:#FFD700;"><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">></span></span>
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#include</span> <span class="org-string" style="color:#FFD700;"><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);"><</span></span><span class="org-string" style="color:#FFD700;">sstream</span><span class="org-string" style="color:#FFD700;"><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">></span></span>

<span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">Enable Unicode version of Windows API compile with -DWITH_UNICODE </span>
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#ifdef</span> WITH_UNICODE
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">  #define</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">UNICODE</span>
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">  #define</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">_UNICODE</span>
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#endif</span> 

<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#include</span> <span class="org-string" style="color:#FFD700;"><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);"><</span></span><span class="org-string" style="color:#FFD700;">windows.h</span><span class="org-string" style="color:#FFD700;"><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">></span></span>
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">#include</span> <span class="org-string" style="color:#FFD700;"><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);"><</span></span><span class="org-string" style="color:#FFD700;">tchar.h</span><span class="org-string" style="color:#FFD700;"><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">></span></span>

Experiment 1 - Print to console:

<span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">===========> EXPERIMENT 1 - Print to Console ============//  </span>
<span class="org-function-name" style="color:rgb(91,161,207);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"\n ===>>> EXPERIMENT 1: Print to terminal [ANSI/UTF8] <<<=== "</span> << <span class="org-constant" style="color:rgb(37,204,122);">std</span>::endl;
<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">{</span>
   <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout  <<  <span class="org-string" style="color:#FFD700;">" [COUT] Some text example - указан - 读写汉字1 "</span> << <span class="org-string" style="color:#FFD700;">"\n"</span>;
   <span class="org-constant" style="color:rgb(37,204,122);">std</span>::wcout << L<span class="org-string" style="color:#FFD700;">" [WCOUT] Some text example - указан - 读写汉字1 "</span> << L<span class="org-string" style="color:#FFD700;">"\n"</span>;  
<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">}</span>

Output:

  • This piece of code fails because the Windows' console (cmd.exe) cannot print unicode text by default. It needs to be configured before printing unicode, otherwise it will print garbage.
===>>> EXPERIMENT 1: Print to terminal [ANSI/UTF8] <<<
[COUT] Some text example - указан - 读写汉字
[WCOUT] Some text example -

Experiment 2 - Print to File

<span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">===========> EXPERIMENT 2 - Print to File ============//</span>
<span class="org-function-name" style="color:rgb(91,161,207);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"\n ===>>> EXPERIMENT 2: Write non ANSI Chars to File <<<=== "</span> << <span class="org-string" style="color:#FFD700;">"\n"</span>;
<span class="org-function-name" style="color:rgb(91,161,207);">std</span>::stringstream ss;
ss << <span class="org-string" style="color:#FFD700;">" Text in Cyrllic Script: Если указан параметр  "</span> << <span class="org-string" style="color:#FFD700;">"\n"</span>
   << <span class="org-string" style="color:#FFD700;">" Text in Chinese Script: 读写汉字1 "</span> << <span class="org-string" style="color:#FFD700;">"\n"</span>
   << <span class="org-string" style="color:#FFD700;">"\n"</span>;

<span class="org-keyword" style="color:#00FF00;font-weight:bold;">auto</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">dfile</span> = <span class="org-constant" style="color:rgb(37,204,122);">std</span>::ofstream<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span><span class="org-string" style="color:#FFD700;">"logging.txt"</span><span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>;
dfile << ss.str<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">()</span> << <span class="org-constant" style="color:rgb(37,204,122);">std</span>::flush;

VALE

Esto es lo importante

std::cout simplemente es escribir definición


Std::stringstream ss; es lo que no me ha quedado claro que es exactamente 

Vale, lo acabo de ver, es un cout pero en vez d econsola en memoria, almacena texto temporalmente 



CHATGPT:


Vamos a separar esa instrucción en dos partes, porque aquí aparecen dos conceptos importantes de C++: auto y std::ofstream.

1. auto dfile = std::ofstream("logging.txt");

Primero:

std::ofstream("logging.txt");

std::ofstream es una clase de la biblioteca estándar de C++ que permite escribir datos en archivos.

Al proporcionarle "logging.txt", estás creando un flujo de salida asociado a ese archivo.

Ahora bien:

auto dfile = ...
  • auto le indica al compilador que deduzca automáticamente el tipo de la variable.

  • dfile es el nombre de la variable.

  • std::ofstream("logging.txt") es el objeto que estás creando.

En este caso, el compilador deduce que dfile es de tipo std::ofstream.

Es equivalente a escribir:

std::ofstream dfile("logging.txt");

Por tanto, auto no es obligatorio. Simplemente evita que tengas que escribir el tipo explícitamente.

2. dfile << ss.str() << std::flush;

Ahora utilizas el objeto que acabas de crear.

dfile << ss.str() << std::flush;

Vamos por partes:

Elemento

Significado

dfile

El flujo asociado al archivo.

<<

Operador de inserción: envía datos al flujo.

ss.str()

Recupera el contenido del stringstream como std::string.

std::flush

Fuerza el vaciado del búfer de salida.

Es decir, estás enviando el contenido de ss al archivo logging.txt.

¿Qué es exactamente std::flush?

Cuando escribes en un archivo, C++ puede almacenar temporalmente los datos en un búfer antes de enviarlos al sistema operativo.

std::flush solicita que ese búfer se vacíe inmediatamente.

No significa que cierre el archivo. Para eso existe close().

3. Todo junto, sin auto

Tu código podría escribirse así:

std::ofstream dfile("logging.txt");

dfile << ss.str() << std::flush;

dfile.close();

Aquí he añadido close() para mostrarte cómo cerrar explícitamente el archivo. En realidad, no es necesario en este ejemplo: el destructor de std::ofstream lo cierra automáticamente cuando dfile sale de su ámbito.

Qué debes aprender de este experimento:

  • std::ofstream: permite escribir en archivos.

  • auto: deduce automáticamente el tipo de una variable.

  • std::flush: vacía el búfer de salida.

  • close(): cierra el flujo asociado al archivo.

Y una particularidad: si logging.txt ya existía, abrirlo de esta manera normalmente sobrescribe su contenido.




Output: file - loggin.txt

  • By opening the file logging.txt with notepad.exe, it is possible view all characters as show in the following block.
Text in Cyrllic Script: Если указан параметр  
Text in Chinese Script: 读写汉字1 

Experiment 3 - WinAPI - CreateDirectory

This code experiment attempts to create 3 directories:

  • Directory: directoryANSI-读写汉字1 with CreateDirectoryA function (ANSI version of the underlying API)
  • Directory: directoryWCHAR-读写汉字 with CreateDirectoryW (Unicode version of the API).
  • Directory: directoryTCHAR-读写汉字 with CreateDirectory macro which is expanded to CreateDirectoryW when UNICODE is defined, othewise it is expanded to CreateDirectoryA.


Experimento 3 - WinAPI - CreateDirectory

Este experimento de código intenta crear 3 directorios:

  • Directorio: directoryANSI-读写汉字1, utilizando la función CreateDirectoryA (versión ANSI de la API subyacente).

  • Directorio: directoryWCHAR-读写汉字, utilizando CreateDirectoryW (versión Unicode de la API).

  • Directorio: directoryTCHAR-读写汉字, utilizando la macro CreateDirectory, que se expande a CreateDirectoryW cuando UNICODE está definido; de lo contrario, se expande a CreateDirectoryA.

   <span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">===========> EXPERIMENT 4 - WinAPI - CreateDirectory ============//</span>
   <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"\n ===>>> EXPERIMENT 3: WinAPI CreateDirectory <<<=== "</span> << <span class="org-constant" style="color:rgb(37,204,122);">std</span>::endl;

   <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">{</span> <span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">-- ANSI Version of CreateDirectory API </span>
       <span class="org-type" style="color:rgb(18,255,237);">bool</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">res</span>;
       res = CreateDirectoryA<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">(</span><span class="org-string" style="color:#FFD700;">"directoryANSI-读写汉字1"</span>, <span class="org-constant" style="color:rgb(37,204,122);">NULL</span><span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">)</span>;
       <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"Successful 1 ?=  "</span> << <span class="org-constant" style="color:rgb(37,204,122);">std</span>::boolalpha << res << <span class="org-constant" style="color:rgb(37,204,122);">std</span>::endl;
   <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">}</span>

   <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">{</span>  <span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">-- Unicode (UTF16) - Wide character version of CreateDirectory API </span>
       <span class="org-type" style="color:rgb(18,255,237);">bool</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">res</span>;
       res = CreateDirectoryW<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">(</span>L<span class="org-string" style="color:#FFD700;">"directoryWCHAR-读写汉字"</span>, <span class="org-constant" style="color:rgb(37,204,122);">NULL</span><span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">)</span>;
       <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"Successful 2 ?= "</span> << <span class="org-constant" style="color:rgb(37,204,122);">std</span>::boolalpha << res << <span class="org-constant" style="color:rgb(37,204,122);">std</span>::endl;       
   <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">}</span>
   <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">{</span>
      <span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">-- TCHAR Version Wide character version of CreateDirectory API </span>
      <span class="org-type" style="color:rgb(18,255,237);">bool</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">res</span>;

<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">      #ifdef</span> UNICODE
        <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << <span class="org-string" style="color:#FFD700;">" [INFO] UNICODE (UTF16) CreateDirectory expanded to CreateDirectoryW"</span> << <span class="org-constant" style="color:rgb(37,204,122);">std</span>::endl;
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">      #else</span>
        <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << <span class="org-string" style="color:#FFD700;">" [INFO] ANSI CreateDirectory expanded to CreateDirectoryA"</span> << <span class="org-constant" style="color:rgb(37,204,122);">std</span>::endl;
<span class="org-preprocessor" style="color:rgb(128,128,128);font-weight:bold;">      #endif</span>
      res = CreateDirectory<span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">(</span>_T<span class="org-rainbow-delimiters-depth-3" style="color:rgb(144,145,131);">(</span><span class="org-string" style="color:#FFD700;">"directoryTCHAR-读写汉字"</span><span class="org-rainbow-delimiters-depth-3" style="color:rgb(144,145,131);">)</span>, <span class="org-constant" style="color:rgb(37,204,122);">NULL</span><span class="org-rainbow-delimiters-depth-2" style="color:rgb(115,136,214);">)</span>;
      <span class="org-constant" style="color:rgb(37,204,122);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"Successful 3 ?= "</span> << <span class="org-constant" style="color:rgb(37,204,122);">std</span>::boolalpha << res << <span class="org-constant" style="color:rgb(37,204,122);">std</span>::endl;        
<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">}</span>

Output when compiling without -DWITH_UNICODE:

 $ g++ winapi-encoding1.cpp -o <span class="org-keyword" style="color:#00FF00;font-weight:bold;">out-gcc.exe</span> -std=c++14  && out-gcc.exe 

 ... ....  ... 
 ===>>> EXPERIMENT 3: WinAPI CreateDirectory <<<=== 
Successful 1 ?=  true
Successful 2 ?= true
 [INFO] ANSI CreateDirectory expanded to CreateDirectoryA
Successful 3 ?= true
 ... ....  ... 

Directories created:

  • [FAILED] directoryANSI-读写汉字1
  • [SUCCESS] directoryWCHAR-读写汉字
    • Only the Unicode (CreateDirectoryW) function works, the ANSI function CreateDirectoryA fails even if the string is encoded with UTF-8.
  • [FAILED] directoryTCHAR-读写汉字
    • Without UNICODE flag, CreateDirectory expands to CreateDirectoryA.

Output when compiling without -DWITH_UNICODE:

 $ g++ winapi-encoding1.cpp -o <span class="org-keyword" style="color:#00FF00;font-weight:bold;">out-gcc.exe</span> -std=c++14 -DWITH_UNICODE  && out-gcc.exe 

    ... .... ... ... ...   
 ===>>> EXPERIMENT 3: WinAPI CreateDirectory <<<=== 
Successful 1 ?=  true
Successful 2 ?= true
 [INFO] UNICODE (UTF16) CreateDirectory expanded to CreateDirectoryW
Successful 3 ?= true
    ... .... ... ... ...   

Directories created:

  • [FAILED] directoryANSI-读写汉字1
  • [SUCCESS] directoryWCHAR-读写汉字
  • [SUCCESS] directoryTCHAR-读写汉字

Experiment 4 - WinAPI MessageBox function.

<span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">===========> EXPERIMENT 4 - WinAPI - MessageBox ============//</span>
<span class="org-function-name" style="color:rgb(91,161,207);">std</span>::cout << <span class="org-string" style="color:#FFD700;">"\n ===>>> EXPERIMENT 4: MessageBox <<<=== "</span> << <span class="org-constant" style="color:rgb(37,204,122);">std</span>::endl;

<span class="org-type" style="color:rgb(18,255,237);">DWORD</span> <span class="org-keyword" style="color:#00FF00;font-weight:bold;">const</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">infoboxOptions</span>  = MB_OK | MB_ICONINFORMATION | MB_SETFOREGROUND;
<span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">Text in UTF8 => Note => Windows API doesn't work with UTF8</span>
<span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">or multi-byte characters as the API treats the chars as they were ANSI.</span>
<span class="org-type" style="color:rgb(18,255,237);">char</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">narrowText</span> <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">[]</span>  = <span class="org-string" style="color:#FFD700;">"한국어 (Korean) / 读写汉字 - 学中文 (Chinese)"</span>;
<span class="org-comment-delimiter" style="color:rgb(141,141,132);">// </span><span class="org-comment" style="color:#90EE90;font-style:italic;font-weight:bolder;">Unicode text in UTF16 </span>
<span class="org-type" style="color:rgb(18,255,237);">wchar_t</span> <span class="org-variable-name" style="color:#00BFFF;font-weight:bolder;">wideText</span> <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">[]</span>  = L<span class="org-string" style="color:#FFD700;">"한국어 (Korean) /  读写汉字 - 学中文 (Chinese)"</span>;
MessageBoxA<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span> 0, narrowText, <span class="org-string" style="color:#FFD700;">"ANSI (narrow) text:"</span>, infoboxOptions <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>;    
MessageBoxW<span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">(</span> 0, wideText, L<span class="org-string" style="color:#FFD700;">"Unicode (wide) text:"</span>, infoboxOptions <span class="org-rainbow-delimiters-depth-1" style="color:rgb(112,113,131);">)</span>;

Output of MessageBoxA (failure, it cannot deal with unicode UTF-8 chars):

messagebox-ansi1.png

Output of MessageBoxW (success):

messagebox-unicode1.png

No entiendo cómo es que se supone que define el idioma

Estoy leyendo

Se entiende hasta el momento en el que hace el ifdef, else endif :v, me falta mejorar ahora mismo mis fundamentos, pero está bien saberlo 













Es muy difícil compilar este código directamente y algo me está fallando 












Kudos: 0

Comments