Jelenleg nem kapcsolódik az internethez. Várakozás a kapcsolat helyreállítására

Információ: A Windows Rundll és Rundll32 felülete

Összefoglaló
A Microsoft Windows 95, a Windows 98 és a Windows Millennium Edition (Me) rendszer tartalmaz egy Rundll.exe és egy Rundll32.exe nevű parancssori segédprogramot, melyek lehetővé teszik 16 vagy 32 bites DLL-fájlokból exportált függvények hívását. A Rundll és a Rundll32 program azonban nem engedélyezi bármely exportált függvény bármely DLL-fájlból történő hívását. A segédprogramokkal nem tudja például meghívni a rendszer DLL-fájljaiból exportált Win32 API-hívásokat. A program csak arra ad lehetőséget, hogy csak a kifejezetten az általuk történő hívásra írt DLL-fájlokból hívjon függvényeket. Ez a cikk részletesen ismerteti a Rundll és a Rundll32 programnak a fent felsorolt Windows operációs rendszerek alatt történő használatát.

A Microsoft Windows NT 4.0, a Windows 2000 és a Windows XP rendszer csak a Rundll32 eszközt tartalmazza. A fenti platformok egyike sem támogatja a Rundll program (a Win16 segédprogram) használatát.

A Rundll és a Rundll32 segédprogramot a Microsoft eredetileg csak belső használatra tervezte. Az általuk kínált szolgáltatások azonban elég általánosak ahhoz, hogy most már mindenki számára elérhetők legyenek. Ne feledje, hogy a Windows NT 4.0 operációs rendszer csak a Rundll32 segédprogramot tartalmazza, és csak a Rundll32 használatát támogatja.
További információ

A Rundll és a Rundll32 összevetése

A Rundll 16 bites DLL-fájlok, a Rundll32 pedig 32 bites DLL-fájlok betöltésére és futtatására használható. Ha a Rundll vagy a Rundll32 programot nem a megfelelő típusú DLL-fájlhoz használja, előfordulhat, hogy a fájl futtatása hibaüzenet nélkül sikertelenül végződik.

A Rundll parancssora

A Rundll parancssora a következő:
   RUNDLL.EXE <DLLNeve>,<BelépésiPont> <NemKötelezőArgumentumok>				
Például:
   RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF				
A fenti parancssorral kapcsolatban a következő három dologra kell különösen tekintettel lenni:
  1. A Rundll vagy a Rundll32 program az adott DLL-fájl nevét a szokásos helyeken keresi (részletekért lásd a LoadLibrary() függvény dokumentációját). Ajánlatos a DLL-fájl teljes elérési útját megadni annak biztosítása érdekében, hogy a program a megfelelőt találja meg. A legjobb eredmény elérése érdekében a hosszú fájlnév helyett a fájl rövid nevét használja; ezzel biztosíthatja, hogy a fájl neve ne tartalmazzon nem megengedett karaktereket. Ez azt jelenti, hogy a „C:\Program Files” mappában található DLL-fájl nevét át kell alakítani rövid névre.
  2. A <DLLNeve> nem tartalmazhat szóközt, vesszőt és idézőjelet. Ez a Rundll parancssori értelmezőjének korlátozása.
  3. A fenti parancssorban a <DLLNeve> és a <BelépésiPont> függvény között található vessző (,) rendkívüli fontossággal bír. Ha a vessző hiányzik az adott helyről, akkor a Rundll vagy a Rundll32 program futása hibaüzenet nélkül sikertelenül végződik. Nem állhat továbbá szóköz a <DLLNeve>, a vessző és a <BelépésiPont> függvény között.

A Rundll működése

A Rundll a következő lépéseket végzi el:
  1. Értelmezi a parancssort.
  2. Betölti a megadott DLL-fájlt a LoadLibrary() függvényen keresztül.
  3. Beolvassa a <BelépésiPont> függvény címét a GetProcAddress() függvénnyel.
  4. Meghívja a <BelépésiPont> függvényt a parancssor végének átadásával, amely a <NemKötelezőArgumentumok> függvény.
  5. Amikor a <BelépésiPont> függvény értéket ad vissza, a Rundll.exe eltávolítja a DLL-fájlt a memóriából, majd kilép.

A DLL kialakítása

A DLL-ben a <BelépésiPont> függvényt a következő prototípus alapján kell definiálni:

16 bites DLL-fájl esetén:

  void FAR PASCAL __loadds  BelépésiPont (HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);				
32 bites DLL-fájl esetén:
  void CALLBACK  BelépésiPont (HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);				
A BelépésiPont függvénnyel kapcsolatban szintén három dologra kell tekintettel lenni:
  1. A „BelépésiPont” nevet a belépési pontként funkcionáló tényleges függvény nevével kell helyettesíteni. A Rundll32 belépési pontja teljes mértékben független a 32 bites DLL-ek DIIEntryPoint függvényétől, amely a folyamatok és a szálak csatlakoztatásával és leválasztásával kapcsolatos értesítéseket kezeli.
  2. A Rundll32 segédprogramhoz a belépési pont függvényét az _stdcall hívási konvencióval kell definiálni (a CALLBACK alapértelmezés szerint az _stdcall attribútumot használja). Ha az _stdcall attribútum hiányzik, az alapértelmezett hívási konvenció a _cdecl lesz, a Rundll32 futása pedig rendellenesen fejeződik be a függvény hívása után.
  3. Mivel a függvényt az _stdcall hívási konvenció szerint kell deklarálni, a Visual C++ fordító _EntryPoint@16 néven fogja exportálni, ha a DLL forrásnyelve a C nyelv, C++ nyelvű DLL-eknél pedig további névkiegészítést fog alkalmazni. Ezért figyeljen arra, hogy a megfelelően exportált nevet használja a Rundll vagy a Rundll32 parancssorában. A kiegészített nevek megjelenése .def fájl használatával és a belépési pont függvényének név szerinti exportálásával elkerülhető. A Visual C++ fordítók névkiegészítési mechanizmusairól további információt talál a termékdokumentációban, illetve a következő cikkben:
    140485PASCAL típusú szimbólumok exportálása 32 bites DLL-fájlokban (Előfordulhat, hogy a hivatkozás részben vagy teljes egészében angol nyelvű tartalomra mutat.)
A Rundll belépési pontjának paraméterei a következők:
   hwnd – ablakleíró, melyet főablakként kell használni bármely, a DLL-fájl által létrehozott ablakhoz   hinst – a DLL példányának leírója   lpszCmdLine – a DLL által értelmezendő ASCIIZ parancssor   nCmdShow – a DLL-fájl ablakai megjelenítésének leírása				
A következő példában:
     RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF				
a Rundll meghívja a Setupx.dll belépési pontjaként definiált InstallHinfSection() függvényét, majd átadja neki a következő argumentumokat:
   hwnd = (szülőablak leírója)   hinst = a SETUPX.DLL HINSTANCE típusú argumentuma   lpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"   nCmdShow = (a CreateProcess függvénynek átadott nCmdShow argumentum)				
Ne feledje, hogy a <BelépésiPont> függvénynek (vagy, a fenti példában az InstallHinfSection() függvénynek) kell értelmeznie a saját parancssorát (a fenti példában az lpszCmdLine paramétert), és a helyzetnek megfelelően használnia az egyes paramétereket. A Rundll.exe csak a parancssorának átadott nem kötelező argumentumokig végzi az értelmezést. Az értelmezés többi részét a <BelépésiPont> függvény végzi.

A Windows 95 és a Windows NT közötti különbségekkel kapcsolatos speciális megjegyzések

Windows NT, Windows 2000 és Windows XP rendszeren a Rundll32.exe működése kis mértékben eltér annak érdekében, hogy képes legyen a Unicode formátumú parancssorok kezelésére.

A Windows NT először megkísérli beolvasni a <BelépésiPont>W függvény címét a GetProcAddress függvénnyel. Ha megtalálja ezt a belépési pontot, akkor a következő prototípust feltételezi:
   void CALLBACK   BelépésiPontW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,               int nCmdShow);				
Ez megegyezik az ANSI formátumú belépési ponttal, azzal a különbséggel, hogy az lpszCmdLine jelen esetben egy UNICODE formátumú karakterlánc.

Ha a Windows NT nem találja a <BelépésiPont>W belépési pontot, akkor a GetProcAddress függvénnyel beolvassa a <BelépésiPont>A és a <BelépésiPont> címét. Ha megtalálja valamelyiket, akkor a rendszer ANSI formátumú belépési pontnak tekinti, és a Windows 95, 98 vagy Millennium Edition rendszerrel megegyező módon kezeli azt. Ezért ha a DLL-fájlt az ANSI formátumot támogató Windows 95 rendszeren és a UNICODE formátumot támogató Windows NT, 2000 vagy XP rendszeren is futtatni szeretné, akkor a BelépésiPontW és a BelépésiPont függvényt is exportálnia kell. A Windows NT, 2000 és XP rendszer a BelépésiPontW függvényt hívja UNICODE formátumot támogató parancssorral, a Windows 95, 98 és Millennium Edition rendszer pedig az BelépésiPont függvényt ANSI formátumot támogató parancssorral.
Hivatkozások
A Rundll használatával kapcsolatos példát találhat a következő, a Vezérlőpultról elérhető kisalkalmazások Windows 95 rendszeren a Rundll parancssori segédprogrammal történő indítását ismertető cikkben:
135068Útmutató: A Vezérlőpultról elérhető kisalkalmazások indítása Windows 95, 98 vagy WinNT rendszeren (Előfordulhat, hogy a hivatkozás részben vagy teljes egészében angol nyelvű tartalomra mutat.)
win95 eszközök
Tulajdonságok

Cikkazonosító: 164787 - Utolsó ellenőrzés: 10/04/2005 16:35:00 - Verziószám: 4.2

Microsoft Win32 Application Programming Interface

  • kbinfo kbdll kbprogramming kbkernbase kbfaq kbusage KB164787
Visszajelzés
0&did=1&t=">