Frage

Ich bin mit der folgenden scenerio:

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 falsch ist aber zu erwarten, da im laufenden überlappten.
Das Problem ist Marshal.GetLastWin32Error () tut Rückkehr ERROR_IO_PENDING es gibt ERROR_ALREADY_EXISTS. Was ist für mich komisch, weil der Fehler, dass didnt zeigen, wenn ich die Datei erstellt, aber wenn ich es zeigt aufzuschreiben. Jetzt versuche ich, um herauszufinden, wie der Griff zu schließen, die ich scheinen nicht zu haben Zugriff auf oder zumindest erhält eine Erklärung, warum dies geschieht.

EDIT:. Ok, ich habe das Problem nach unten norrowed und ich weiß, was das Problem verursacht

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

Offenbar intern der AppendAllText Aufruf einen Fehler erstellt. Soll ich den Fehler nach diesem Protokoll Anruf zurücksetzen? Ich denke, das wäre hilfreich gewesen zu wissen, dass der Rahmen niedriges Niveau Anrufe in den internen Abläufen seiner Funktionen zurückgesetzt tut. Ahh, Sie lernen jeden Tag etwas Neues.

Ich denke, die neue Frage, die ich habe, ist, soll ich die niedrigen Pegel Fehler nach diesem Aufruf zurückgesetzt, oder gibt es eine andere Art und Weise ausgegeben einzuloggen (nicht mit 3rd-Party-Tool wie Log4Net oder bekommt Lust mit dem Debug.Trace Ausgang) ? Bascially someway eine Datei zu öffnen für das Anhängen das tut die Marshal.GetLastWin32Error beeinflussen (); Ausgabe.

War es hilfreich?

Lösung 2

Ich habe bestimmt mit Marshal.GetLastWin32Error für das Debuggen nicht der beste Weg zu gehen.

Andere Tipps

Marshal.GetLastWin32Error () sollte die erste Sache, die Sie nach dem Win32API.WriteFile () -Aufruf tun. Tun Sie nichts anderes, zum Beispiel jede Protokollierung usw., zwischen dem Writefile () und GetLastWin32Error () aufruft.

Mit SetLastError = True in der DllImport Erklärung an.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top