EXTENSION DU SHELL: MENU CONTEXTUEL EN C (WIN32 API)

Messages postés
627
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010
- - Dernière réponse : draluorg
Messages postés
627
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010
- 31 janv. 2009 à 19:54
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/48410-extension-du-shell-menu-contextuel-en-c-win32-api

draluorg
Messages postés
627
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010
-
Salut,

Merci pour cette jolie implementation en C :)

Juste un ptit truc, le GUID tu vas le chercher ou ?
A quoi correspondent ces valeurs:
CLSID_ShellExtension={0x6751504C,0xAE59,0x11DD,{0xB7,0x47,0x0,0xD,0x9D,0x95,0x33,0x2B}};

++
racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
7 -
Salut,
Le GUID n'est autre qu'un identificateur. Il permet d'identifier de manière unique un composant COM comme notre DLL. Je l'ai créé avec un générateur de GUID comme celui proposé parmi les sources de Brunews. Le mien est unique au monde car la DLL est destinée à être distribuée. Cela évite tout conflit possible avec un autre GUID, ayant la même valeur, déjà présent sur la base de registre. Si une DLL COM ne sera utilisée que sur un seul PC, un GUID local suffit.
draluorg
Messages postés
627
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010
-
Re,

Oui j'ai bien compris le principe, le probleme est que j'avais fais une extention shell en m'appuyant sur un exemple, mais quand j'ai voulu modifier le guid ca ne fonctionnait plus.
J'avais egalement utilisé le generateur de BruNews, mon erreur devait donc venir d'autre part...
Merci pour cette precision ;)

++
julienbj
Messages postés
458
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
5 -
Salut Racpp, je suis en train de développer une extension shell pour menu contextuel. Je me suis très fortement inspiré de tes 2 sources sur le sujet.

J'ai cependant un petit souci.
Lorsque j'enregistre la dll avec regsvr32, puis que je l'utilise, tout va bien.
Je veux ensuite la désenregister avec regsvr32 -u. La aussi, pas de problèmes. Enfin apparemment.
Si j'essaie de supprimer la dll, windows m'indique qu'elle est utilisée.
Pour le développement, je dois dire que c'est un peu pénible, fermer la session, se reconnecter, supprimer le fichier, et ce à chaque test...

J'ai testé avec ta dll, j'observe le même problème (il faut avoir visualisé le menu contextuel avec la nouvelle extension shell pour que le problème se manifeste).

Saurais-tu comment corriger cela?
Par la même occasion, y a-t-il un moyen pour déboguer une extension shell?
racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
7 -
julienbj >> C'est tout à fait normal et c'est ainsi avec toutes les extensions du shell car elles sont utilisées par l'explorateur Windows. Après un premier clic droit sur le bureau, ou sur le fond d'une fenêtre de l'explorateur, toutes les dlls des extensions du shell sont chargées par explorer.exe et ne seront déchargées, comme tu l'as remarqué, qu'après fermeture de la session courante. Pour les tests, il faut éviter d'utiliser le bureau. On peut tester sur des fenêtres de l'explorateur qui peuvent s'ouvrir chacune par un processus différent, après une petite modification dans la base de registres. Une fois, la fenêtre de test férmée, la dll sera automatiquement déchargée. Ouvre Regedit, vas dans la clé:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer
ajoute la chaine DesktopProcess de type REG_DWORD et lui assigne 1 comme valeur. La valeur 0 permet de faire l'inverse c'est à dire d'ouvrir les fenêtres de l'explorateur dans le même processus.
Pour automatiser l'opération, colle les lignes suivantes dans le Bloc-notes, enregistre avec l'extension .reg puis exécute le fichier:

REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer]
"DesktopProcess"=dword:00000001