Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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# - Fatal编程技术网

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# 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

所以在我的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;


另一个选项是更改
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;