Pregunta

Estoy ejecutando el siguiente escenario:

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

el pase es falso pero es de esperarse ya que estoy superpuesto.
El problema es Marshal.GetLastWin32Error () no devuelve ERROR_IO_PENDING devuelve ERROR_ALREADY_EXISTS. Lo cual es extraño para mí porque el error no mostró eso cuando creé el archivo, pero cuando lo escribo aparece. Ahora estoy tratando de descubrir cómo cerrar el identificador al que parece que no tengo acceso o al menos obtener una explicación de por qué sucede esto.

EDITAR: Ok, he solucionado el problema y sé lo que está causando el 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);
        }
     }
  }

Aparentemente, internamente la llamada AppendAllText está creando un error. ¿Debo restablecer el error después de esta llamada de registro? Supongo que esto habría sido útil saber que el marco no restablece las llamadas de bajo nivel en el funcionamiento interno de sus funciones. Ahh, aprendes algo nuevo todos los días.

Supongo que la nueva pregunta que tengo es, ¿debería restablecer el error de bajo nivel después de esta llamada, o hay alguna otra forma de registrar la salida (no usando herramientas de terceros como log4Net o obteniendo fantasía con la salida de Debug.Trace) ? Básicamente, de alguna manera, para abrir un archivo para agregar que no afecta al Marshal.GetLastWin32Error (); salida.

¿Fue útil?

Solución 2

He determinado que usar Marshal.GetLastWin32Error para la depuración no es la mejor manera de hacerlo.

Otros consejos

Marshal.GetLastWin32Error () debería ser lo primero que haga después de la llamada Win32API.WriteFile (). No hagas nada más, p. cualquier registro, etc., entre las llamadas WriteFile () y GetLastWin32Error ().

Use SetLastError = True en la declaración DllImport.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top