所以我把这些东西从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的范围。如何检查句柄的有效值?
答案 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
。然后,您可以使用IsInvalid
和IsClosed
属性。
答案 2 :(得分:0)
我现在没有VS,但您是否尝试通过调用ToInt64()来比较它?
答案 3 :(得分:0)
只需使用UIntPtr
作为返回类型,然后将m_hParstat.ToInt32()
更改为m_hParstat.ToUInt32()
。