INFO: Interfejs Rundll i Rundll32 w systemie Windows

Tłumaczenia artykułów Tłumaczenia artykułów
Numer ID artykułu: 164787 - Zobacz jakich produktów dotyczą zawarte w tym artykule porady.
Rozwiń wszystko | Zwiń wszystko

Na tej stronie

Streszczenie

Systemy Microsoft Windows 95, Windows 98 i Windows Millennium Edition (Me) zawierają dwa programy narzędziowe wiersza polecenia, Rundll.exe i Rundll32.exe, które umożliwiają wywołanie funkcji wyeksportowanej z biblioteki DLL, czy to 16-bitowej, czy to 32-bitowej. Jednak programy Rundll i Rundll32 nie pozwalają na wywołanie każdej funkcji wyeksportowanej z każdej biblioteki DLL. Nie można na przykład użyć tych programów narzędziowych do wywołania funkcji interfejsu programowania aplikacji (API) Win32 wyeksportowanej z systemowej biblioteki DLL. Programy te umożliwiają wywoływanie z biblioteki DLL tylko tych funkcji, które napisano specjalnie z myślą o wywoływaniu ich przez te programy. W artykule podano więcej szczegółów dotyczących korzystania z programów Rundll i Rundll32 w systemach operacyjnych Windows wymienionych powyżej.

Systemy Microsoft Windows NT 4.0, Windows 2000 i Windows XP są dostarczane tylko z programem Rundll32. W przypadku żadnej z tych platform nie jest dostępna pomoc techniczna dla programu Rundll (narzędzie Win16).

Programy narzędziowe Rundll i Rundll32 zaprojektowano początkowo tylko do wewnętrznego użytku firmy Microsoft. Jednak zapewniane przez nie funkcje są na tyle uniwersalne, że obecnie są one dostępne do użytku ogólnego. Należy zwrócić uwagę, że system Windows NT 4.0 jest dostarczany tylko z programem narzędziowym Rundll32 i obsługuje wyłącznie ten program.

Więcej informacji

Rundll a Rundll32

Program Rundll ładuje i uruchamia 16-bitowe biblioteki DLL, podczas gdy program Rundll32 ładuje i uruchamia 32-bitowe biblioteki DLL. Jeśli do programu Rundll lub Rundll32 zostanie przekazany niewłaściwy typ biblioteki DLL, może on się nie uruchomić, nie wyświetlając żadnego komunikatu o błędzie.

Wiersz polecenia Rundll

Wiersz polecenia dla programu Rundll wygląda następująco:
   RUNDLL.EXE <nazwa_dll>,<punkt_wejścia> <argumenty_opcjonalne>
				
Przykład:
   RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
				
Jeśli chodzi o ten wiersz polecenia, to należy rozważyć 3 kwestie:
  1. Program Rundll lub Rundll32 szuka danej nazwy pliku DLL w standardowych miejscach [szczegóły można znaleźć w dokumentacji funkcji LoadLibrary()]. Zaleca się, aby podać pełną ścieżkę do biblioteki DLL, co zapewni, że zostanie znaleziony właściwy plik. Lepiej użyć krótkiej nazwy pliku zamiast długiej, aby uniknąć ryzyka pojawienia się niedozwolonego znaku. W szczególności oznacza to, że nazwa biblioteki DLL w folderze „C:\Program Files” powinna zostać przekonwertowana na jej nazwę krótką.
  2. Parametr <nazwa_dll> nie może zawierać żadnych spacji, przecinków ani znaków zapytania. Jest to ograniczenie parsera wiersza polecenia Rundll.
  3. W powyższym wierszu polecenia niezwykle ważny jest przecinek (,) między parametrem <nazwa_dll> a nazwą funkcji <punkt_wejścia>. Jeśli zabraknie przecinka, programy Rundll i Rundll32 nie działają, nie wskazując przy tym żadnego błędu. Ponadto nie może być żadnych spacji między parametrem <nazwa_dll>, przecinkiem i funkcją <punkt_wejścia>.

Jak działa program Rundll

Program Rundll wykonuje następujące kroki:
  1. Analizuje wiersz polecenia.
  2. Ładuje określoną bibliotekę DLL za pomocą funkcji LoadLibrary().
  3. Uzyskuje adres funkcji <punkt_wejścia> za pomocą funkcji GetProcAddress().
  4. Wywołuje funkcję <punkt_wejścia>, przekazując argumenty określone przez parametr <argumenty_opcjonalne>.
  5. Po zwróceniu funkcji <punkt_wejścia> program Rundll.exe zwalnia bibliotekę DLL i zamyka się.

Jak napisać bibliotekę DLL

W bibliotece DLL należy napisać funkcję <punkt_wejścia> o następującym prototypie:

16-bitowa biblioteka DLL:

  void FAR PASCAL __loadds
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
				
32-bitowa biblioteka DLL:
  void CALLBACK
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
				
Ponownie należy rozważyć 3 kwestie, jeśli chodzi o funkcję EntryPoint:
  1. Oczywiście nazwa „EntryPoint” powinna zostać zastąpiona rzeczywistą nazwą funkcji punktu wejścia. Należy zwrócić uwagę, że punkt wejścia programu Rundll32 nie jest w żaden sposób związany z funkcją DllEntryPoint w 32-bitowej bibliotece DLL (funkcja ta obsługuje powiadomienia o dołączeniu/odłączeniu procesu lub wątku).
  2. Funkcja punktu wejścia dla programu Rundll32 musi być zdefiniowana przy użyciu konwencji wywoływania _stdcall (funkcja CALLBACK domyślnie używa atrybutu _stdcall). Jeśli brakuje atrybutu _stdcall, funkcja domyślnie używa konwencji wywoływania _cdecl, a następnie program Rundll32 zostaje nienormalnie zamknięty po wywołaniu tej funkcji.
  3. Ponieważ funkcję trzeba zadeklarować przy użyciu konwencji wywoływania _stdcall, jak to opisano powyżej, kompilator języka Visual C++ w rzeczywistości eksportuje ją jako _EntryPoint@16, jeśli biblioteka DLL jest napisana w języku C, lub używa dalszego dekorowania nazwy, jeśli biblioteka DLL jest napisana w języku C++. Należy więc pamiętać, aby w wierszu polecenia programu Rundll lub Rundll32 używać poprawnej nazwy wyeksportowanej. Aby uniknąć używania nazw dekorowanych, należy użyć pliku .def i wyeksportować funkcję punktu wejścia według nazwy. Dodatkowe informacje na temat dekorowania nazw w przypadku korzystania z kompilatorów języka Visual C++ można znaleźć w dokumentacji produktu i w następującym artykule:
    140485 Exporting PASCAL-Like Symbols in 32-bit DLLs
Parametry punktu wejścia programu Rundll:
   hwnd - uchwyt okna, które powinno być używane jako okno-właściciel
          dla wszelkich okien tworzonych przez bibliotekę DLL
   hinst - uchwyt wystąpienia biblioteki DLL
   lpszCmdLine - wiersz polecenia ASCIIZ, który powinna analizować biblioteka DLL
   nCmdShow - opisuje, jak mają być wyświetlane okna biblioteki DLL
				
W tym przykładzie:
     RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
				
program Rundll wywołuje funkcję punktu wejścia InstallHinfSection() z biblioteki Setupx.dll i przekazuje jej następujące parametry:
   hwnd = (uchwyt okna nadrzędnego)
   hinst = wystąpienie HINSTANCE biblioteki SETUPX.DLL
   lpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"
   nCmdShow = (wartość parametru nCmdShow przekazanego funkcji CreateProcess)
				
Należy zwrócić uwagę, że to funkcja <punkt_wejścia> [lub InstallHinfSection() w powyższym przykładzie] musi przeanalizować swój wiersz polecenia (parametr lpszCmdLine powyżej) i użyć poszczególnych parametrów, jeżeli to konieczne. Program Rundll.exe przeprowadza analizę tylko do argumentów opcjonalnych przekazanych do jego wiersza polecenia. Za dalszą analizę odpowiedzialna jest funkcja <punkt_wejścia>.

Uwagi specjalne na temat różnic między systemami Windows 95 i Windows NT

W systemach Windows NT, Windows 2000 i Windows XP zachowanie programu Rundll32.exe jest nieco inne w związku z obsługą wierszy polecenia UNICODE.

System Windows NT najpierw próbuje użyć funkcji GetProcAddress dla punktu wejścia <punkt_wejścia>W. Jeśli ten punkt wejścia zostanie znaleziony, przyjmowane jest założenie, że prototyp jest następujący:
   void CALLBACK
   EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,
               int nCmdShow);
				
Jest to ten sam prototyp, co w przypadku punktu wejścia ANSI, z tym wyjątkiem, że parametr lpszCmdLine jest ciągiem UNICODE.

Jeśli punkt wejścia <punkt_wejścia>W nie zostanie znaleziony, system Windows NT używa funkcji GetProcAddress dla punktów wejścia <punkt_wejścia>A i <punkt_wejścia>. Jeśli któryś z nich zostanie znaleziony, jest uważany za punkt wejścia ANSI i traktowany w taki sam sposób, jak w systemach Windows 95/98/Me. Jeśli więc biblioteka DLL ma działać w systemie Windows 95 z obsługą ANSI, a w systemach Windows NT/2000/XP z obsługą UNICODE, należy wyeksportować dwie funkcje: EntryPointW i EntryPoint. W systemach Windows NT/2000/Me funkcja EntryPointW będzie wywoływana za pomocą wiersza polecenia UNICODE; w systemach Windows 95/98/Me funkcja EntryPoint będzie wywoływana za pomocą wiersza polecenia ANSI.

Materiały referencyjne

Przykład użycia programu Rundll znajduje się w następującym artykule, w którym opisano sposób uruchomienia apletu Panel sterowania w systemie Windows 95 za pomocą narzędzia wiersza polecenia Rundll:
135068 HOWTO: Start a Control Panel Applet in Windows 95, 98, or WinNT

Właściwości

Numer ID artykułu: 164787 - Ostatnia weryfikacja: 10 stycznia 2005 - Weryfikacja: 4.2
Informacje zawarte w tym artykule dotyczą:
  • Microsoft Win32 Application Programming Interface na następujących platformach
    • 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
Słowa kluczowe: 
kbinfo kbdll kbprogramming kbkernbase kbfaq kbusage KB164787

Przekaż opinię

 

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