جهاز حجم النوافذ كشف فشل حتى إعادة التشغيل. لم يقصر قط قبل

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

سؤال

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

وهذا المشروع يستخدم كيو تي 4.5.0، ولكن هذا لا ينبغي أن يكون مهم جدا على هذا السؤال.

وأسجل للإخطار على النحو التالي

// Register for device connect notification
DEV_BROADCAST_DEVICEINTERFACE devInt;
ZeroMemory( &devInt, sizeof(devInt) );
devInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
devInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
devInt.dbcc_classguid = GUID_DEVINTERFACE_VOLUME;

m_hDeviceNotify =
    RegisterDeviceNotification( winId(), &devInt, DEVICE_NOTIFY_WINDOW_HANDLE );   

ومعالج ثم تصفية لرسائل WM_DEVICECHANGE.

if (message->message == WM_DEVICECHANGE)
{
    switch (message->wParam)
    {
    case DBT_DEVICEARRIVAL:
        HandleVolumeArrival( message );
        break;

    case DBT_DEVICEREMOVECOMPLETE:
        HandleVolumeRemoval( message );
        break;

    default:
        break;
    }

    *result = TRUE;
} // end if

ومعالج الرسالة وصوله ثم يعالج رسالة على هذا النحو:

وباطل HandleVolumeArrival (MSG * الرسالة) {     إذا (رسالة،> lParam == 0)     {         qDebug () << "lParam هو 0 على وصول جهاز".         إرجاع؛     } // النهاية، اذا كان

PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR) message->lParam;
if(pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
    PDEV_BROADCAST_VOLUME pVol = (PDEV_BROADCAST_VOLUME) pHdr;

    // Handling of the volume is performed here
} // end if

و} // نهاية HandleVolumeArrival

وجاءت مشكلة عند التحقق من نوع الجهاز لنوع وحدة التخزين:

pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME

وعندما كانت فاشلة، ويتم الإبلاغ عن نوع الجهاز كما DBT_DEVTYP_DEVICEINTERFACE.

وقد حوكم

ومحركات الأقراص USB متعددة، وكان كل نفس المشكلة.

وقد أي شخص ينظر إلى أي شيء مثل هذا من قبل؟ هل تعرف ما يمكن أن يؤدي أو لماذا المشكلة سوف تزول من إعادة تشغيل النظام؟

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

المحلول

وتخميني سيكون ذلك كنت انظر DBT_DEVTYP_DEVICEINTERFACE عادة على أي حال. أجهزة USB هي التي تصف نفسها بنفسها. جهاز USB يمكن أن يكون أي "واجهات" حيث كل واجهة هو سمة من سمات الجهاز. تخميني هو أنه عندما يتم توصيل USB تحصل على "DBT_DEVTYP_DEVICEINTERFACE" في واجهة جهاز USB بحيث برنامج تشغيل جهاز USB يمكن القول أن يتمكنوا من التعامل مع تلك الواجهة USB. أفترض أن برنامج تشغيل الجهاز USB للسائق USB ذات سعة التخزين الكبيرة سيكون من شأنه أن التعامل مع هذه الرسائل عن طريق تركيب وحدة التخزين ومن ثم ستحصل على رسالة DBT_DEVTYP_VOLUME.

واعتقد ان ان الشامل سائق واجهة تخزين لا يعمل بشكل صحيح (أو قد تحطمت) وليس هو التعامل مع DBT_DEVTYP_DEVICEINTERFACE. إلا إذا كنت تبدأ رؤيتها الكثير وأنا لا أعتقد أنه هو الوضع الذي يجب أن يكلف نفسه عناء التعامل معها.

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