Просто напишите
Res := MAPIResolveName(Session, Application.Handle,
PChar(ADestinataire), MAPI_LOGON_UI, 0, PRecip);
Если у вас есть string
, то есть строка Unicode, то есть указатель на последовательность символов Unicode, вы не должны приводить ее к PAnsiChar
. PAnsiChar
- указатель на последовательность символов, отличных от Юникода. Действительно, приведение к типу PSomethingChar
просто указывает компилятору интерпретировать вещь внутри преобразования как указатель указанного типа. Это не делает никакого преобразования. Итак, в основном, сейчас вы лжете компилятору: у вас есть строка Unicode и выдает команду компилятору интерпретировать ее как строку ANSI (не-Unicode). Это плохо.
Вместо этого вы должны привести его к PWideChar
, указателю на последовательность символов Юникода. В Delphi 2009+ PChar
эквивалентно PWideChar
.
Конечно, если вы отправляете указатель на последовательность символов Unicode для функции, то функции лучше ожидать символы Unicode, но я не уверен, что это случай функции MAPIResolveName
. Я подозреваю, что это на самом деле требует ANSI (то есть, не Unicode) символов. В этом случае вам необходимо преобразовать строку Unicode в строку ANSI (не Unicode). Это легко, просто напишите AnsiString(ADestinataire)
. Затем вы применяете ANSI (не в Юникоде) PAnsiChar
:
Res := MAPIResolveName(Session, Application.Handle,
PANsiChar(AnsiString(ADestinataire)), MAPI_LOGON_UI, 0, PRecip);