Ajouter un élément de menu contextuel de l’explorateur pour les fichiers PDF à partir de delphi

J’ai mon application écrite en Delphi XE qui fonctionne avec des fichiers PDF. L’application est Win32. Au début, je voudrais m’assurer qu’il y a mon article dans le menu contextuel de l’explorateur pour les fichiers PDF. Je voudrais être en mesure de spécifier si elle doit être ajoutée uniquement pour les utilisateurs actifs ou pour tous les utilisateurs (avec UAC, je devrai redémarrer avec les privilèges d’administrateur, mais c’est correct).

J’ai commencé avec Comment associer un programme Delphi à un type de fichier, mais uniquement pour l’utilisateur actuel? et comment append un élément au menu de contenu de Windows Explorer dans delphi? . Je l’ai testé avec l’édition manuelle du registre via regedit et cela a bien fonctionné pour les “nouvelles” extensions. Mais pour .pdf, c’est plus compliqué car il sera probablement déjà présent dans le registre.

Sur mon PC, la clé .pdf fait référence à AcroExch.Document. Mais l’ajout de la sous-clé shell / quelque chose à la clé AcroExch.Document ne fonctionne pas car il a une sous-clé CurVer faisant référence à AcroExch.Document.7. Cependant, un autre PC avec une autre version d’Acrobat avait des noms un peu différents. Ce n’est pas un problème pour moi de suivre la référence CurVer mais est-ce une approche correcte? Et qu’en est-il de la situation où aucun lecteur PDF n’est installé, comment nommer mes clés pour qu’Acrobat ne les écrase pas une fois installé?

Mais la question la plus pressante est de savoir dans quelle racine dois-je mettre mes clés? Comment associer un programme Delphi à un type de fichier, mais uniquement pour l’utilisateur actuel? mentionne HKLM (machine locale) et HKCU (utilisateur actuel). Cela semble plutôt simple mais je ne parviens pas à définir les valeurs de Delphi dans HKLM. Curieusement, je peux créer des clés:

var reg:TRegistry; key := '\Software\Classes\'+keyname+'\shell\'+name+'\command'; reg.CreateKey(key); 

mais j’obtiens l’access refusé en essayant d’écrire la valeur réelle:

 reg.OpenKey(key,false); reg.WriteSsortingng('',command); 

Je reçois la même exception Access Denied même sur WinXP, peu importe si l’application s’exécute en tant qu’Admin (Win7), j’ai même essayé de définir des permissions (Tout le monde contrôle) pour la clé via regedit (je peux modifier la valeur via regedit sans problèmes). J’ai essayé de créer le registre avec différents modes d’access, le tout sans succès:

 reg := TRegistry.Create(KEY_WRITE or KEY_WOW64_64KEY); reg := TRegistry.Create(KEY_ALL_ACCESS or KEY_WOW64_64KEY); reg.Access := KEY_ALL_ACCESS; reg.Access := KEY_WRITE or KEY_WOW64_64KEY; reg.Access := KEY_ALL_ACCESS or KEY_WOW64_64KEY; 

Avec HKCU, tout fonctionne bien.

J’ai donc essayé d’écrire dans HKEY_CLASSES_ROOT et cela fonctionne et met en fait les clés exactement où je veux (dans HKLM) si je cours en tant qu’Admin. Mais selon http://msdn.microsoft.com/en-us/library/windows/desktop/ms724475.aspx

La clé HKEY_CLASSES_ROOT (HKCR) contient des associations d’extension de nom de fichier et des informations d’enregistrement de classe COM telles que ProgID, CLSID et IID. Il est principalement destiné à la compatibilité avec le registre dans Windows 16 bits.

Je n’aime pas la note à propos de l’objective principal étant la compatibilité avec Windows 16 bits. Et les conditions réelles dans lesquelles les changements seront écrits sont plus compliquées que je le souhaiterais.

Donc, fondamentalement, j’ai ces questions:

  • Quel est l’avantage d’utiliser AcroExch.Document et CurVer au lieu de pointer directement sur AcroExch.Document.7? Et quelles sont les “meilleures manières” quand j’ajoute mes clés dans cette structure? Qu’en est-il du cas où le .pdf n’est pas encore associé à quoi que ce soit?

  • Où dois-je mettre mes clés et pourquoi je ne peux pas écrire dans HKLM?

Modifier: le problème de l’access refusé lors de l’écriture sur HKLM était dû à mon erreur. J’ai déjà utilisé openKeyReadOnly et je n’ai pas remarqué que la propriété Access serait en lecture seule pour tous les appels suivants.

Vous avez posé deux questions distinctes. Puisque je connais la réponse à l’un et pas à l’autre, je vais répondre à une seule question. Pour référence future, je vous recommande de poser une seule question à la fois.

Où devrais-je mettre mes clés?

Vous avez raison de discerner que vous ne devriez pas utiliser HKCR . La documentation pour HKCR dit:

Les informations d’enregistrement de classe et d’extension de nom de fichier sont stockées sous les clés HKEY_LOCAL_MACHINE et HKEY_CURRENT_USER. La clé HKEY_LOCAL_MACHINE \ Software \ Classes contient des parameters par défaut pouvant s’appliquer à tous les utilisateurs de l’ordinateur local. La clé HKEY_CURRENT_USER \ Software \ Classes contient des parameters qui s’appliquent uniquement à l’utilisateur interactif. La clé HKEY_CLASSES_ROOT fournit une vue du registre qui fusionne les informations provenant de ces deux sources. HKEY_CLASSES_ROOT fournit également cette vue fusionnée pour les applications conçues pour les versions précédentes de Windows.

….

Si vous écrivez des clés dans une clé sous HKEY_CLASSES_ROOT, le système stocke les informations sous HKEY_LOCAL_MACHINE \ Software \ Classes. Si vous écrivez des valeurs dans une clé sous HKEY_CLASSES_ROOT et que la clé existe déjà sous HKEY_CURRENT_USER \ Software \ Classes, le système stockera les informations au lieu de sous HKEY_LOCAL_MACHINE \ Software \ Classes.

Il est donc raisonnable d’utiliser HKCR pour la lecture, mais pour l’écriture, vous devez généralement contrôler si vous souhaitez écrire sur HKLM ou HKCU . Et cela signifie que vous ne pouvez pas écrire à HKCR .

Par conséquent, écrivez dans HKLM\Software\Classes pour les parameters à l’échelle de la machine et HKCU\Software\Classes pour les parameters spécifiques à l’utilisateur.

Notez que dans Windows 7 et versions ultérieures, aucune de ces clés n’est redirigée et vous n’avez donc pas à vous soucier de l’utilisation de KEY_WOW64_64KEY . Cependant, dans Vista et XP64, ainsi que dans les éditions de serveur équivalentes, ces clés sont redirigées et réfléchies. Ce qui signifie qu’il pourrait être prudent d’utiliser KEY_WOW64_64KEY .

Pour répondre à votre autre question, si Adobe n’est pas encore installé, les clés PDF n’existeront probablement pas encore dans le Registre. Vous devrez donc créer vos propres clés .pdf et ProgID pour pouvoir y joindre votre commande Shell. Si Adobe est installé par la suite, il est probable que vous effaciez vos clés et que vous les remplaciez par vos propres clés. Vous devrez donc recréer votre commande Shell dans la structure de clés d’Adobe. Votre application peut interroger le Registre pour vérifier cette condition périodiquement, par exemple au démarrage.