CreateFile端口INVALID_HANDLE_VALUE

时间:2011-04-28 15:14:37

标签: c#

所以我把这些东西从c ++移植到c#。部分内容如下:

      m_hParstat = CreateFile( _T("\\\\.\\LPTSTAT1"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );

  if( m_hParstat == INVALID_HANDLE_VALUE )
  {
     // do some stuff
  }

所以在我的c#代码中我有

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess,
                     uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
                     uint dwFlagsAndAttributes, IntPtr hTemplateFile);

public const int FILE_ATTRIBUTE_NORMAL = 0x00000080;
public const uint GENERIC_READ = 0x80000000;
public const uint OPEN_EXISTING = 3;
public const UInt32 INVALID_HANDLE_VALUE = 0xffffffff;

然后

  m_hParstat = CreateFile("\\\\.\\LPTSTAT1", GENERIC_READ, 0, IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero);
  if (m_hParstat.ToInt32() == INVALID_HANDLE_VALUE)
  {

  }

但是VS说这种比较没用,因为常数超出了int的范围。如何检查句柄的有效值?

4 个答案:

答案 0 :(得分:3)

当您在64位系统上运行时,将IntPtr转换为32位将导致丢失信息m_hParstat.ToInt32()会丢掉前32位,这意味着你可能会说某些东西无效。

如果您没有测试返回值的所有位,那么您的程序中可能存在潜在错误。

您最好的选择是使用SafeFileHandle

答案 1 :(得分:2)

最有可能的原因是你的常数不是Int32。变化:

public const UInt32 INVALID_HANDLE_VALUE = 0xffffffff;

public const Int32 INVALID_HANDLE_VALUE = -1;

另一种选择是更改CreateFile定义以返回SafeFileHandle而不是IntPtr。然后,您可以使用IsInvalidIsClosed属性。

答案 2 :(得分:0)

我现在没有VS,但您是否尝试通过调用ToInt64()来比较它?

答案 3 :(得分:0)

只需使用UIntPtr作为返回类型,然后将m_hParstat.ToInt32()更改为m_hParstat.ToUInt32()