我正在运行以下场景:

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);

传递是假的但是因为我正在运行重叠而被预料到 问题是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或使用Debug.Trace输出获得幻想) ?基本上某种程度上打开一个文件来追加不会影响Marshal.GetLastWin32Error();输出

有帮助吗?

解决方案 2

我已经确定使用 Marshal.GetLastWin32Error 进行调试并不是最好的方法。

其他提示

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

在DllImport声明中使用SetLastError = True。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top