2011-04-28 40 views
2

所以我將這些東西從C++移植到c#中。而它的一部分看起來像這樣:CreateFile的端口INVALID_HANDLE_VALUE

 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範圍之外。如何檢查我的句柄以獲取有效值?

回答

2

它最有可能是因爲你的常量不是Int32。變化:

public const UInt32 INVALID_HANDLE_VALUE = 0xffffffff; 

public const Int32 INVALID_HANDLE_VALUE = -1; 

另一種選擇是改變CreateFile定義返回SafeFileHandle而不是IntPtr的。然後您可以使用IsInvalidIsClosed屬性。

0

我沒有VS我現在在哪裏,但是你是否試圖通過調用ToInt64()來比較它?

0

只需使用UIntPtr作爲返回類型並將m_hParstat.ToInt32()更改爲m_hParstat.ToUInt32()即可。

+0

我認爲這可行,但SwDevMan81有一個更簡單的解決方案。 – 2011-04-28 15:29:15

3

轉換,當你在64位系統上運行的IntPtr到32位是要丟失信息m_hParstat.ToInt32()將丟掉前32位,這意味着你可能會說,如果不是,那麼它就是無效的。

如果你沒有測試返回值的所有位,那麼你的程序中有一個潛在的錯誤。您可以使用SafeFileHandle