Domanda

Sto eseguendo il seguente scenario:

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

è falso ma è prevedibile poiché sto eseguendo una sovrapposizione.
Il problema è Marshal.GetLastWin32Error () non restituisce ERROR_IO_PENDING restituisce ERROR_ALREADY_EXISTS. Il che è strano per me perché l'errore non l'ha mostrato quando ho creato il file, ma quando lo scrivo appare. Ora sto cercando di capire come chiudere la maniglia a cui non sembra avere accesso o almeno ottenere una spiegazione sul perché questo accada.

EDIT: Ok, ho annullato il problema e so cosa sta causando il problema.

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

Apparentemente, internamente la chiamata AppendAllText sta creando un errore. Devo ripristinare l'errore dopo questa chiamata di registro? Immagino che ciò sarebbe stato utile sapere che il framework non ripristina le chiamate di basso livello nel funzionamento interno delle sue funzioni. Ahh, impari qualcosa di nuovo ogni giorno.

Immagino che la nuova domanda che ho sia, dovrei resettare l'errore di basso livello dopo questa chiamata, o c'è qualche altro modo per registrare l'output (non usare strumenti di terze parti come log4Net o fare fantasia con l'output Debug.Trace) ? Bascialmente in qualche modo per aprire un file per l'aggiunta che non influisce sul Marshal.GetLastWin32Error (); uscita.

È stato utile?

Soluzione 2

Ho deciso di utilizzare Marshal.GetLastWin32Error per il debug non è il modo migliore di procedere.

Altri suggerimenti

Marshal.GetLastWin32Error () dovrebbe essere la prima cosa che fai dopo la chiamata Win32API.WriteFile (). Non fare nient'altro, ad es. qualsiasi registrazione ecc., tra le chiamate WriteFile () e GetLastWin32Error ().

Usa SetLastError = True nella dichiarazione DllImport.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top