Delphi Embarcadero XE:使用String和PAnsiChar进行大量警告

Oli*_*ons 1 delphi string compiler-warnings delphi-xe

我正在尝试从Delphi 2007迁移到Embarcadero RAD Studio XE.我收到了很多警告.它们都看起来像这样:我有一个程序,我声明一个"字符串":

procedure SendMail( ADestinataire,ASubject : String);
Run Code Online (Sandbox Code Playgroud)

我正在尝试将Windows API称为:

  Res := MAPIResolveName(Session, Application.Handle,
    PAnsiChar(ADestinataire), MAPI_LOGON_UI, 0, PRecip);
Run Code Online (Sandbox Code Playgroud)

所以警告是:

W1044:将字符串转换为PAnsiChar可疑.

我做错了什么/我该怎么纠正这个(350警告......)?

非常感谢你

klu*_*udg 8

MAPIResolveName使用LPSTR参数,即Delphi中的PAnsiChar.简单MAPI不支持UTF16字符串(虽然它可以与UTF8字符串一起使用),因此如果你遵守简单的MAPI,你应该使用AnsiStrings,例如

procedure SendMail( ADestinataire,ASubject : AnsiString);
Run Code Online (Sandbox Code Playgroud)

或者更好,你可以使用

procedure SendMail( ADestinataire,ASubject : String);
Run Code Online (Sandbox Code Playgroud)

并在调用MAPIResolveName之前显式地将字符串参数转换为AnsiStrings


更新现在不推荐使用 整个简单MAPI ; 简单MAPI可以与UTF8字符串一起使用,但它需要在代码和注册表中进行一些更改.

因此,如果问题是关于快速将旧的ANSI简单MAPI移植到Unicode Delphi,最好是遵守AnsiStrings.

一种更可靠的方法是完全放弃简单MAPI并使用扩展MAPI.