سؤال

وأنا على تشغيل 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);

وتمريرة خاطئة ولكن ليكون من المتوقع منذ تتداخل ايم التوالي.
المشكلة هي Marshal.GetLastWin32Error ()] لا عودة ERROR_IO_PENDING تقوم بإرجاع ERROR_ALREADY_EXISTS. الذي هو غريب بالنسبة لي لأن الخطأ لم تظهر أنني عندما أنشأ الملف، ولكن عندما أكتبه يظهر. أنا الآن في محاولة لمعرفة كيفية إغلاق المؤشر أنني لا يبدو أن لديها أو الحصول على أتلست حصول على تفسير لماذا يحدث هذا.

وتحرير: حسنا، لقد norrowed المشكلة أسفل وأنا أعرف ما هو الذي يسبب المشكلة

  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 يخلق خطأ. يجب أن إعادة تعيين الخطأ بعد هذه الدعوة السجل؟ أعتقد أن هذا كان من المفيد أن نعرف أن الإطار هو لا إعادة تعيين المكالمات مستوى منخفض في العمل الداخلي وظائفها. آه، هل تعلم شيئا جديدا كل يوم.

واعتقد ان السؤال الجديد لدي هو، وأود أن إعادة تعيين الخطأ مستوى منخفض بعد هذه الدعوة، أم أن هناك طريقة أخرى لتسجيل الإخراج (عدم استخدام أدوات مثل 3rd الطرف log4Net أو الحصول على يتوهم مع الإخراج Debug.Trace) ؟ Bascially نوعا لفتح ملف لإلحاق أن لا تؤثر على Marshal.GetLastWin32Error ()؛ الانتاج.

هل كانت مفيدة؟

المحلول 2

ولقد المحدد باستخدام Marshal.GetLastWin32Error لتصحيح الأخطاء ليست أفضل طريقة للذهاب.

نصائح أخرى

وMarshal.GetLastWin32Error () ينبغي أن يكون أول شيء تفعله بعد الدعوة Win32API.WriteFile (). لا تفعل أي شيء آخر، على سبيل المثال، أي قطع الأشجار وغيرها، وبين WriteFile () وGetLastWin32Error () يدعو.

استخدم SetLastError = صحيح في الإعلان DllImport.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top