INFO : Interfaces Windows Rundll et Rundll32

Traductions disponibles Traductions disponibles
Numéro d'article: 164787 - Voir les produits auxquels s'applique cet article
Cet article peut contenir des liens vers des informations en langue anglaise (pas encore traduites).
Agrandir tout | Réduire tout

Sommaire

Résumé

Microsoft Windows 95, Windows 98 et Windows Millennium Edition sont fournis avec les deux utilitaires de ligne de commande Rundll.exe et Rundll32.exe. Ceux-ci vous permettent d'appeler une fonction exportée d'une DLL 16 bits ou 32 bits. Toutefois, les programmes Rundll et Rundll32 ne vous autorisent pas à appeler une fonction exportée de n'importe quelle DLL. Par exemple, vous ne pouvez pas utiliser ces programmes pour des appels API (Application Programming Interface) Win32 exportés à partir des DLL système. Les programmes n'autorisent que des appels de fonctions d'une DLL qui ont été explicitement écrites pour être appelées par elles. Cet article fournit des informations détaillées sur l'utilisation des programmes Rundll et Rundll32 avec les systèmes d'exploitation répertoriés ci-dessus.

Microsoft Windows NT 4.0, Windows 2000 et Windows XP ne sont livrés qu'avec le programme Rundll32. Aucune de ces plates-formes ne prend en charge Rundll (l'utilitaire Win16).

Initialement, les utilitaires Rundll et Rundll32 n'étaient prévus que pour une utilisation interne à Microsoft. Cependant, compte tenu du caractère suffisamment générique de la fonctionnalité offerte, ils sont désormais proposés pour une utilisation générale. Notez que Windows NT 4.0 n'est livré qu'avec l'utilitaire Rundll32 et ne prend en charge que Rundll32.

Plus d'informations

Comparatif entre Rundll et Rundll32

Rundll charge et exécute des DLL 16 bits, tandis que Rundll32 charge et exécute des DLL 32 bits. Si vous passez le mauvais type de DLL à Rundll ou Rundll32, l'exécution de l'utilitaire peut échouer sans qu'un message d'erreur ne s'affiche.

Ligne de commande Rundll

La ligne de commande de Rundll se présente comme suit :
   RUNDLL.EXE <dllname>,<entrypoint> <optional arguments>
				
En voici un exemple :
   RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
				
La ligne de commande ci-dessus présente trois points importants :
  1. Rundll ou Rundll32 recherche le nom du fichier DLL donné dans les emplacements standard (pour plus d'informations, reportez-vous à la documentation de la fonction LoadLibrary()). Pour vous assurer que la bonne DLL est utilisée, il est recommandé d'indiquer son chemin complet. Pour de meilleurs résultats et pour éviter l'apparition de tout caractère non autorisé, préférez un nom de fichier court au nom de fichier long. Cela signifie notamment que vous devez convertir le nom d'une DLL du dossier "C:\Program Files" dans sa version courte.
  2. <dllname> ne peut contenir aucun espace, aucune virgule, ni même de guillemets. C'est l'analyseur de ligne de commande de Rundll qui impose cette limitation.
  3. Dans la ligne de commande précédente, la virgule (,) qui sépare <dllname> du nom de fonction <entrypoint> est extrêmement importante. Si vous omettez la virgule de séparation, l'exécution de Rundll ou de Rundll32 échouera sans mentionner d'erreur. En outre, vous ne devez placer aucun espace vide entre <dllname>, la virgule et la fonction <entrypoint>.

Fonctionnement de Rundll

Le programme Rundll exécute les étapes suivantes :
  1. Il analyse la ligne de commande.
  2. Il charge la DLL spécifiée par le biais de LoadLibrary().
  3. Il obtient l'adresse de la fonction <entrypoint> par le biais de GetProcAddress().
  4. Il appelle la fonction <entrypoint> en passant la queue de la ligne de commande représentée par <optional arguments>.
  5. Une fois la fonction <entrypoint> exécutée, Rundll.exe décharge la DLL et se termine.

Écriture de votre DLL

Dans votre DLL, écrivez la fonction <entrypoint> avec le prototype suivant :

DLL 16 bits :

  void FAR PASCAL __loadds
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
				
DLL 32 bits :
  void CALLBACK
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
				
Là encore, la ligne de commande ci-dessus présente trois points importants :
  1. Évidemment, il convient de remplacer le nom "EntryPoint" par le nom véritable de la fonction de point d'entrée. Notez que le point d'entrée de Rundll32 n'a aucun rapport avec la fonction DllEntryPoint d'une DLL 32 bits qui gère des processus et des notifications d'attachement et de détachement de threads.
  2. Vous devez définir la fonction de point d'entrée associée à Rundll32 avec la convention d'appel _stdcall (CALLBACK est pris par défaut pour l'utilisation de l'attribut _stdcall). Si vous omettez l'attribut _stdcall, la fonction prend alors par défaut la convention d'appel _cdecl, puis l'exécution de Rundll32 se termine anormalement après l'appel de la fonction.
  3. Puisque vous devez déclarer la fonction avec la convention d'appel _stdcall comme indiqué précédemment, le compilateur Visual C++ l'exportera donc en tant que _EntryPoint@16 si la DLL est rédigée en C ou utilisera une autre décoration de nom si vous l'avez rédigée en C++. En conséquence, il est recommandé d'utiliser le nom correctement exporté dans la ligne de commande de Rundll ou Rundll32. Pour ne pas employer de noms décorés, utilisez un fichier .def et exportez la fonction du point d'entrée en vous servant du nom. Pour plus d'informations sur la décoration des noms lors de l'utilisation de compilateurs Visual C++, consultez la documentation du produit ainsi que l'article suivant :
    140485 Exportation de symboles de type PASCAL dans des DLL 32 bits
Les paramètres du point d'entrée Rundll sont les suivants :
   hwnd - handle de fenêtre utilisable comme fenêtre propriétaire pour
          toute fenêtre créée par votre DLL
   hinst - handle d'instance de votre DLL
   lpszCmdLine - ligne de commande ASCIIZ que votre DLL doit analyser
   nCmdShow - décrit le mode d'affichage des fenêtres de votre DLL
				
Dans l'exemple suivant :
     RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
				
Rundll doit appeler la fonction de point d'entrée InstallHinfSection() dans Setupx.dll et lui transmettre les paramètres suivants :
   hwnd = (handle de la fenêtre parente)
   hinst = HINSTANCE de SETUPX.DLL
   lpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"
   nCmdShow = (ce que nCmdShow a transmis à CreateProcess)
				
Notez que c'est bien la fonction <entrypoint> (ou InstallHinfSection() dans l'exemple précédent) qui doit analyser sa propre ligne de commande (le paramètre lpszCmdLine ci-dessus) et utiliser les paramètres individuels si nécessaire. L'analyse de Rundll.exe s'arrête aux arguments optionnels passés sur sa ligne de commande. Le reste de l'analyse dépend de la fonction <entrypoint>.

Remarques spéciales sur les différences entre Windows 95 et Windows NT

Sous Windows NT, Windows 2000 et Windows XP, Rundll32.exe se comporte légèrement différemment pour prendre en compte les lignes de commande UNICODE.

Windows NT fait tout d'abord une tentative GetProcAddress pour <EntryPoint>W. Si ce point d'entrée existe, le prototype est supposé être du type suivant :
   void CALLBACK
   EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,
               int nCmdShow);
				
Il est identique au point d'entrée ANSI, sauf que le paramètre lpszCmdLine est maintenant une chaîne UNICODE.

Si le point d'entrée <EntryPoint>W est introuvable, dans ce cas Windows NT exécute GetProcAddress pour <entrypoint>A et pour <entrypoint>. Si l'un ou l'autre est trouvé, il est alors considéré comme un point d'entrée ANSI et traité de la même manière que dans Windows 95, Windows 98 et Windows Millennium Edition. En conséquence, si vous voulez que votre DLL s'exécute sous Windows 95 avec une prise en charge ANSI et sous Windows NT/2000/XP avec une prise en charge UNICODE, vous devez exporter les deux fonctions suivantes : EntryPointW et EntryPoint. Sous Windows NT/2000/XP, la fonction EntryPointW sera appelée avec une ligne de commande UNICODE, tandis que sous Windows 95, Windows 98 et Windows Millennium Edition, elle sera appelée avec une ligne de commande ANSI.

Références

Vous trouverez un exemple d'utilisation de Rundll dans l'article suivant qui vous explique comment lancer une applet du Panneau de configuration dans Windows 95 au moyen de l'utilitaire de ligne de commande Rundll :
135068 COMMENT FAIRE : Démarrer une applet du Panneau de configuration dans Windows 95, 98 ou WinNT

Propriétés

Numéro d'article: 164787 - Dernière mise à jour: lundi 17 janvier 2005 - Version: 4.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Win32 Application Programming Interface sur le système suivant
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
    • Microsoft Windows NT 4.0
    • Microsoft Windows 2000 Standard Edition
    • Microsoft Windows XP Professional
Mots-clés : 
kbinfo kbdll kbprogramming kbkernbase kbfaq kbusage KB164787
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com