سؤال

هذه المرة لدي خطأ كنت أحاول مرة أخرى معرفة سبب وجوده. على الرغم من أنه يمكن تجاهل الخطأ ، لكنني أود أن أعرف سبب وجوده في المركز الأول.

result = SetupDiGetDeviceInterfaceDetail(deviceInfoSet, ref anInterface, IntPtr.Zero, 0, ref buffersize, IntPtr.Zero);
            if (!result)
            {
                int errCode = Marshal.GetLastWin32Error();
                errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
                statusLabel.Text += "\n(1)SetupDiGetDeviceInterfaceDetail Error: " + errCode + " => " + errorMessage + ".";
                //break;
            }

هذه هي الدعوة الأولى لهذه الوظيفة التي هي فقط لغرض تعيين حجم المخزن المؤقت متغير للمكالمة الثانية للدالة. أحصل على رسالة الخطأ المطبوعة: 122 => منطقة البيانات التي تم تمريرها إلى مكالمة النظام صغيرة جدًا. انطلاقًا من رسالة الخطأ ، اعتقدت أن هذا يجب أن يكون له علاقة بالمعلمة الثانية (مرجع واجهة) ويمكنني أن أتجاهل هذا للممر الثاني الذي تحول إلى صحيح ؛ لكن الخطأ لا يزال موجودًا وأود أن أعرف لماذا قبل أن يعود ليعضني في مكان "وراء". يتم الإعلان عن المعلمة المعنية وتحديدها هكذا:

[StructLayout(LayoutKind.Sequential)] // defined here
    public struct SP_DEVICE_INTERFACE_DATA
    {
        public uint cbSize;
        public Guid InterfaceClassGuid;
        public uint Flags;
        public IntPtr Reserved;
    }

anInterface = new SP_DEVICE_INTERFACE_DATA(); // declared here
        anInterface.cbSize = (uint)Marshal.SizeOf(anInterface);
        anInterface.InterfaceClassGuid = Guid.Empty;
        anInterface.Reserved = IntPtr.Zero;
        anInterface.Flags = 0;

لقد اخترت مقالات MSDN ، وبقدر ما أستطيع أن أقول أنه لا يوجد شيء خاطئ في الكود هنا.

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

المحلول

من المفترض أن يحدث هذا حسب التصميم. لو نظرت هنا تحت قسم التعليقات:

عادةً ما يكون استخدام هذه الوظيفة للحصول على تفاصيل حول الواجهة عملية من خطوتين:

1) احصل على حجم المخزن المؤقت المطلوب. Call SetupDigetDeviceInterFacedetail مع مؤشر DeviceInterFacedetaildata NULL ، ومؤشر DeviceInterFacedetaildatasize من الصفر ، ومتغير صالح مطلوب. استجابةً لمثل هذه المكالمة ، تقوم هذه الوظيفة بإرجاع حجم المخزن المؤقت المطلوب في الحجم المطلوب ويفشل مع خطأ عودة GetLasterror غير كافٍ.
2) تخصيص مخزن مؤقت بحجم مناسب واتصل بالوظيفة مرة أخرى للحصول على تفاصيل الواجهة.

إذا بحثت عن الخطأ غير كافٍ للعازلة تحت رموز الخطأ, ، سترى أنها قيمة عشرية 122.

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