В реализации это выглядит так: для функции доступной через API может существовать две версии: Ansi (принимает строки ANSI) и Wide (принимает строки Unicode) - например CreateProcessA и CreateProcessW. И Ansi-версия является оболочкой (шлюзом) к Wide.
Но оказывается есть и исключения...
Таким исключением является функция OutputDebugString. Для нее Wide-версия - это оболочка над Ansi. И при вызове OutputDebugStringW переданная строка преобразуется в ANSI-строку и передается OutputDebugStringA.
Псевдокод OutputDebugStringW (Delphi)
procedure OutputDebugStringW(const lpOutputString: PWideChar); stdcall; var UnicodeString: UNICODE_STRING; AnsiString: ANSI_STRING; Status: NTSTATUS; begin RtlInitUnicodeString(@UnicodeString, lpOutputString); Status := RtlUnicodeStringToAnsiString(@AnsiString, @UnicodeString, True); if not NT_SUCCESS(Status) then AnsiString.Buffer := ''; OutputDebugStringA(AnsiString.Buffer); if NT_SUCCESS(Status) then RtlFreeAnsiString(@AnsiString); end;Так что, если есть желание избежать лишней траты времени и
Ссылки
[1] Understanding Win32 "OutputDebugString"
Комментариев нет:
Отправить комментарий