43 votes

Créer une entrée de registre pour associer l'extension de fichier à l'application en C ++

Je voudrais savoir la façon la plus propre de l'enregistrement d'une extension de fichier avec mon application C++ de sorte que quand un fichier de données associé avec mon programme est double-cliqué sur l'icône, l'application est ouverte et le nom est passé en paramètre à l'application.

Actuellement, je le fais à travers mes wix programme d'installation, mais il ya certains cas où la demande ne sera pas installé sur sat ordinateur de l'utilisateur, donc j'ai aussi besoin de l'option de créer la clé de registre via l'application.

En outre, cela signifie également que si l'application est supprimée, toutes les entrées non utilisées dans le registre sera laissé traîner?

84voto

Factor Mystic Points 12465

Votre vue d'ensemble du processus est trouvé dans cet article MSDN. Les pièces principales sont en bas de la liste:

  • Enregistrer le ProgID

Un ProgID (essentiellement, le type de fichier de la clé de registre) est ce qui contient les fichiers importants de votre type de propriétés, comme l'icône, la description et les éléments de menu contextuel, y compris l'application utilisée lorsque le fichier est un double-clique. De nombreuses extensions peuvent avoir le même type de fichier. Cette cartographie est réalisée à l'étape suivante:

  • Registre de l'extension de nom de fichier pour le type de fichier

Ici, vous définissez une valeur de registre de votre extension, le réglage de l'extension du type de fichier à l'identificateur de Programme que vous avez créé à l'étape précédente.

Le montant minimum de travail nécessaire pour obtenir un fichier pour l'ouvrir avec votre application est le réglage/la création de deux clés de registre. Dans cet exemple, .reg le fichier, j'ai créer un fichier de type (blergcorp.blergapp.v1) et de l'association de l'extension de fichier (.blerg) avec elle.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\blergcorp.blergapp.v1\shell\open\command]
@="c:\path\to\app.exe \"%1\""
[HKEY_CURRENT_USER\Software\Classes\.blerg]
@="blergcorp.blergapp.v1"

Maintenant, vous voulez probablement pour accomplir ce programme. Pour être absolument casher, vous pouvez le vérifier l'existence de ces touches, et de modifier le comportement du programme en conséquence, surtout si vous êtes en supposant que le contrôle de certaines communes de l'extension de fichier. Cependant, l'objectif peut être réalisé par la création de ces deux touches à l'aide de la fonction SetValue.

Je ne suis pas positif exacte de la syntaxe C++, mais en C# la syntaxe ressemble à ceci:

Registry.SetValue(@"HKEY_CURRENT_USER\Software\Classes\blergcorp.blergapp.v1\shell\open\command", null, @"c:\path\to\app.exe \"%1\"");
Registry.SetValue(@"HKEY_CURRENT_USER\Software\Classes\.blerg", null, "blergcorp.blergapp.v1");

Bien sûr, vous pourriez ouvrir manuellement chaque sous-clé, créez manuellement le ProgID et l'extension de la sous-clé, et puis définissez la valeur de la clé, mais une belle chose à propos de l' SetValue de la fonction, c'est que si les touches ou les valeurs n'existent pas, ils seront automatiquement créés. Très pratique.

Maintenant, un petit mot à propos de laquelle la ruche à utiliser. Beaucoup d'association de fichier dans les exemples en ligne, notamment sur MSDN, montrer ces touches en HKEY_CLASSES_ROOT. Je ne recommande pas de faire cela. Que la ruche est une fusion, vue virtuelle de HKEY_LOCAL_MACHINE\Software\Classes (les valeurs par défaut du système) et HKEY_CURRENT_USER\Software\Classes (les paramètres de l'utilisateur), et écrit à une sous-clé dans la ruche sont redirigés vers la même clé, en HKEY_LOCAL_MACHINE\Software\Classes. Maintenant, il n'y a aucun problème à faire cela, mais vous pouvez rencontrer ce genre de problème: Si vous écrivez à HKCR (redirigé HKLM), et l'utilisateur a spécifié les mêmes clés avec des valeurs différentes dans HKCU, la HKCU valeurs l'emportent. Par conséquent, votre écrit réussira, mais vous ne verrez pas de changement, car HKEY_CURRENT_USER paramètres priment HKEY_LOCAL_MACHINE paramètres.

Par conséquent, vous devez prendre cela en considération lors de la conception de votre application. Maintenant, sur le revers de la médaille, vous pouvez écrire à seulement HKEY_CURRENT_USER, que mes exemples ici montrent. Cependant, cette association de fichier réglage ne sera chargée de l'utilisateur actuel, et si votre demande a été installé pour tous les utilisateurs, votre application ne se lance pas quand cet autre utilisateur ouvre le fichier dans Windows.

Que devrait être un décent apprêt pour ce que vous voulez faire. Pour plus de lecture, je suggère

Et voir aussi mon semblable réponse à une question similaire:

8voto

fireattack Points 1

Je ne sais pas pourquoi ppl continue de parler de la valeur par défaut de HKEY_CURRENT_USER\Software\Classes\<.ext> (qui vous redirigera vers une autre classe (créée par logiciel).

Cela fonctionne, mais il sera remplacé par

 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\<.ext>\UserChoice
 

Et je crois que Microsoft recommande la deuxième pratique, car c'est ce que fait le "open with" intégré. La valeur de la touche Progid "est égale à la valeur par défaut de HKEY_CURRENT_USER\Software\Classes\<.ext> dans ce cas.

7voto

beermann Points 361

C'est un processus en deux étapes:

 1. Définir un programme qui prendrait en charge de l'extension: (sauf si vous souhaitez utiliser un existant)
 1.1 créer une clé "HKEY_CURRENT_USER\\Software\\Classes\\" par exemple 
"Logiciel\\Classes\\YourProgramName.fichier.ext"
 1.2 créer une sous-clé "Software\\Classes\\YourProgramName.fichier.ext\\DefaultIcon"
 1.2.1 définir la valeur par défaut ("") à votre application en plein de chemin pour obtenir
 icône de ressources
 1.3 créer une sous-clé de "Software\\Classes\\YourProgramName.fichier.ext\\Shell\\OperationName\\Command"
 OperationName = par exemple d'Ouvrir, d'Impression ou d'Autres
 1.3.1 définir la valeur par défaut ("") pour votre demande de chemin d'accès complet +en option exécution params (nom de fichier)

2.Associer une extension de fichier avec le programme.
 2.1 créer une clé HKCU\\Software\\Classes\\.ext - ici, va votre extension
 2.2 définir la valeur par défaut pour le programme de la définition de la clé
("YourProgramName.fichier.ext")

Ci-dessous est une partie du programme écrit en c# qui associe l'extension de fichier. C'est pas du c++ mais je pense que c'est assez simple à expliquer lui-même et autant que je sache, il est verv simmilar si pas identique au code en c++

1.


    RegistryKey keyPFCTExt0 = Registry.CurrentUser.OpenSubKey("Software\\Classes\\PFCT.file.enc", true);
        if (keyPFCTExt0 == null)
        {
            keyPFCTExt0 = Registry.CurrentUser.CreateSubKey("Software\\Classes\\PFCT.file.enc");
            keyPFCTExt0.CreateSubKey("DefaultIcon");
        	    RegistryKey keyPFCTExt0ext = Registry.CurrentUser.OpenSubKey("Software\\Classes\\PFCT.file.enc\\DefaultIcon", true);
        			keyPFCTExt0ext.SetValue("", Application.ExecutablePath +",0");
                keyPFCTExt0ext.Close();
            keyPFCTExt0.CreateSubKey("Shell\\PFCT_Decrypt\\Command");
        }
    keyPFCTExt0.SetValue("", "PFCT.file.enc");
    keyPFCTExt0.Close();

2.


    RegistryKey keyPFCTExt1 = Registry.CurrentUser.OpenSubKey("Software\\Classes\\PFCT.file.enc\\Shell\\PFCT_Decrypt\\Command", true);
        if (keyPFCTExt1 == null)
            keyPFCTExt1 = Registry.CurrentUser.CreateSubKey("Software\\Classes\\PFCT.file.enc\\Shell\\PFCT_Decrypt\\Command");
        keyPFCTExt1.SetValue("", Application.ExecutablePath + " !d %1"); //!d %1 are optional params, here !d string and full file path
        keyPFCTExt1.Close(); 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X