Pregunta

Estoy trabajando en un sistema WinCE 6.0 con una pantalla táctil que almacena sus datos de calibración (ubicación x-y, compensación, etc.) en el registro del sistema (HKLM\HARDWARE OUCH).En este momento, estoy colocando los valores cal en claves de registro que se colocan en la imagen del sistema operativo en el momento de la compilación.Eso funciona bien para el monitor del que obtengo los valores de calibración originales, pero cuando cargo esta imagen en otro sistema con un monitor diferente, la ubicación del puntero de la pantalla táctil está (comprensiblemente) apagada, porque los dos monitores no tienen los mismos valores de calibración. .

Mi problema es que no sé cómo almacenar correctamente los valores en el registro para que persistan después de un ciclo de encendido.Mira, puedo recalibrar la pantalla en el segundo sistema, pero los nuevos valores sólo existen en la memoria volátil.Le sugerí a mi jefe que podíamos simplemente decirle a nuestro cliente que dejara la unidad encendida en todo momento; eso no funcionó bien.

Necesito consejos sobre cómo guardar las nuevas constantes en el registro, para que podamos calibrar los monitores una vez antes de enviarlos a nuestro cliente y no tener que crear imágenes de sistema operativo separadas para cada unidad que construimos.

Sería útil un método de C# que se sepa que funciona en CE6.0.Gracias.

-Odbasta

¿Fue útil?

Solución

Creo que lo que probablemente estés buscando es la función Flush de la clase RegistryKey.Normalmente, esto no es necesario (el registro se limpia lentamente de forma predeterminada), pero si se apaga el dispositivo antes de que el sistema tenga la oportunidad de hacerlo, los cambios se descartarán:

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

Esta función está disponible en .NET Compact Framework versión 2.0 y superiores.

Otros consejos

Seguimiento de esta pregunta:

Gracias DannySmurf, en última instancia, lo que había que hacer era vaciar la clave de registro.Sin embargo, faltaban algunos pasos antes de llegar a esa etapa.Entonces, esto es lo que salió a la luz:

  • Estaba usando un registro basado en RAM, donde por diseño el registro no persiste después de un arranque en frío.Tuve que cambiar el registro a basado en colmena.
  • Al cambiar a una estructura de registro basada en colmena, debe asegurarse de que la colmena exista en un medio no volátil.Esto se especifica en el archivo 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
    
  • Una vez que el archivo system.hv esté en el disco duro (tarjeta CF en mi caso), los valores en el registro persistirán después de un arranque en frío.Tenga en cuenta que el archivo system.hv contiene todas las claves HKLM.

  • También es importante tener en cuenta que cualquier controlador que deba inicializarse durante el arranque debe especificarse como tal en los archivos .reg de la solución.Por ejemplo, tuve que asegurarme de que los controladores del disco duro (PCMCIA) estuvieran cargados antes de intentar leer el archivo de subárbol del sistema desde ellos.La forma de hacerlo es agregar una directiva en el siguiente formato alrededor de cada clave de inicio del controlador:

    ;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
    

Eso, más mucha suerte, es todo.

Según tengo entendido, necesitas saber cómo establecer un valor en el registro durante el tiempo de ejecución.Espero que los códigos a continuación puedan ayudarte.

utilizando 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;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top