مشاكل في الحصول على برنامج تشغيل جهاز لتحميله عند بدء التشغيل - WM6.1

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

سؤال

طور مبرمج الأنظمة المدمجة لدينا قذيفة لبرنامج تشغيل المنفذ التسلسلي الظاهري لأجهزةنا المحمولة ، وقد قمت بملء أساليب العمل. يعمل السائق كما هو متوقع ، ويحاكي منفذ COM لجهاز USB الذي يخرج من سلاسل NMEA (بيانات GPS).

أكتب WM6 لفترة قصيرة ، ولكن نظام التشغيل هو WM6.1 إذا كان يحدث أي فرق.

المشكلة التي أواجهها هي أن برنامج التشغيل لا يتم تحميله عند بدء تشغيل الجهاز على WM6 فقط. تم تطوير برنامج التشغيل لكل من CE5 و WM6 ، ولكن على CE5 ، لا يقوم برنامج التشغيل "بالتماس" ، مما يشيرني إلى مشكلة تكوين WM6. ربما تجدر الإشارة في هذه المرحلة إلى أن السائق سيتم تحميله في طريقة WM6 و CE5 باستخدام طريقة ActivatedEvice () ، وهذا ما كنت أستخدمه حتى الآن في WM6 ، وهو تطبيق اختبار صغير لإطلاق برنامج التشغيل حتى أتمكن من اختبار برنامج التشغيل على الأقل يعمل على WM6.

يتم ملء السجل بالفعل مع المفاتيح المطلوبة لبدء تشغيل السائق. لذلك يجب أن يتم تحميل السائق عند بدء التشغيل دون أي مشاكل. يحتوي HKEY_LOCAL_MACHINE DRIVERS BUNDIN على مفتاح فرعي A36D_GPS_COM ، وفي هذا المفتاح.

DeviceArrayIndex: 0

deviceType: 0

DLL: A36D.DLL

أعلام: 0

الاسم الودود: منفذ A36D GPS COM

الفهرس: 8

الترتيب: 3

بادئة: كوم

الأولوية: 0

الأولوية: 256

من ما يمكنني قوله أن هناك إجابة شائعة بشكل عام على هذه المشكلة التي قمت بالتحقيق فيها بالفعل. أعطيت هذه الأفكار لي من قبل المبرمج المدمج لكنني بحثت عن كيفية القيام بها بنفسي.

1) يتم استخدام منفذ COM بالفعل عندما يحاول برنامج التشغيل تحميله ، حتى لو كان منفذ COM مجانيًا في النهاية بمجرد تحميل الجهاز. لقد قمت بتغيير قيمة الفهرس في السجل من ما بين 1 إلى 20 وأعيد تشغيل الجهاز ، ولا يتم تحميل برنامج التشغيل على منفذ COM محدد. لذلك لمحاولة اختبار هذا الأمر بشكل أكثر شمولية ، قمت بنقل جهاز آخر من COM9 إلى COM8 ونقلت برنامج التشغيل الخاص بي إلى COM9 (باستخدام إعدادات التسجيل أعلاه). يتم تحميل برنامج تشغيل الجهاز الآخر عند بدء التشغيل على COM8 بسعادة تامة ، لكن برنامج تشغيل الجهاز الخاص بي لن يقوم بتشغيل COM9. لقد حاولت حتى تغيير الإعدادات الأخرى ولكن لا يزال لا يتم تحميله في التمهيد.

2) قضايا أخرى محتملة واختلاف بين CE5 و WM6 هي الأمان. لذا باستخدام مقالة MSDN http://msdn.microsoft.com/en-us/library/bb737570.aspx لقد عملت على التوقيع وتوفير XML. باستخدام مفتاح متميز (غير منتهية الصلاحية) ، يتم توقيع A36D.DLL في Visual Studio ويتم توقيع ملف CAB للتثبيت الذي تم إنشاؤه مع نفس المفتاح. يتم إنشاء ملف _setup.xml وإلحاقه بملف الكابينة بحيث تتم إضافة المفتاح الموقّع إلى متجر الشهادة. يتم توقيع ملف الكابينة مرة أخرى مع نفس المفتاح للتأكد من أنه لا يزال صالحًا. بالإضافة إلى ذلك ، يتم تعبئة _setup.xml في ملف .cpf الخاص به. تقوم كل من ملفات CAB و CPF بإضافة المفتاح إلى مخازن الشهادة "HKEY_LOCAL_MACHINE comm Security SystemCertificates" لذا تعرف على هذا. كمسألة تحذير ، قمت بتثبيته على متاجر شهادات الشهادات المميزة وغير المميزة والتجذينية. لكن برنامج تشغيل الجهاز لا يزال لا يتم تحميله في Device.exe عند حذاء الجهاز المحمول.

بخلاف الحل البديل لتطبيق بدء التشغيل الذي يستدعي ActivatedEvice () على السائق ، أشعر بالذهول حول كيفية تشغيل هذا السائق عند بدء التشغيل.

أجد أنه من الغريب للغاية أنه يعمل في CE5 ولكن ليس في WM6 ، لا أعرف أي شيء آخر يمكن أن يسبب مشاكل.

هل لدى أي شخص أي اقتراحات أخرى يمكن تجربتها.

كل مساعدة موضع تقدير.

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

المحلول

أنا أكثر دراية بـ Windows CE ، ولكن إليك بعض الأشياء:

  • هل أضفت طباعة تصحيح في وظيفة dllmain لمعرفة ما إذا كان يسمى؟
  • هل قمت بفحص استراحة التبعية. هل يمكن أن يكون لديك بطريقة أو بأخرى أن لديك DLL متاح بموجب CE 5 غير موجود تحت WM6؟

نصائح أخرى

هذه إجابة ، ولكن ليس "الصحيح". إنه مجرد عمل حول قضية التحميل. لقد اكتشفت ذلك منذ أكثر من أسبوع ، لكنني لم أرغب في استخدامه كحل. لذلك هذا هو مجرد إصلاح مؤقت.

يتم استخدام الكود التالي لتحميل برنامج التشغيل يدويًا ، مكتوبًا في C# باستخدام مكالمات C ++ ، فأنا معتاد على C# وهذا هو السبب في أنني قمت بمشروع C# ليس C ++ واحد. أولئك الذين يستخدمون C ++ سيقومون بلا شك بإنشاء هذا في تطبيق C ++.

public class LoadDriver
{
    [DllImport("coredll.dll", SetLastError = true)]
    public extern static IntPtr ActivateDevice(string lpszDevKey, int dwClientInfo);
    [DllImport("coredll.dll", SetLastError = true)]
    public static extern void SignalStarted( uint dw);

    public static void Main(string[] args)
    {
        Cursor.Current = Cursors.Default;
        IntPtr handle = ActivateDevice("Drivers\\BuiltIn\\A36D_GPS_COM", 0);
        if(handle != IntPtr.Zero)
        {
            Console.Write("Success");
        }

        if (args.Length > 0)
        {
            try
            {
                SignalStarted(uint.Parse(args[0]));
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

الآن لكي يعمل هذا ، يجب تشغيله عند بدء التشغيل ، لذلك أضفت في مفاتيح التسجيل المطلوبة.

"HKEY_LOCAL_MACHINE/init"
Launch62 = A36D_loaddriver.exe
Depend62 = "32 00"

"32 00" هو ضمان تحميله بعد shell32.exe

الآن عملية بدء الجهاز ، يتم تنشيط برنامج التشغيل في device.exe.

فيما يتعلق بمسألة التوقيع/التسجيل ، لا يزال هذا يتم النظر فيه.

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