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

A cikk fordítása A cikk fordítása
Cikk azonosítója: 164787 - A cikkben érintett termékek listájának megtekintése.
Az összes kibontása | Az összes összecsukása

A lap tartalma

Ö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 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 Ú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.)

Tulajdonságok

Cikk azonosítója: 164787 - Utolsó ellenőrzés: 2005. október 4. - Verziószám: 4.2
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.

Visszajelzés küldése

 

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