所以我将这些东西从 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的范围。如何检查我的句柄是否有有效值?
最佳答案
这很可能是因为你的常量不是 Int32。变化:
public const UInt32 INVALID_HANDLE_VALUE = 0xffffffff;
至
public const Int32 INVALID_HANDLE_VALUE = -1;
另一个选项是更改 CreateFile
定义以返回 SafeFileHandle
而不是 IntPtr
。然后您可以使用IsInvalid
和 IsClosed
属性。
关于c# - CreateFile 的端口 INVALID_HANDLE_VALUE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5820887/