Delphi编译器警告:将有符号传递给无符号

Delphi编译器警告:将有符号传递给无符号,delphi,delphi-xe6,Delphi,Delphi Xe6,我最近尝试在我的应用程序中使用范围检查,试图捕获数组边界冲突等 不幸的是,这导致了许多与HRESULT相关的非错误: var hr: HRESULT; begin hr := E_UNEXPECTED; ShowMessage(SysErrorMessage(hr)); 调用SysErrorMessage失败,出现ERangeError。这是因为: HRESULT = type Longint; { from wtypes.h } function SysError

我最近尝试在我的应用程序中使用范围检查,试图捕获数组边界冲突等

不幸的是,这导致了许多与
HRESULT
相关的非错误:

var
    hr: HRESULT;
begin
    hr := E_UNEXPECTED;
    ShowMessage(SysErrorMessage(hr));
调用
SysErrorMessage
失败,出现ERangeError。这是因为:

HRESULT = type Longint;  { from wtypes.h }

function SysErrorMessage(ErrorCode: Cardinal): string;
手工打字 解决方案很简单:每次我将
HRESULT
传递到
syserromessage
时,手动强制转换到
Cardinal

这对于我正在处理的当前项目中的代码来说已经足够好了-搜索
syserromessage
,并扫描结果以查找我可能传递的
HRESULT

var
    hr: HRESULT;
begin
    hr := E_UNEXPECTED;
    ShowMessage(SysErrorMessage(hr));

但当共享库中有代码时,它就失败了。当我将有符号的数据传递给无符号的数据时,它也会失败,反之亦然

编译器能告诉我吗? 当我混合使用有符号和无符号类型时,编译器是否有要捕获的警告选项?显然,我要禁用范围检查

另见
奖金 所有函数都返回整数:

int WSAAPI getaddrinfo(
  _In_opt_       PCSTR      pNodeName,
  _In_opt_       PCSTR      pServiceName,
  _In_opt_ const ADDRINFOA  *pHints,
  _Out_          PADDRINFOA *ppResult
);

Jcl/Jvcl有很多工作要做

当我混合使用有符号和无符号类型时,编译器是否有要捕获的警告选项


W1024将收集混合算术和比较。但在编译时没有赋值或参数传递,这与赋值基本相同

所有将
HResult
值传递到
SysErrorMessage
的代码都是错误的。该函数调用
FormatMessage
,该函数用于格式化Win32错误代码,而不是COM错误代码。对您的第四个“请参阅”链接的回复地址为。如果COM错误代码以
FACILITY\u WIN32
开头,则可以剥离这些位(如
HResultFromWin32
)并将生成的代码传递给
SysErrorMessage
,但如果
SysErrorMessage
实际上一直在处理COM错误代码,这是您无论如何都不应该依赖的未记录行为。很不幸,WinSock函数返回有符号整数,但实际上没有问题,因为它们返回的所有错误代码都是正数,因此,没有超过基数界限的危险。@RobKennedy:要从使用
FACILITY\u Win32
HRESULT
中提取Win32错误代码,必须使用
HRESULT\u code()
,而不是
HResultFromWin32()
。但即使如此,也不可能总是将这样的
HRESULT
转换为Win32错误代码。请参阅陈雷蒙关于这个问题的博客:@RobKennedy。在输入的过程中,它们也会强制将类型转换为
uint
。此外,FormatMessage可以接受HRESULT。但它只会在系统错误的情况下产生有意义的结果。