string - Delphi Embarcadero XE:使用String和PAnsiChar发出大量警告

标签 string delphi compiler-warnings delphi-xe

我正在尝试从Delphi 2007迁移到Embarcadero RAD Studio XE。
我收到大量警告。
它们都看起来像这样:我有一个声明“字符串”的过程:

procedure SendMail( ADestinataire,ASubject : String);


我试图像这样调用Windows API:

  Res := MAPIResolveName(Session, Application.Handle,
    PAnsiChar(ADestinataire), MAPI_LOGON_UI, 0, PRecip);


因此,警告是:


W1044:将字符串转换为PAnsiChar可疑对象。


我在做什么错/应该如何纠正(350条警告...)?

非常感谢你

最佳答案

MAPIResolveName使用LPSTR参数,在Delphi中为PAnsiChar。简单MAPI不支持UTF16字符串(尽管可以与UTF8字符串一起使用),因此,如果坚持使用简单MAPI,则应使用AnsiStrings,例如

procedure SendMail( ADestinataire,ASubject : AnsiString);


或者更好的可以使用

procedure SendMail( ADestinataire,ASubject : String);


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



更新资料
整个Simple MAPI现在已弃用;简单的MAPI可以与UTF8字符串一起使用,但是需要对code and registry进行一些更改。

因此,如果问题在于将旧的ANSI Simple MAPI快速移植到Unicode Delphi,最好是坚持使用AnsiStrings。

一种更可靠的方法是完全放弃简单MAPI,而使用Extended MAPI

关于string - Delphi Embarcadero XE:使用String和PAnsiChar发出大量警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6215170/

相关文章:

ios - 在 swift 中检查空值(不是 nil 或 NSnull)总是返回 nil?

delphi - Delphi 应用程序如何检测 Windows PC 的网络代理设置?

compiler-errors - 是否有 -Wall -Werror 的 rustc 等价物?

c - 警告 : too many arguments for format

python - str.startswith() 没有按我的预期工作

c++ - 哪个更好地检查 std::string 中是否存在字符?查找还是 find_first_of?

string - 什么是 Pascal 风格的字符串?

delphi - 使用 FireDac 将日期插入 MS Access 数据库

delphi - 在 Delphi 中使用多线程进行查询

visual-c++ - 使用 Microsoft 的 Visual C++ 编译器时,gcc 是否有等效于 -pedantic 的内容?