В реализации это выглядит так: для функции доступной через 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"

Комментариев нет:
Отправить комментарий