Question

Je travaille sur un système WinCE 6.0 avec un écran tactile qui stocke ses données d'étalonnage (emplacement x-y, décalage, etc.) dans le registre système (HKLM\HARDWARE OUCH).À l'heure actuelle, je place les valeurs cal dans des clés de registre qui sont placées dans l'image du système d'exploitation au moment de la construction.Cela fonctionne bien pour le moniteur à partir duquel j'obtiens les valeurs cal d'origine, mais lorsque je charge cette image dans un autre système avec un moniteur différent, l'emplacement du pointeur de l'écran tactile est (naturellement) désactivé, car les deux moniteurs n'ont pas les mêmes valeurs cal. .

Mon problème est que je ne sais pas comment stocker correctement les valeurs dans le registre afin qu'elles persistent après un cycle d'alimentation.Vous voyez, je peux recalibrer l'écran sur le deuxième système, mais les nouvelles valeurs n'existent qu'en mémoire volatile.J'ai suggéré à mon patron que nous pourrions simplement dire à notre client de laisser l'appareil sous tension à tout moment - cela n'a pas été bien accueilli.

J'ai besoin de conseils sur la façon d'enregistrer les nouvelles constantes dans le registre, afin que nous puissions calibrer les moniteurs une fois avant de les expédier à notre client, sans avoir à créer des images de système d'exploitation distinctes pour chaque unité que nous construisons.

Une méthode C# connue pour fonctionner dans CE6.0 serait utile.Merci.

-Odbasta

Était-ce utile?

La solution

Je pense que ce que vous recherchez probablement, c'est la fonction Flush de la classe RegistryKey.Cela n'est normalement pas nécessaire (le registre est vidé paresseusement par défaut), mais si l'alimentation est coupée sur l'appareil avant que le système n'ait la possibilité de le faire, les modifications seront ignorées :

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

Cette fonction est disponible dans .NET Compact Framework version 2.0 et supérieure.

Autres conseils

Suivi de cette question :

Merci DannySmurf, vider la clé de registre était finalement ce qu'il fallait faire.Cependant, il me manquait quelques étapes avant d’en arriver là.Voici donc ce qui s'est révélé :

  • J'utilisais un registre basé sur la RAM, où, de par sa conception, le registre ne persiste pas après un démarrage à froid.J'ai dû basculer le registre sur la ruche.
  • Lorsque vous passez à une structure de registre basée sur une ruche, vous devez vous assurer que la ruche existe sur un support non volatile.Ceci est spécifié dans le fichier 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
    
  • Une fois le fichier system.hv sur le disque dur (carte CF dans mon cas), les valeurs du registre persisteront après un démarrage à froid.Notez que le fichier system.hv contient toutes les clés HKLM.

  • Il est également important de noter que tous les pilotes qui doivent être initialisés au démarrage doivent être spécifiés comme tels dans les fichiers .reg de la solution.Par exemple, je devais m'assurer que les pilotes du disque dur (PCMCIA) étaient chargés avant d'essayer de lire le fichier ruche du système à partir d'eux.La façon de procéder consiste à ajouter une directive au format suivant autour de chaque clé d'initialisation du pilote :

    ;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
    

C'est tout, avec beaucoup de chance.

Si j'ai bien compris, vous devez savoir comment définir une valeur dans le registre pendant l'exécution.J'espère que les codes ci-dessous pourront vous aider.

en utilisant 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;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top