Сохраните значения реестра в WinCE, используя приложение C # - PullRequest
3 голосов
/ 12 сентября 2008

Я работаю в системе WinCE 6.0 с сенсорным экраном, который сохраняет свои данные калибровки (координаты x-y, смещение и т. Д.) В системном реестре (HKLM \ HARDWARE \ TOUCH). Прямо сейчас я помещаю значения cal в ключи реестра, которые помещаются в образ ОС во время сборки. Это прекрасно работает для монитора, с которого я получаю исходные значения калибровки, но когда я загружаю это изображение в другую систему с другим монитором, расположение указателя сенсорного экрана (понятно) отключено, поскольку два монитора не имеют одинаковые значения калибровки .

Моя проблема в том, что я не знаю, как правильно хранить значения в реестре, чтобы они сохранялись после цикла питания. Видите, я могу откалибровать экран во второй системе, но новые значения существуют только в энергозависимой памяти. Я предложил своему боссу, чтобы мы могли просто попросить нашего клиента постоянно включать устройство - это не очень хорошо.

Мне нужен совет о том, как сохранить новые константы в реестре, чтобы мы могли откалибровать мониторы один раз, прежде чем отправлять их нашему клиенту, и не создавать отдельные образы ОС для каждого создаваемого нами блока.

Было бы полезно использовать метод C #, который, как известно, работает в CE6.0. Спасибо.

-Odbasta

Ответы [ 3 ]

5 голосов
/ 13 сентября 2008

Последующие меры по этому вопросу:

Спасибо DannySmurf, в конечном итоге очистка ключа реестра - это то, что нужно было сделать. Тем не менее, было несколько шагов, которые я пропустил до достижения этой стадии. Итак, вот что вышло на свет:

  • Я использовал реестр на основе ОЗУ, где по замыслу реестр не сохраняется после холодной загрузки. Мне пришлось переключить реестр на основе улья.
  • При переключении на структуру реестра на основе кустов необходимо убедиться, что куст существует на энергонезависимой среде. Это указано в файле 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
    

Это, плюс много удачи, об этом.

3 голосов
/ 12 сентября 2008

Я думаю, что вы, вероятно, ищете функцию Flush класса RegistryKey. Обычно это не требуется (реестр по умолчанию лениво сбрасывается), но если питание устройства отключено до того, как система сможет это сделать, изменения будут отменены:

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

Эта функция доступна в .NET Compact Framework версии 2.0 и выше.

0 голосов
/ 16 сентября 2008

Как я понял, вам нужно знать, как установить значение для реестра во время выполнения. Я надеюсь, что приведенные ниже коды помогут вам.

с использованием 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;
    }
...