C# CreateFile的端口无效\u句柄\u值 所以我把这些东西从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代码中C# CreateFile的端口无效\u句柄\u值 所以我把这些东西从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#,C#,所以在我的c代码中 [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposit
[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;
到
另一个选项是更改
CreateFile
定义以返回一个而不是IntPtr
。然后您可以使用和属性。我现在的位置没有VS,但是您是否尝试通过调用ToInt64()来比较它?只需使用uintptpr
作为返回类型,并将m\u hParstat.ToInt32()
更改为m\u hParstat.ToUInt32()
在64位系统上运行时,将IntPtr
转换为32位会丢失信息m_hParstat.ToInt32()
将丢弃前32位,这意味着您可能会说某些内容无效,但实际上并非如此
如果您没有测试返回值的所有位,那么您的程序中就有一个潜在的bug
您最好的选择是使用。我认为这会起作用,但SwDevMan81有一个更简单的解决方案。
public const Int32 INVALID_HANDLE_VALUE = -1;