基础讨论:dword(-1)是-1还是$FFFFFFFF?(10分)

  • 主题发起人 主题发起人 张鸿林
  • 开始时间 开始时间

张鸿林

Unregistered / Unconfirmed
GUEST, unregistred user!
Windows.pas定义:
const Invalid_handle_value=dword(-1);
api函数CreateFile()的返回值按定义是 HWnd,也就是longword,属unsigned 32-bit
如果定义一个变量fHandle为有符号整数如Longint,integer等,
fHandle:=CreateFile(...);
如果文件打开失败,则fHandle为-1;
这时想用fHandle<>Invalid_handle_value表示文件打开成功的话将不是您期望的结果
因为Invalid_Handle_value是一个溢出的无符号整型其值为$FFFFFFFF;
我用过一个共享串口组件ATComm32.pas就有这方面的Bug;
所有喜欢使用Windows常量表示的人需要充分注意
 
Delphi帮助:
CreateFile:
If the function fails, the return value is INVALID_HANDLE_VALUE.

如你所说,HWnd,也就是longword,属unsigned 32-bit,而Invalid_Handle_value是一个
溢出的无符号整型其值为$FFFFFFFF,它们的类型是相同的。因此,若用var fHandle:HWnd
定义变量的话,不会有任何问题(因为没有类型转换过程);若用var fHandle:Integer的
话,编译器会提示:Comparing signed and unsigned types - widened both operands,
我们还是能够很容易的发现隐患的。
 
看来,关心编译器提示是重要的
我原来不太关注,相信许多人也跟我一样(包括国外一些高手,如我在上面举的例子
ATComm32.pas)
谢谢createion_zy.分数少了,请笑纳。
几次见识createion_zy,确实身手不凡!
 
后退
顶部