INFO: Windows-Schnittstellen RUNDLL und RUNDLL32

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 164787 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

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:
    140485 Exportieren 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.
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

Artikel-ID: 164787 - Geändert am: Freitag, 31. Januar 2014 - Version: 1.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Win32 Application Programming Interface, wenn verwendet mit:
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
Keywords: 
kbdll kbFAQ kbinfo kbkernbase kbprogramming kbusage KB164787
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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