كيف يمكنني معرفة الخطأ في واجهة SetupDiGetClassDev في C#؟

StackOverflow https://stackoverflow.com/questions/1049161

  •  20-08-2019
  •  | 
  •  

سؤال

كيف يمكنني معرفة الخطأ في مجموعة معلومات الجهاز التي تم إرجاعها؟أعيد كتابة الكود الخاص بي مرة أخرى وما زلت أواجه نفس حجر العثرة.

deviceInfoSet = SetupDiGetClassDevs(ref tGuid, 0, IntPtr.Zero, (uint)SetupDiFlags.DIGCF_PRESENT );
if (deviceInfoSet.ToInt32() == INVALID_DEVICE_HANDLE)
{
   int errCode = Marshal.GetLastWin32Error();
   errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
   statusLabel.Text += "Invalid deviceinfoset returned: " + errCode + " => " + errorMessage + ".";
}

الكود أعلاه لا يسبب أي أخطاء ولكن عندما أستخدم الكود أدناه:

result = true;
while (result)
{
    result = SetupDiEnumDeviceInterfaces(deviceInfoSet, IntPtr.Zero, ref tGuid, Index, ref anInterface);
    if (!result)
    {
        int errCode = Marshal.GetLastWin32Error();
        errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
        statusLabel.Text += "\nSetDiEnumDeviceInterface Error: " + errCode + " => " + errorMessage + ".";
        break;
    }
    Index++;
}

لمحاولة الوصول إلى قائمة مجموعة معلومات الجهاز، رمز الخطأ 259 (تتوفر أية بيانات أكثر) يتم إرجاع.أنا في حيرة بشأن ما أفعله خطأ.

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

المحلول

هل أنت متأكد من أنك تستخدم المعرف الفريد العمومي (GUID) الصحيح؟

الدفع http://blogs.msdn.com/doronh/archive/2006/02/15/532679.aspx

يحرر:كل شيء آخر يبدو حسب الكتاب وصحيحًا.

تحرير 2:حاول تضمين DIGCF_DEVICEINTERFACE في استدعاء SetupDiGetClassDevs، ومعرفة ما إذا كان ذلك يناسبك.وهذا يعني أن كلا من DIGCF_PRESENT وDIGCF_DEVICEINTERFACE.

تحرير 3:بالنسبة لمشكلة 64 بت (@Thies)، راجع ذلك http://social.msdn.microsoft.com/Forums/en-US/windowssdk/thread/ea816aea-f718-4a0e-b013-0aa273de037f

نصائح أخرى

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

هل هذا هو الحال؟هل تعلم على وجه اليقين أن الجهاز يحاول حاليًا إرجاع البيانات إليك؟

لقد واجهت مشكلات مماثلة كانت بسبب التشغيل على نظام التشغيل Windows 64 بت.لم أكتشف ذلك مطلقًا، وانتهى بي الأمر بتشفير مسار الجهاز في الكود الخاص بي - وهو أمر غير مستحسن.

أعتقد أن الأمر يتعلق بهياكل واجهة برمجة التطبيقات (API) التي لم يتم إعدادها بشكل صحيح لنظام 64 بت.

آمل أن يساعد هذا في توجيه شخص آخر إلى إجابة (وربما يساعد في حل مشكلتي أيضًا)

يرجى تحديد ما إذا كنت تستخدم الإصدار 64 بت - وهل جربت نفس الرمز على نظام تشغيل 32 بت؟

تبدأ المشكلة بكيفية استدعاء SetupDiGetClassDevs.

إذا كنت تريد الحصول على مسار الجهاز، فاستخدم SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_DEVICE ,,,)

يفشل SetupDiEnumDeviceInterfaces بسبب الخطأ 259 إذا تم إعطاء SetupDiGetClassDevs المعرف الفريد العمومي (GUID) الخاطئ في ClassGuid والذي تقول تعليمات MS إنه مؤشر إلى GUID لفئة إعداد الجهاز أو فئة واجهة الجهاز.

تضمين الملف devguid.h الذي يحتوي على مجموعة من قيم GUID_DEVCLASS.هذه ليست نفس قيم GUID_DEVINTERFACE_* التي تحتاجها.

استخدم #include الذي يتضمن ksuuids.h حيث ستجد قيم GUID_DEVINTERFACE_*.

يوجد شرح أكثر تفصيلاً على موقع الويب الخاص بي، مع بعض التعليمات البرمجية المصدر التي من شأنها أن تساعد في تعداد أجهزة USB بشكل صحيح.

يرى http://pixcl.com/SetupDiEnumInterfaces_Fail.htm

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