После того, как Microsoft добавила поддержку Unicode как часть Windows, ей по-прежнему необходимо было поддерживать использование строк ANSI. Microsoft решила сделать это, предоставив два набора API (один для ANSI, а второй для Unicode. Важно знать, что ANSI-версия API преобразует строки в Unicode перед вызовом соответствующих системных вызовов (ядро только Юникод).

Например, чтобы создать новый процесс, мы можем использовать «CreateProcessA» или «CreateProcessW» (A для строк ANSI и W для широких символов, также известных как Unicode). Возможно, вы помните, что вызывали CreateProcess и ничего из вышеперечисленного — так как же это работало? Хитрость заключается в использовании макросов. Вы вызвали макрос, который проверял, был ли определен UNICODE. Если он был определен, он вызывал функцию, оканчивающуюся на «W», в противном случае он вызывал функцию, оканчивающуюся на «A» — см. иллюстрацию ниже для всего потока.

Кстати, в документации (вроде MSDN) имена функций без суффикса («A» или «W») несмотря на то, что это имя макроса, а не самих функций. После компиляции исполняемый файл содержит ссылку/зависимость на конкретную функцию (вы можете увидеть это на диаграмме ниже — я извлек строки из разных DLL с указанием имен символов).

До встречи в следующей записи.

Вы можете следить за мной в твиттере — @bountaru (https://twitter.com/boutnaru)