0

次のシナリオを実行しています。

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 は false ですが、重複して実行されているため、予想されます。
問題は、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(); に影響を与えない追加用のファイルを開く方法。出力。

4

3 に答える 3

0

デバッグに使用Marshal.GetLastWin32Errorするのは最善の方法ではないと判断しました。

于 2011-01-05T14:40:34.597 に答える