Cikk azonosítója: 164787 - Utolsó ellenőrzés: 2005. október 4. - Verziószám: 4.2

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

RendszertippA jelen cikk az Ön által használttól eltérő operációs rendszerre vonatkozik. A cikk azon tartalmait, amelyek nem relevánsak Önnek, letiltjuk.

A lap tartalma

Az összes kibontása | Az összes összecsukása

Ö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:
    140485  (http://support.microsoft.com/kb/140485/HU/ ) PASCAL 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  (http://support.microsoft.com/kb/135068/HU/ ) Ú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.)

A cikkben található információ a következő(k)re vonatkozik:
  • Microsoft Win32 Application Programming Interface a következő platformokon
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • Microsoft Windows XP Professional
Kulcsszavak: 
kbinfo kbdll kbprogramming kbkernbase kbfaq kbusage KB164787
A Microsoft tudásbázisban szolgáltatott információkat "az adott állapotban", bárminemű szavatosság vagy garancia nélkül biztosítjuk. A Microsoft kizár mindennemű, akár kifejezett, akár vélelmezett szavatosságot vagy garanciát, ideértve a forgalomképességre és az adott célra való alkalmasságra vonatkozó szavatosságot is. A Microsoft Corporation és annak beszállítói semmilyen körülmények között nem felelősek semminemű kárért, így a közvetlen, a közvetett, az üzleti haszon elmaradásából származó vagy speciális károkért, illetve a kár következményeként felmerülő költségek megtérítéséért, még abban az esetben sem, ha a Microsoft Corporationt vagy beszállítóit az ilyen károk bekövetkeztének lehetőségére figyelmeztették. Egyes államok joga nem teszi lehetővé bizonyos károkért a felelősség kizárását vagy korlátozását, ezért a fenti korlátozások az ön esetében esetleg nem alkalmazhatók.