FAQ DelphiConsultez toutes les FAQ
Nombre d'auteurs : 124, nombre de questions : 934, dernière mise à jour : 23 octobre 2024 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).
Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.
L'équipe Delphi de Developpez.com.
Déboguer une extension de Shell n'est pas beaucoup plus compliqué que pour une simple application. La difficulté majeure réside dans le fait que toutes les extensions sont chargées par le processus explorer.exe, et il y a donc quelques paramétrages à effectuer pour faciliter le débogage.
Tout d'abord au niveau de votre projet, ouvrez les options et dans la section "Lieur", cochez la case "Symboles de débogage distant", nécessaire pour le débugage d'applications COM.
N'oubliez pas de décocher cette case après débugage de votre extension, car elle implique la création d'exécutables plus volumineux.
Vous pouvez éventuellement cocher l'option "Utiliser DCUs de débogage" dans la section "Compilateur".
Une fois ces paramètres modifiés, reconstruisez l'intégralité de votre projet, et dans "Exécuter | Paramètres", indiquez "C:\Windows\Explorer.exe" dans "Application hôte", pour que Delphi charge votre extension avec le Shell Windows.
Il reste maintenant à configurer Windows, et ce, selon votre version.
Pour les versions antérieures à Windows 2000, il vous faut changer une valeur de la base de registre qui forcera à décharger votre DLL d'extension quand elle n'est plus utilisée, ce afin de ne pas avoir de problème lorsque vous la recompilerez. Sans cela, elle resterait interdite d'accès en écriture.
Créez une clef HKLM\Software\Microsoft\Windows\CurrentVersion\AlwaysUnloadDLL et affectez "1" à la valeur par défaut de cette clef.
Pour des raisons de performance, désactivez cette option une fois vos débogages terminés.
Pour recharger Explorer avec votre extension, voici une astuce qui fonctionne pour toutes les versions de Windows :
- Chargez votre projet dans Delphi
- Ouvrez la fenêtre de fermeture du système
- Cliquez sur "Non" (ou "Annuler" pour Windows 2000/XP) tout en pressant les touches Ctrl, Alt et Shift. Cela aura pour effet de décharger le Shell Windows, mais en laissant en exécution toutes les autres applications.
- Exécuter votre projet avec Delphi, il chargera Explorer tout en chargeant votre extension de Shell.
Bien que cette astuce fonctionne si vous possédez Windows NT/2000/XP ou ultérieur, le problème
peut se poser différemment : il vous suffit d'indiquer à Windows qu'il doit créer plusieurs
processus explorer.exe pour gérer le shell, le bureau, la barre de tâches etc. Pour cela :
- Créez la valeur HKLM\Software\Microsoft\Windows\CurrentVersion\DesktopProcess de type DWORD et affectez lui la valeur 1
- Quittez votre session et reconnectez vous
Toutes ces préparations étant faites, vous pouvez maintenant débuguer votre extension de shell, poser vos points d'arrêt etc.
Si vous arrêtez votre processus avec la commande "reset" (Ctrl+F2), Explorer sera normalement redémarré automatiquement. C'est là le comportement d'Explorer lorsqu'il est fermé anormalement. Pour le fermer proprement, utilisez l'astuce donnée ci-dessus.
Source : http://www.shellplus.com/debugging-s...ng-delphi.html
Pour cela, il suffit d'utiliser les fonctions ModifyMenu déclarée dans l'unité Windows.
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | procedure TForm1.FormCreate(Sender: TObject); var HandleSysMenu: hMenu; Begin {modifions le menu de la fenêtre :} {demandons le handle du menu afin de pouvoir nous adresser à lui} HandleSysMenu := GetSystemMenu(Handle, False); {modifions un élément du menu} ModifyMenu(HandleSysMenu, sc_Close, mf_ByCommand, sc_Close, '&Quitter mon application à moi'#9'Alt+F4'); {supprimons un élément du menu : dans le cas présent, « déplacement »} DeleteMenu(HandleSysMenu, Sc_Move, mf_ByCommand); {modifions le menu de l'application, en suivant le même principe :} HandleSysMenu := GetSystemMenu(application.handle,false); ModifyMenu(HandleSysMenu, sc_Close, mf_ByCommand, sc_Close, '&Quitter mon application à moi'#9'Alt+F4'); end; |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.