2012-09-25 291 views
4

我已代碼C#編寫的一個上的Windows7和VS2010,使用.net 3.5 32位,它是乳寧沒有任何問題,現在我將它轉換到64位使用.NET 4.0,但我的代碼調用CloseHandle時出現錯誤。System.Runtime.InteropServices.SEHException(0X80004005):外部部件發生異常

錯誤 - CloseHandle
System.Runtime.InteropServices.SEHException(0x80004005):外部組件已引發異常。

unsafe 
{ 
    fixed (byte* p = readBuffer) 
    { 
     IntPtr intPtr = (IntPtr)p; 
     this.ReadFile(ref sourceFile, (ulong)buffer_size, intPtr, ref nNumBytesRead); 

     if (intPtr != IntPtr.Zero) 
     { 
      try 
      { 
       FunctionSqudf.CloseHandle(intPtr); 
      } 
      catch (Exception ex) 
      { 
        Hardware.LogHardware.Error("CloseHandle", ex); 
      } 
     } 
     } 
    } 


    [SecuritySafeCritical] 
    [DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern bool CloseHandle(IntPtr hObject); 

任何幫助表示讚賞。

+0

ReadFile在做什麼? –

+1

你正在用一個緩衝區指針調用CloseHandle(),而不是一個句柄。這段代碼之前無法正常工作,顯然現在在64位模式下運行時會提醒您。 –

+0

彼得裏奇的ReadFile將從媒體[SecuritySafeCritical] [的DllImport(DllPath的,字符集= CharSet.Ansi,CallingConvention = CallingConvention.StdCall,ThrowOnUnmappableChar =真)] 內部靜態外部UdfResult ReadFile的( REF StructSqudf.SQFile讀取文件部分openFsObject,\t \t [IN] ULONG numBytesToBeRead, IntPtr的緩衝器,\t \t REF ULONG numBytesRead); – Khayralla

回答

4

你不能用一個指向用戶內存使用CloseHandle。您需要分配一個HANDLE才能關閉它。你認爲CloseHandle什麼關閉?

+0

CloseHandle需要一個「對一個打開的對象有效的句柄」。這將是一個指針。真正的問題是這個.ReadFile返回。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms724211(v=vs.85).aspx http://www.pinvoke.net/default.aspx/kernel32.closehandle – Trisped

+0

哎呀,你是對的,彼得,非常感謝。 – Khayralla

+2

@Trisped如果它是作爲內存塊被寫入的內存指針,它不會是一個有效的句柄。是的,技術上*是一個指針;而是指向應用程序無法寫入的內核內存的指針。 –

相關問題