سؤال

أنا أعمل على نظام WinCE 6.0 مزود بشاشة تعمل باللمس تقوم بتخزين بيانات المعايرة الخاصة به (موقع x-y، والإزاحة، وما إلى ذلك) في سجل النظام (HKLM\HARDWARE OUCH).الآن، أقوم بوضع قيم cal في مفاتيح التسجيل التي يتم وضعها في صورة نظام التشغيل في وقت الإنشاء.يعمل هذا بشكل جيد مع الشاشة التي أحصل على قيم cal الأصلية منها، ولكن عندما أقوم بتحميل هذه الصورة إلى نظام آخر باستخدام شاشة مختلفة، يكون موقع مؤشر شاشة اللمس متوقفًا (بشكل مفهوم)، لأن الشاشتين ليس لهما نفس قيم cal .

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

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

قد تكون طريقة C# المعروفة للعمل في CE6.0 مفيدة.شكرًا.

-أودباستا

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

المحلول

أعتقد أن ما تبحث عنه على الأرجح هو وظيفة Flush لفئة RegistryKey.هذا ليس ضروريًا عادةً (يتم مسح السجل ببطء بشكل افتراضي)، ولكن إذا تم إيقاف تشغيل الطاقة على الجهاز قبل أن تتاح للنظام فرصة القيام بذلك، فسيتم تجاهل التغييرات:

http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.flush.aspx

تتوفر هذه الوظيفة في الإصدار 2.0 من .NET Compact Framework والإصدارات الأحدث.

نصائح أخرى

متابعة لهذا السؤال:

شكرًا DannySmurf، كان مسح مفتاح التسجيل هو ما يجب القيام به في النهاية.ومع ذلك، كانت هناك بعض الخطوات التي كنت أفتقدها قبل الوصول إلى تلك المرحلة.إذن، إليك ما ظهر إلى النور:

  • كنت أستخدم سجلاً يستند إلى ذاكرة الوصول العشوائي (RAM)، حيث لا يستمر التسجيل حسب التصميم بعد التشغيل البارد.اضطررت إلى تبديل التسجيل إلى الخلية.
  • عند التبديل إلى بنية التسجيل المستندة إلى الخلية، تحتاج إلى التأكد من وجود الخلية على وسيط غير متطاير.تم تحديد ذلك في ملف Platform.reg:

    [HKEY_LOCAL_MACHINE\init\BootVars]
    "SystemHive"="\\Hard Disk\\system.hv"
    "ProfileDir"="\\Documents and Settings"
    "RegistryFlags"=dword:1               ; Flush hive on every RegCloseKey call
    "SystemHiveInitialSize"=dword:19000   ; Initial size for hive-registry file 
    "Start DevMgr"=dword:1
    
  • بمجرد وجود ملف system.hv على القرص الصلب (بطاقة CF في حالتي)، ستستمر القيم الموجودة في السجل بعد التشغيل البارد.لاحظ أن ملف system.hv يحتوي على كافة مفاتيح HKLM.

  • من المهم أيضًا ملاحظة أنه يجب تحديد أي برامج تشغيل تحتاج إلى التهيئة عند التمهيد على هذا النحو في ملفات .reg الخاصة بالحل.على سبيل المثال، كان علي التأكد من تحميل برامج تشغيل القرص الصلب (PCMCIA) قبل محاولة قراءة ملف خلية النظام منها.طريقة القيام بذلك هي إضافة توجيه بالتنسيق التالي حول كل مفتاح تشغيل لبرنامج التشغيل:

    ;HIVE BOOT SECTION
    [HKEY_LOCAL_MACHINE\Drivers\PCCARD\PCMCIA\TEMPLATE\PCMCIA]
      "Dll"="pcmcia.dll"
      "NoConfig"=dword:1
      "IClass"=multi_sz:"{6BEAB08A-8914-42fd-B33F-61968B9AAB32}=PCMCIA Card Services"
      "Flags"=dword:1000
    ;END HIVE BOOT SECTION
    

هذا، بالإضافة إلى الكثير من الحظ، هو ما يتعلق بهذا الأمر.

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

باستخدام Microsoft.Win32؛

    /// <summary>
    /// store a key value in registry. if it don't exist it will be created. 
    /// </summary>
    /// <param name="mainKey">the main key of key path</param>
    /// <param name="subKey">the path below the main key</param>
    /// <param name="keyName">the key name</param>
    /// <param name="value">the value to be stored</param>
    public static void SetRegistry(int mainKey, String subKey, String keyName, object value)
    {
        if (mainKey != CURRENT_USER && mainKey != LOCAL_MACHINE)
        {
            throw new ArgumentOutOfRangeException("mainKey", "\'mainKey\' argument can only be AppUtils.CURRENT_USER or AppUtils.LOCAL_MACHINE values");
        }

        if (subKey == null)
        {
            throw new ArgumentNullException("subKey", "\'subKey\' argument cannot be null");
        }

        if (keyName == null)
        {
            throw new ArgumentNullException("keyName", "\'keyName\' argument cannot be null");
        }

        const Boolean WRITABLE = true;
        RegistryKey key = null;

        if (mainKey == CURRENT_USER)
        {
            key = Registry.CurrentUser.OpenSubKey(subKey, WRITABLE);

            if (key == null)
            {
                key = Registry.CurrentUser.CreateSubKey(subKey);
            }
        }
        else if (mainKey == LOCAL_MACHINE)
        {
            key = Registry.LocalMachine.OpenSubKey(subKey, WRITABLE);

            if (key == null)
            {
                key = Registry.LocalMachine.CreateSubKey(subKey);
            }
        }

        key.SetValue(keyName, value);

    }

    /// <summary>
    /// find a key value in registry. if it don't exist the default value will be returned.
    /// </summary>
    /// <param name="mainKey">the main key of key path</param>
    /// <param name="subKey">the path below the main key</param>
    /// <param name="keyName">the key name</param>
    /// <param name="defaultValue">the value to be stored</param>

    public static object GetRegistry(int mainKey, String subKey, String keyName, object defaultValue)
    {
        if (mainKey != CURRENT_USER && mainKey != LOCAL_MACHINE)
        {
            throw new ArgumentOutOfRangeException("mainKey", "\'mainKey\' argument can only be AppUtils.CURRENT_USER or AppUtils.LOCAL_MACHINE values");
        }

        if (subKey == null)
        {
            throw new ArgumentNullException("subKey", "\'subKey\' argument cannot be null");
        }

        if (keyName == null)
        {
            throw new ArgumentNullException("keyName", "\'keyName\' argument cannot be null");
        }

        RegistryKey key = Registry.CurrentUser.OpenSubKey(subKey);

        if (mainKey == CURRENT_USER)
        {
            key = Registry.CurrentUser.OpenSubKey(subKey);
        }
        else if (mainKey == LOCAL_MACHINE)
        {
            key = Registry.LocalMachine.OpenSubKey(subKey);
        }

        object result = defaultValue;

        if (key != null)
        {
            result = key.GetValue(keyName, defaultValue);
        }

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