如题

解决方案 »

  1.   

    如果是窗口句柄,可以用Win32API IsWindow()去判断
    其他的一般都是在调用含有句柄参数的方法时,根据返回的错误值来判断
      

  2.   

    指针指向内存地址,是否有效没有通用的办法,一般是释放指针后,赋值为NULL,这也仅是编程人员的行为,系统没有办法判断,如果使用了无效的指针,系统出错。
      

  3.   

    实际上我是通过P/Invoke从非托管C++代码中返回HANDLE,由于在C++中有如下定义:
    #define  INVALID_HANDLE_VALUE  (HANDLE)(-1)而在C#中与C++中HANDLE对应的数据类型是IntPtr,那么:当C#中判断返回的句柄是否有效就存在这样的问题:
    ==============================================
    =================C++==========================
    HANDLE Function1()
    {
        HANDLE hDevice = INVALID_HANDLE_VALUE;    return hDevice;
    }==============================================
    ==================C#==========================
    IntPtr hDevice = IntPtr.Zero;
    hDevice = Function1();// 当然这里需要使用平台调用进行处理
    此时如何判断hDevice是否有效?是否如下:
    if (hDevice == IntPtr.Zero)
    {...}
    还是如下:
    if (hDevice == IntPtr(-1);
    ??????????????????????????????????????????????????????
      

  4.   

    我是说是用:
    if (hDevice == IntPtr.Zero) {}
    还是用:
    if (hDevice == IntPtr(-1) {}
    来判断返回句柄是否有效,还是有其它什么方法?谢谢
      

  5.   

    句柄不就是个整型数么,而且c++返回的句柄就是一个整数么int hDevice = 0; 
    hDevice = Function1();
    if (hDevice == 0) 
    {...} 
    int Function1()
    {
      dllimport 
        int C++Function1(...)
      return C++Function1 
    }
      

  6.   

    if (hDevice <= 0) 
      

  7.   

    有时, 即使不是 0 或者 -1, 一个handle 也可以是无效的了
    句柄化也是一个信息隐藏的方式, 如果 dll 是自己编写的, 是否可以考虑提供一个测试给定 handle 是否合法的调用呢
      

  8.   

    经过测试:从C++Dll中返回的句柄值为IntPtr(-1),(注:当调用C++库函数失败时返回值,如果成功肯定是有效的IntPtr)我现在使用判断:if (hDevice == new IntPtr(-1){......}
    不是这样好不好?
      

  9.   

    约定, -1 本身不是无效, 是通常约定它是无效C++ 中的 TypedefC# 中也对应搞一下好