以下是一个DLL中定义的函数HANDLE WINAPI CT_open(char *name);
返回值:INVALID_HANDLE_VALUE(-1)表示打开端口失败;其他值(大于0)为打开的端口句柄,用于卡操作函数的fd
示例:
HANDLE fDev; //定义句柄,用于保存端口句柄
char devName[5]; //用于保存端口名称
strcpy(devName, "COM1"); //获得端口名称
fDev = CT_open(devName); //以相应的格式打开端口,并得到端口句柄
if(fDev == INVALID_HANDLE_VALUE) //判断端口是否正确打开
{
}
问题如下:HANDLE类型的变量取值应为不小于0的整数(对不,我不是很清楚),而此函数返回值有  INVALID_HANDLE_VALUE(-1) 。如果是这样的话,这个 INVALID_HANDLE_VALUE(-1) 不可以赋值给 HANDLE类型的变量 fDev.请问这个问题如何理解。DELPHI6的THANDLE是这个HANDLE是完全对应的吗?

解决方案 »

  1.   

    一般来说HANDLE的值不是 INVALID_HANDLE_VALUE 不是0 就表示是有效值。INVALID_HANDLE_VALUE这个是一个无效的标识符
      

  2.   

    接楼上
    另外,没学DELPHI,不知道DELPHI6的THANDLE是什么
      

  3.   

    你需要理解什么是HANDLE,然后再看CT_open(devName);的返回HANDLE,具体INVALID_HANDLE_VALUE只是返回值中的一种而已。
      

  4.   

    typedef void *HANDLE;
    HANDLE 是个void*,正常情况下是正值,但可以强制把负值给它
    再看看
    #define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)
    就是把-1强制转换成HANDLE,表示无效的句柄
      

  5.   

    INVALID_HANDLE_VALUE(-1)这个顾名思义就知道是无效的句柄,当然不能用了,你要做的是弄清楚fDev = CT_open(devName); 这个函数为什么失败。
      

  6.   

    Handle就是要根据返回值来判断这个句柄是否正确获得,以及你时候在后续代码中可以调用,所以要判断INVALID_HANDLE_VALUE..,如果为invalid,那么后续操作HANDLE的代码都应该跳开
      

  7.   

    INVALID_HANDLE_VALUE表示返回结果失败。HANDLE本身微软就没有公开他的意义。在很多场合,它的意义也不尽相同,因为API函数相当部分使用HANDLE作为返回值的,因为有些API函数,他的HANDLE的高位掩码的各个段都有各自的含义,很多段都是微软内核才会用到的,没有公开,而且一些段还是保留的为了以后版本的扩充,低位的才是我们经常用到的,所以一个HANDLE可能很简单,也可能包含了大量的信息。如果可以的话,你可以把它理解为类似指针、索引之类即可。
    另外,微软的API也是比较“混乱”,有些函数返回0算失败。有些函数返回INVALID_HANDLE_VALUE算失败。
      

  8.   

    >>这个 INVALID_HANDLE_VALUE(-1) 不可以赋值给 HANDLE类型的变量 fDev.
     可以赋值HANDLE类型的变量 fDev.
     在winnt.h 文件中关于INVALID_HANDLE_VALUE 定义:
      #define INVALID_HANDLE_VALUE (HANDLE)-1
    >>请问这个问题如何理解。DELPHI6的THANDLE是这个HANDLE是完全对应的吗?
     是完全对应的
      "windodws.pas中  HWND = type LongWord;
      windows.pas中THandle定义:THandle = System.THandle;   
      而在system单元中,定义THandle = LongWord;    windows.pas中  HDC = type LongWord;  也就是说delphi中这三个实际上都是longword,定义出这么三个东西来, 是为了与 windows api配合, 因为程序是在windows的平台上开发的,要调用windows 的API,而在windowsAPI中定义了这么个类型。 "
    '
      

  9.   

    fDev = CT_open(devName); 
    这句获得设备的句柄,接下来
    if(fDev == INVALID_HANDLE_VALUE)
    通过判断这个句柄fDev是否为无效值,如果等于INVALID_HANDLE_VALUE,说明无效,就在if里面处理掉了。这是常用的标准的处理方式。你说的“这个 INVALID_HANDLE_VALUE(-1) 不可以赋值给 HANDLE类型的变量 fDev”,这个不要理解成赋值,实际上相当于fDev获得了打开设备的一种状态。是一个指示,有效就能用,无效就不要用这个设备。