INFO: Windows-Schnittstellen RUNDLL und RUNDLL32

Zusammenfassung
Microsoft Windows 95, Windows 98 und Windows Millennium Edition (Me) enthalten zwei Befehlszeilen-Dienstprogramme, "Rundll.exe" und "Rundll32.exe", mit denen Sie eine von einer DLL exportierte 16-Bit- bzw. 32-Bit-Funktion aufrufen können. Die Programme RUNDLL und RUNDLL32 ermöglichen jedoch nicht den Aufruf beliebiger exportierter Funktionen von beliebigen DLLs. Sie können diese Programme beispielsweise nicht verwenden, um die von den System-DLLs exportierten Win32 API-Funktionen aufzurufen. Sie können mit diesen Programmen nur Funktionen von einer DLL aufrufen, die ausdrücklich für den Aufruf durch diese Programme geschrieben wurden. Dieser Artikel enthält ausführlichere Informationen zur Verwendung der Programme RUNDLL und RUNDLL32 unter den oben aufgeführten Windows-Betriebssystemen.

MIcrosoft Windows NT 4.0, Windows 2000 und Windows XP werden nur mit RUNDLL32 ausgeliefert. Das Programm RUNDLL (das Win16-Dienstprogramm) wird auf keiner dieser Plattformen unterstützt.

Die Dienstprogramme RUNDLL und RUNDLL32 wurden ursprünglich nur für die interne Verwendung bei Microsoft entwickelt. Die von diesen Programmen bereitgestellte Funktionalität ist jedoch universell genug, um sie nun für die allgemeine Verwendung verfügbar zu machen. Beachten Sie, dass Windows NT 4.0 nur mit dem Dienstprogramm RUNDLL32 geliefert wird und nur dieses Programm unterstützt.
Weitere Informationen

Unterschiede zwischen RUNDLL und RUNDLL32

RUNDLL lädt 16-Bit-DLLs und führt diese aus, RUNDLL32 lädt dagegen 32-Bit-DLLs und führt diese aus. Wenn Sie den falschen DLL-Typ an RUNDLL oder RUNDLL32 übergeben, kann die Ausführung ohne Anzeige von Fehlermeldungen fehlschlagen.

Befehlszeile für RUNDLL

Die Befehlszeilensyntax für RUNDLL sieht wie folgt aus:
   RUNDLL.EXE <Dllname>,<Einstiegspunkt> <optionale Argumente>				
Im Folgenden ist ein Beispiel aufgeführt:
   RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF				
In der oben stehenden Befehlszeile sind drei Punkte besonders zu beachten:
  1. RUNDLL oder RUNDLL32 suchen in den Standardorten nach dem angegebenen DLL-Dateinamen (Einzelheiten hierzu finden Sie in der Dokumentation zur LoadLibrary()-Funktion). Es wird empfohlen, einen vollständigen Pfad zu der DLL anzugeben, damit gewährleistet ist, dass die korrekte DLL gefunden wird. Verwenden Sie zur Erzielung besserer Ergebnisse den kurzen anstelle des langen Dateinamens, um sicherzustellen, dass keine ungültigen Zeichen enthalten sind. Insbesondere sollte eine DLL im Ordner "C:\Programme" in ihren kurzen Dateinamen konvertiert werden.
  2. Der <DLL-Name> darf keine Leerzeichen, Kommas oder Anführungszeichen enthalten. Dies stellt eine Einschränkung des Befehlszeilenparsers für RUNDLL dar.
  3. In der oben stehenden Befehlszeile hat das Komma (,) zwischen dem <DLL-Namen> und dem Namen der <EntryPoint>-Funktion eine sehr wichtige Bedeutung. Wenn das Komma-Trennzeichen fehlt, schlagen RUNDLL oder RUNDLL32 fehl, ohne dass auf Fehler hingewiesen wird. Außerdem dürfen keine Leerzeichen zwischen dem <DLL-Namen>, dem Komma und der <EntryPoint>-Funktion stehen.

Funktionsweise von RUNDLL

RUNDLL führt die folgenden Schritte aus:
  1. Es analysiert die Befehlszeile
  2. Es lädt die angegebene DLL über LoadLibrary().
  3. Es ruft die Adresse der <EntryPoint>-Funktion über GetProcAddress() ab.
  4. Es ruft die <EntryPoint>-Funktion auf und übergibt das Befehlszeilenende, die <optionalen Argumente>.
  5. Wenn die <EntryPoint>-Funktion zurückgegeben wird, entlädt "Rundll.exe" die DLL und wird beendet.

Schreiben einer DLL

Definieren Sie in der DLL die Funktion <entrypoint> mit dem folgenden Prototyp:

16-Bit-DLL:

  void FAR PASCAL __loadds  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);				
32-Bit-DLL:
  void CALLBACK  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);				
Es sind wiederum drei Punkte bei der EntryPoint-Funktion zu beachten:
  1. Der Name "EntryPoint" ist natürlich durch den tatsächlichen Namen Ihrer EntryPoint-Funktion zu ersetzen. Beachten Sie, dass der EntryPoint für RUNDLL32 überhaupt nichts mit der DllEntryPoint-Funktion in einer 32-Bit-DLL zu tun hat, die zur Bearbeitung von Attach/Detach-Benachrichtigungen für Prozesse und Threads dient.
  2. Die EntryPoint-Funktion für RUNDLL32 muss mit der Aufrufkonvention "_stdcall" angegeben werden (CALLBACK verwendet standardmäßig das Attribut "_stdcall"). Wenn das Attribut "_stdcall" fehlt, wird die Funktion standardmäßig auf die Aufrufkonvention "_cdecl" gesetzt. Dies hat zur Folge, dass RUNDLL32 nach dem Aufrufen der Funktion unnatürlich beendet wird.
  3. Da die Funktion wie oben beschrieben mit der Aufrufkonvention "_stdcall" deklariert werden muss, exportiert der Visual C++-Compiler die Funktion tatsächlich als "_EntryPoint@16" (wenn die DLL in C geschrieben ist) oder verwendet eine zusätzliche Namenserweiterung (wenn die DLL in C++ geschrieben ist). Achten Sie daher darauf, den korrekt exportierten Namen in der Befehlszeile für RUNDLL oder RUNDLL32 zu verwenden. Wenn Sie die Verwendung erweiterter Namen vermeiden wollen, verwenden Sie eine .def-Datei und exportieren Sie die EntryPoint-Funktion nach ihrem Namen. Weitere Informationen zur Namenserweiterung bei der Verwendung von Visual C++-Compilern finden Sie in der Produktdokumentation und im folgenden Artikel der Microsoft Knowledge Base:
    140485Exportieren PASCAL-ähnlicher Symbole in 32-Bit-DLLs
Parameter für den RUNDLL-EntryPoint:
   hwnd - Fensterhandle, das als Besitzerfenster für          alle von Ihrer DLL erstellten Fenster zu verwenden ist   hinst - Instanzenhandle Ihrer DLL   lpszCmdLine - Von Ihrer DLL zu analysierende ASCIIZ-Befehlszeile   nCmdShow - beschreibt, wie die Fenster Ihrer DLL anzuzeigen sind				
In dem folgenden Beispiel:
     RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF				
Hier würde RUNDLL die EntryPoint-Funktion InstallHinfSection() in "Setupx.dll" aufrufen und ihr die folgenden Parameter übergeben:
   hwnd = (übergeordnetes Fensterhandle)   hinst = HINSTANCE von SETUPX.DLL   lpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"   nCmdShow = (nCmdShow für CreateProcess übergebene Information)				
Beachten Sie, dass die <EntryPoint>-Funktion (oder InstallHinfSection() in dem oben stehenden Beispiel) ihre eigene Befehlszeile (hier den Parameter lpszCmdLine) analysieren und gegebenenfalls die einzelnen Parameter verwenden muss. "Rundll.exe" analysiert nur bis zu den optionalen Argumenten, die an seine Befehlszeile übergeben wurden. Für die restliche Analyse ist die <EntryPoint>-Funktion zuständig.

Spezielle Hinweise zu Unterschieden zwischen Windows 95 und Windows NT

Unter Windows NT, Windows 2000 und Windows XP ist das Verhalten von "Rundll32.exe" geringfügig anders, um UNICODE-Befehlszeilen zu unterstützen.

Windows NT versucht zunächst, GetProcAddress für <EntryPoint>W aufzurufen. Wird dieser Einstiegspunkt gefunden, dann wird folgende Prototypdefinition verwendet:
   void CALLBACK   EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,               int nCmdShow);				
Dies entspricht dem ANSI-EntryPoint, abgesehen davon, dass der Parameter lpszCmdLine nun eine UNICODE-Zeichenfolge ist.

Wird der Einstiegspunkt <EntryPoint>W nicht gefunden, dann wird unter Windows NT GetProcAddress für <entrypoint>A und für <entrypoint> aufgerufen. Wenn einer der beiden gefunden wird, wird er als ANSI-Einstiegspunkt betrachtet und auf dieselbe Weise wie unter Windows 95/98/Me behandelt. Daher müssen Sie zwei Funktionen exportieren, wenn die DLL unter Windows 95 mit ANSI-Unterstützung und unter Windows NT/2000/XP mit UNICODE-Unterstützung ausgeführt werden soll: EntryPointW und EntryPoint. Unter Windows NT/2000/Me wird die EntryPointW-Funktion mit einer UNICODE-Befehlszeile aufgerufen; unter Windows 95/98/Me wird die EntryPoint-Funktion mit einer ANSI-Befehlszeile aufgerufen.
win95 tools
Hinweis Dies ist ein Artikel, der im Schnellverfahren direkt von der Microsoft-Supportorganisation erstellt wurde. Die hierin enthaltenen Informationen werden als Reaktion auf neue Probleme wie besehen bereitgestellt. Da dieser Artikel im Schnellverfahren erstellt wurde, kann er Tippfehler enthalten und zu einem späteren Zeitpunkt ohne vorherige Ankündigung überarbeitet werden. Weitere zu berücksichtigende Informationen finden Sie in den Nutzungsbedingungen.
Eigenschaften

Artikelnummer: 164787 – Letzte Überarbeitung: 01/31/2014 22:12:00 – Revision: 1.0

Microsoft Win32 Application Programming Interface

  • kbdll kbFAQ kbinfo kbkernbase kbprogramming kbusage KB164787
Feedback