0

我正在运行以下场景:

SafeFileHandle handle = Win32API.CreateFile((deviceName + "\\" + pipeName),
                           DesiredAccess.GENERIC_WRITE | DesiredAccess.GENERIC_READ,
                           ShareMode.FILE_SHARE_WRITE | ShareMode.FILE_SHARE_READ,
                           IntPtr.Zero,
                           CreationDisposition.OPEN_EXISTING,
                           FlagsAndAttributes.FILE_ATTRIBUTE_NORMAL | FlagsAndAttributes.FILE_FLAG_OVERLAPPED,
                           IntPtr.Zero); // Marshal.GetLastWin32Error() returns 0 (success)

bool pass = Win32API.WriteFile(writeHandle, message.ToArray(), (uint)message.Count, ref bytes_written, ref over_lapped);

pass 是错误的,但可以预料,因为我正在运行重叠。
问题是 Marshal.GetLastWin32Error() 不返回 ERROR_IO_PENDING 它返回 ERROR_ALREADY_EXISTS。这对我来说很奇怪,因为当我创建文件时错误并没有显示,但是当我写它时出现了。现在我试图弄清楚如何关闭我似乎无法访问的句柄,或者至少得到一个关于为什么会发生这种情况的解释。

编辑:好的,我已经解决了问题,我知道是什么导致了问题。

  private void ErrorOccurred(string detailedError)
  {
     lock (mLogLock)
     {
        try
        {
           System.IO.File.AppendAllText("Device" + mDeviceHandle + "Log.txt",
           DateTime.Now.ToLongTimeString() + ": " + detailedError + Environment.NewLine);
        }
        catch (Exception ex)
        {
           System.Windows.Forms.MessageBox.Show(ex.Message);
        }
     }
  }

显然,AppendAllText 调用在内部创建了一个错误。我应该在此日志调用后重置错误吗?我想知道框架不会在其函数的内部工作中重置低级调用会很有帮助。啊,你每天都学到新东西。

我想我的新问题是,我应该在这个调用之后重置低级错误,还是有其他方法来记录输出(不使用像 log4Net 这样的 3rd 方工具或对 Debug.Trace 输出感兴趣)?基本上以某种方式打开一个不影响 Marshal.GetLastWin32Error(); 的附加文件;输出。

4

3 回答 3

0

Marshal.GetLastWin32Error() 应该是您在 Win32API.WriteFile() 调用之后做的第一件事。不要在 WriteFile() 和 GetLastWin32Error() 调用之间做任何其他事情,例如任何日志记录等。

于 2009-09-16T15:21:50.040 回答
0

在 DllImport 声明中使用 SetLastError = True。

于 2009-09-16T15:26:38.630 回答
0

我已经确定Marshal.GetLastWin32Error用于调试不是最好的方法。

于 2011-01-05T14:40:34.597 回答