Question

J'utilise le scénario suivant:

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 est false mais il faut s'y attendre puisque im exécute un chevauchement.
Le problème est que Marshal.GetLastWin32Error () ne renvoie pas ERROR_IO_PENDING. il retourne ERROR_ALREADY_EXISTS. Ce qui est bizarre pour moi parce que l'erreur n'a pas montré cela quand j'ai créé le fichier, mais quand j'écris, il apparaît. Maintenant, j'essaie de comprendre comment fermer la poignée à laquelle je ne semble pas avoir accès ou au moins obtenir une explication de la raison pour laquelle cela se produit.

EDIT: Ok, j'ai résolu le problème et je sais ce qui le cause.

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

Apparemment, l'appel AppendAllText crée en interne une erreur. Devrais-je réinitialiser l'erreur après cet appel du journal? J'imagine que cela aurait été utile de savoir que le framework ne réinitialise pas les appels de bas niveau dans le fonctionnement interne de ses fonctions. Ahh, vous apprenez quelque chose de nouveau chaque jour.

Je suppose que ma nouvelle question est la suivante: dois-je réinitialiser l'erreur de bas niveau après cet appel, ou existe-t-il un autre moyen de consigner la sortie (ne pas utiliser d'outils tiers comme log4Net ou obtenir des résultats fantastiques avec la sortie Debug.Trace) ? Fondamentalement, ouvrir un fichier pour ajouter qui n’affecte pas le Marshal.GetLastWin32Error (); sortie.

Était-ce utile?

La solution 2

J'ai déterminé que l'utilisation de Marshal.GetLastWin32Error pour le débogage n'est pas la meilleure solution.

Autres conseils

Marshal.GetLastWin32Error () devrait être la première chose à faire après l’appel Win32API.WriteFile (). Ne faites rien d'autre, par exemple toute journalisation, etc., entre les appels WriteFile () et GetLastWin32Error ().

Utilisez SetLastError = True dans la déclaration DllImport.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top