В Delphi 2009 и более поздних версиях (P)Char
является псевдонимом для (P)WideChar
, тогда как в более ранних версиях это был псевдоним для (P)AnsiChar
. Вот почему вы получаете ошибку компилятора.
Третий параметр MultiByteToWideChar()
ожидает PAnsiChar
во всех версиях Delphi. Так что просто замените PChar
на PAnsiChar
. Что будет работать нормально, учитывая, что StrA
это AnsiString
, а не String
(который является псевдонимом для UnicodeString
в D2009 +), поэтому они будут совпадать.
При этом вы должны использовать константу CP_ACP
вместо функции GetACP()
, удалить избыточное присвоение (и преобразование) Result
перед вызовом MultiByteToWideChar()
, удалить ненужную индексацию символов и удалить ненужную обработку нулевого терминатора:
function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): WideString;
var
nLen: integer;
begin
Result := '';
nLen := MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PAnsiChar(StrA), Length(StrA), nil, 0);
if nLen > 0 then
begin
SetLength(Result, nLen);
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PAnsiChar(StrA), Length(StrA), PWideChar(Result), nLen);
end;
end;
С учетом сказанного, не используйте WideString
в D2009 + для работы без ActiveX. UnicodeString
эффективнее.
function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): UnicodeString;
Наконец, поскольку вы устанавливаете CodePage
на ACP и параметр dwFlags
на MB_PRECOMPOSED
(что является значением по умолчанию, если не указаны другие флаги), вы можете просто исключить весь этот код и позволить RTL обрабатывать преобразование за вас, поскольку он использует те те же внутренние настройки по умолчанию:
function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): WideString;
begin
Result := WideString(StrA);
end;
Or:
function TFKirimEmail.ChAnsiToWide(const StrA: RawByteString): UnicodeString;
begin
Result := UnicodeString(StrA);
end;
В этом случае ваша ChAnsiToWide()
функция становится избыточной и может быть полностью исключена.
29.06.2014