我最近尝试在我的应用程序中使用范围检查,试图捕获数组边界违规等。
不幸的是,这导致了很多与HRESULT
:
var
hr: HRESULT;
begin
hr := E_UNEXPECTED;
ShowMessage(SysErrorMessage(hr));
对SysErrorMessage
的调用因 ERangeError 而失败。那是因为:
HRESULT = type Longint; { from wtypes.h }
function SysErrorMessage(ErrorCode: Cardinal): string;
解决方案很简单:每次我将Cardinal
传递给HRESULT
时,手动强制转换为SysErrorMessage
。
这对我正在处理的当前项目中的代码运行良好 - 搜索SysErrorMessage
并扫描结果以查找我可能传递HRESULT
的位置:
但是当共享库中存在代码时,它会失败。当可能有其他构造我将签名传递给无符号时,它也会失败,反之亦然。
当我混合有符号和无符号类型时,编译器是否有警告选项可以捕获?显然,我将禁用范围检查。
所有WinSock函数都返回Integer:
int WSAAPI getaddrinfo(
_In_opt_ PCSTR pNodeName,
_In_opt_ PCSTR pServiceName,
_In_opt_ const ADDRINFOA *pHints,
_Out_ PADDRINFOA *ppResult
);
int WSAGetLastError(void);
Jcl / Jvcl有很多东西需要做。
答案 0 :(得分:1)
当我混合有符号和无符号类型时,编译器是否有警告选项可以捕获?
W1024将收集混合算术和比较。但是在编译时没有任何内容用于赋值或参数传递,这与赋值基本相同。