Appeler les commandes RunDLL32 avec un ShellExecute

Le
WonderMan
Bonjour,

J'ai développé un logiciel en C++ avec lequel je souhaiterais lancer
quelques commandes système.

J'ai programmé en particulier un bouton qui permet de faire un
ShellExecute, et je pensais pouvoir lui passer l'une des commandes
décrites sur cette page (par exemple) :
http://www.progmatique.fr/article-62-Rundll.html

mais j'ai à chaque fois des messages d'erreur qui s'affiche.
Ainsi, avec : rundll32 shell,shellexecute
j'obtiens le message : Windows cannot find 'rundll32
shell,shellexecute'

Si je colle la même ligne (rundll32 shell,shellexecute) dans la boite
"Exécuter" de Windows (accessible par le menu Démarrer), j'obtiens le
message : 'The application or DLL C:WINDOWSSystem32shell.dll is not
a valid windows image'

Bref, y a t-il une syntaxe particulière à utiliser pour que cela puisse
fonctionner ?

Pour info, je travaille sous XP professionnel en version anglaise.

Merci de votre aide.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
jerome
Le #9741081
WonderMan wrote:
Bonjour,

J'ai développé un logiciel en C++ avec lequel je souhaiterais lancer
quelques commandes système.

J'ai programmé en particulier un bouton qui permet de faire un
ShellExecute, et je pensais pouvoir lui passer l'une des commandes
décrites sur cette page (par exemple) :
http://www.progmatique.fr/article-62-Rundll.html

mais j'ai à chaque fois des messages d'erreur qui s'affiche.
Ainsi, avec : rundll32 shell,shellexecute
j'obtiens le message : Windows cannot find 'rundll32 shell,shellexecute'

Si je colle la même ligne (rundll32 shell,shellexecute) dans la boite
"Exécuter" de Windows (accessible par le menu Démarrer), j'obtiens le
message : 'The application or DLL C:WINDOWSSystem32shell.dll is not a
valid windows image'



C'est normal, il y a plein de commandes windows 95-98 sur cete page.
le mec a fait du copier-coller à droite-à gauche sans rien comprendre :-)
WonderMan
Le #9741071
jerome a émis l'idée suivante :
WonderMan wrote:
Bonjour,

J'ai développé un logiciel en C++ avec lequel je souhaiterais lancer
quelques commandes système.

J'ai programmé en particulier un bouton qui permet de faire un
ShellExecute, et je pensais pouvoir lui passer l'une des commandes décrites
sur cette page (par exemple) :
http://www.progmatique.fr/article-62-Rundll.html

mais j'ai à chaque fois des messages d'erreur qui s'affiche.
Ainsi, avec : rundll32 shell,shellexecute
j'obtiens le message : Windows cannot find 'rundll32 shell,shellexecute'

Si je colle la même ligne (rundll32 shell,shellexecute) dans la boite
"Exécuter" de Windows (accessible par le menu Démarrer), j'obtiens le
message : 'The application or DLL C:WINDOWSSystem32shell.dll is not a
valid windows image'



C'est normal, il y a plein de commandes windows 95-98 sur cete page.
le mec a fait du copier-coller à droite-à gauche sans rien comprendre :-)



Merci.
Bon, et bien je viens d'essayer :

RUNDLL32.EXE SHELL32.DLL,Control_RunDLL desk.cpl,,0

tiré de la page : http://vlaurie.com/computers2/Articles/rundll32.htm
Ca marche en passant par la commande Executer de Windows, mais toujours
pas avec ShellExecute.

Je ne vois toujours pas quelle est la syntaxe à utiliser ?
Christian ASTOR
Le #9741061
WonderMan wrote:


Bon, et bien je viens d'essayer :

RUNDLL32.EXE SHELL32.DLL,Control_RunDLL desk.cpl,,0

tiré de la page : http://vlaurie.com/computers2/Articles/rundll32.htm
Ca marche en passant par la commande Executer de Windows, mais toujours
pas avec ShellExecute.

Je ne vois toujours pas quelle est la syntaxe à utiliser ?



La syntaxe de la doc =>
ShellExecute(NULL, "open", "rundll32.exe", "SHELL32.DLL,Control_RunDLL
desk.cpl,,0", "",SW_SHOW);
Jean-Claude BELLAMY
Le #9741051
"WonderMan" news:
[...]
Bon, et bien je viens d'essayer :

RUNDLL32.EXE SHELL32.DLL,Control_RunDLL desk.cpl,,0

tiré de la page : http://vlaurie.com/computers2/Articles/rundll32.htm
Ca marche en passant par la commande Executer de Windows, mais toujours
pas avec ShellExecute.

Je ne vois toujours pas quelle est la syntaxe à utiliser ?



Rundll32 charge et exécute dynamiquement CERTAINES DLL qui doivent répondre
à certains CRITÈRES .
De plus, la SYNTAXE d'exécution de "rundll32" est TRÈS STRICTE .

SYNTAXE
====== RUNDLL32.EXE <nom_de_dll>,<point_d_entree> <arguments optionels>

1)nom_de_dll
------------
Comporte ou non le chemin complet de la DLL
(tout dépend de sa localisation, si son répertoire fait partie ou non de la
variable d'environnement PATH)

ATTENTION : pour éviter tout pb, ce nom doit être le NOM COURT !!!
Aucun espace ou caractère "folklo" n'est autorisé !
p.ex. , si on veut appeller la DLL suivante
D:Program FilesMicrosoft OfficeOfficeautoclip.dll
il faudra taper (p.ex.) :
rundll32 d:PROGRA~1MICROS~1OFFICEautoclip.dll,ACBeginSearch

2)La VIRGULE
------------
Placée entre le nom de la dll et le point d'entrée, elle est TRES
IMPORTANTE.
Elle doit être "collée" entre eux, sans aucun espace.

3)Le point d'entrée
-------------------
C'est le nom de la fonction appelée dans la DLL.
(Application Programming Interface)

Prototype de cette fonction :
void CALLBACK
point_d_entree(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int
nCmdShow);

NB: sous NT, le "point_d_entree" pourra être double :
- un suivi de "W", (UNICODE)
- un suivi de "A", (ANSI)

Paramètres du point d'entrée de la DLL
===================================== hwnd :
handle de fenêtre propriétaire des autres fenêtres de la DLL
hinst :
handle d'instance de la DLL
lpszCmdLine :
chaine ASCIIZ de paramètres
nCmdShow :
flag d'affichage de la fenêtre éventuellement affichée
0 = cachée
1 = normal
2 = iconifiée
3 = maximale
...

Exemple :
RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:WINDOWSINFSHELL.INF

-> Rundll appelle l'API "InstallHinfSection()" de "Setupx.dll" et lui passe
les parametres suivants :

hwnd handle de la fenêtre dans laquelle on exécute RUNDDL
hinst HINSTANCE de SETUPX.DLL
lpszCmdLine "132 C:WINDOWSINFSHELL.INF"
nCmdShow (par défaut : normal)

Exemples pratiques
=================
- Lancement direct d'un module du panneau de config
rundll32 shell32.dll,Control_RunDLL,tweakui.cpl

Là il y a un double lancement !
On exécute shell32.dll, en utilisant l'API "Control_RunDLL", auquel on
indique de charger le module de config de "TweakUI" (des powertoys)

- Lancement d'une connexion à distance :
rundll rnaui.dll,RnaDial Free
dans cet exemple, "Free" est le nom de la connexion à distance

- Création d'un raccourci permettant de quitter Windows rapidement :
rundll32 user32.dll,ExitWindowsEx

ATTENTION! ici "case sensitive" !.
Taper exactement "ExitWindowsEx" et non "exitwindowsex"

- Affichage du panneau "Supprimer le périphérique en toute sécurité"
(USB et/ou PCMCIA)
rundll32.exe shell32.dll,Control_RunDLL hotplug.dll

- Aspect du menu Démarrer :
rundll32.exe shell32.dll,Options_RunDLL 1

- Affichage d'un raccourci Internet :
rundll32.exe shdocvw.dll,OpenURL "nom-du-raccourci"

- Ouvrir un fichier zip et présenter le résultat du
dézippage sous la forme d'un dossier :
rundll32.exe zipfldr.dll,RouteTheCall "nom-du fichier-zip"

- Installation d'un fichier .INF :
rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 "nom-du
fichier-inf"

- Définition d'une imprimante réseau comme imprimante par défaut :
rundll32.exe printui.dll,PrintUIEntry /n \serveurimp_partagée /y

- Création d'un raccourci dans un dossier :
rundll32.exe appwiz.cpl,NewLinkHere "nom-du-dossier"

- Verrouiller une station :
rundll32 user32.dll,LockWorkStation


En ce qui concerne les "applets" du panneau de config, on peut utiliser
RUNDLL32, mais franchement, il est beaucoup plus SIMPLE de les appeler
DIRECTEMENT !
Lorsqu'une applet a plusieurs fonctions, on peut en sélectionner une par un
nombre tapé à la suite du nom de l'applet :

Lancement direct du panneau de config "souris" :
rundll32 shell32.dll,Control_RunDLL main.cpl,@0
ou (plus simple) :
main.cpl @0

Lancement direct du panneau de config "clavier" :
rundll32 shell32.dll,Control_RunDLL main.cpl,@1
ou (plus simple) :
main.cpl @1

Là aussi, si on précise un nombre après l'index, cela désigne le n°
d'onglet!
main.cpl @1,0
=> clavier (vitesse)
main.cpl @1,1
=> clavier (paramètres régionaux)
main.cpl @1,2
=> clavier (matériel)

Attention :
ce n° d'onglet n'est pris en compte que pour les panneaux "standards"
(p.ex. ça ne marche pas avec le panneau de config souris Logitech)

Autres exemples :
-----------------
"options d'alimentation"
powercfg.cpl

"ajout/suppression de programmes"
appwiz.cpl

"ajout de matériel"
hdwwiz.cpl

"Gestion ODBC"
odbccp32.cpl

"Propriétés son"
mmsys.cpl

"Contrôle joystick"
joy.cpl

"Date et heure"
timedate.cpl

"Accessibilité"
access.cpl

"Connexions réseau"
ncpa.cpl




--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP]
http://www.bellamyjc.org ou http://jc.bellamy.free.fr
WonderMan
Le #9741041
Jean-Claude BELLAMY avait soumis l'idée :


Rundll32 charge et exécute dynamiquement CERTAINES DLL qui doivent répondre
à certains CRITÈRES .



Merci beaucoup pour cette explication détaillée !
Publicité
Poster une réponse
Anonyme