ΠΛΗΡΟΦΟΡΙΕΣ: Windows Rundll και Rundll32 διασύνδεσης

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 164787 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Τα Microsoft Windows 95, Windows 98 και Windows Millennium Edition (Me) περιέχει δύο προγράμματα βοηθητικό πρόγραμμα γραμμής εντολών που ονομάζεται Rundll.exe και Rundll32.exe που σας επιτρέπουν να καλέσετε μια συνάρτηση που εξάγονται από ένα DLL 16-bit ή 32 bit. Ωστόσο, τα προγράμματα Rundll και Rundll32 δεν σας επιτρέπει να καλέσετε οποιαδήποτε λειτουργία που έχει εξαχθεί από οποιοδήποτε DLL. Για παράδειγμα, μπορείτε να χρησιμοποιείτε αυτά τα βοηθητικά προγράμματα για την κλήση API Win32 (εφαρμογή Κλήσεις διασύνδεσης προγραμματισμού) που εξάγονται από το DLL του συστήματος. Τα προγράμματα να επιτρέπονται μόνο για να καλέσετε λειτουργίες από ένα αρχείο DLL που γράφονται ρητά η κλήση τους. Αυτό το άρθρο παρέχει περισσότερες λεπτομέρειες σχετικά με τη χρήση Rundll και προγράμματα Rundll32 στα λειτουργικά συστήματα Windows που αναφέρονται παραπάνω.

MIcrosoft Windows NT 4.0, Windows 2000 και Windows XP πλοίο με Rundll32 μόνο. Δεν υπάρχει υποστήριξη για Rundll (βοηθητικό πρόγραμμα Win16) σε οποιαδήποτε πλατφόρμα.

Βοηθητικά προγράμματα Rundll και Rundll32 είχαν αρχικά σχεδιαστεί μόνο για εσωτερική χρήση στη Microsoft. Αλλά η λειτουργικότητα που παρέχεται από τους είναι αρκετά γενική ότι τώρα είναι διαθέσιμα για γενική χρήση. Σημειώστε ότι τα Windows NT 4.0 πλοία μόνο με το βοηθητικό πρόγραμμα Rundll32 και υποστηρίζει μόνο Rundll32.

Περισσότερες πληροφορίες

Rundll έναντι Rundll32

Rundll φορτώνει και εκτελεί DLL 16-bit, ότι Rundll32 φορτώνει και εκτελεί 32-bit DLL. Εάν μεταβιβάσετε εσφαλμένου τύπου DLL Rundll ή Rundll32, ενδέχεται να αποτύχει να εκτελεστεί χωρίς υποδεικνύοντας μηνύματα σφάλματος.

Γραμμή εντολών rundll

Η γραμμή εντολών για Rundll είναι ως εξής:
   RUNDLL.EXE <dllname>,<entrypoint> <optional arguments>
				
Ένα παράδειγμα είναι η εξής:
   RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
				
Υπάρχουν 3 θέματα για να εξετάσετε προσεκτικά την παραπάνω γραμμή εντολών:
  1. Rundll ή Rundll32 αναζήτηση του αρχείου DLL που δόθηκε στις τυπικές θέσεις (ανατρέξτε στην τεκμηρίωση για τη συνάρτηση LoadLibrary() για λεπτομέρειες). Συνιστάται να παρέχετε μια πλήρη διαδρομή για το DLL για να εξασφαλίσετε ότι ο σωστός βρέθηκε. Για καλύτερα αποτελέσματα, χρησιμοποιήστε το σύντομο όνομα αρχείου αντί για το μεγάλο όνομα αρχείου για να εξασφαλίσετε ότι θα εμφανίζονται χωρίς τους μη έγκυρους χαρακτήρες. Σημείωση ειδικότερα, αυτό σημαίνει ένα DLL στο φάκελο "C:\Program Files" θα μετατραπεί το σύντομο όνομά της.
  2. Το <dllname> μπορεί να περιέχει διαστήματα ή κόμμα ή εισαγωγικά. Αυτός είναι ένας περιορισμός στο πρόγραμμα ανάλυσης γραμμής εντολών Rundll.</dllname>
  3. Στην παραπάνω γραμμή εντολών, το κόμμα (,) μεταξύ του <dllname> και το όνομα της συνάρτησης <entrypont> είναι εξαιρετικά σημαντικό. Εάν λείπει το διαχωριστικό κόμμα, Rundll ή Rundll32 θα αποτύχει χωρίς αναφέροντας τυχόν σφάλματα. Επιπλέον, δεν είναι δυνατό να υπάρχουν τα κενά διαστήματα μεταξύ του <dllname>, το κόμμα και η <entrypoint> συνάρτηση.</entrypoint></dllname></entrypont></dllname>

Πώς λειτουργεί η Rundll

Rundll εκτελεί τα ακόλουθα βήματα:
  1. Αναλύει τη γραμμή εντολών.
  2. Φορτώνει το καθορισμένο DLL μέσω LoadLibrary().
  3. Λαμβάνει τη διεύθυνση της <entrypoint> συνάρτησης μέσω GetProcAddress().</entrypoint>
  4. Καλεί τη <entrypoint> συνάρτηση, περνάει ουρά γραμμής εντολών που είναι <optional arguments="">.</optional></entrypoint>
  5. Όταν η συνάρτηση <entrypoint> επιστρέφει, Rundll.exe καταργεί τη φόρτωση του DLL και εξόδους. </entrypoint>

Τρόπος εγγραφής σας DLL

Στο αρχείο DLL σας, γράψτε τη συνάρτηση <entrypoint> με την ακόλουθη πρότυπη: </entrypoint>

DLL 16-bit:

  void FAR PASCAL __loadds
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
				
DLL 32-bit:
  void CALLBACK
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
				
Και πάλι, υπάρχουν ζητήματα 3 να σκεφτείτε με τη συνάρτηση EntryPoint:
  1. Προφανώς, το όνομα "entrypoint" πρέπει να αντικατασταθεί με το πραγματικό όνομα σας συνάρτησης σημείου εισόδου. Σημειώστε ότι το σημείο εισαγωγής το Rundll32 είναι εντελώς σχετίζεται με τη συνάρτηση DllEntryPoint σε ποια διαδικασία χειρισμού και νήμα επισυνάψετε/απόσπαση ειδοποιήσεις DLL 32-bit.
  2. Τη συνάρτηση σημείου εισόδου για Rundll32 πρέπει να οριστεί με _stdcall (προεπιλεγμένες ρυθμίσεις επιστροφής ΚΛΉΣΗΣ με χρήση του χαρακτηριστικού _stdcall) σύμβαση κλήσης. Εάν λείπει το χαρακτηριστικό _stdcall, η συνάρτηση προεπιλογή _cdecl σύμβαση κλήσης και στη συνέχεια Rundll32 θα τερματιστεί με μη φυσιολογικό τρόπο μετά την κλήση της συνάρτησης.
  3. Δεδομένου ότι πρέπει να δηλώσετε τη συνάρτηση με _stdcall σύμβαση κλήσης, όπως περιγράφεται παραπάνω, ακολουθεί ότι το πρόγραμμα μεταγλώττισης Visual C++ θα πράγματι εξαγάγετε ως _EntryPoint@16 εάν το DLL είναι γραμμένη σε c ή θα χρησιμοποιήσει περαιτέρω διακόσμηση όνομα αν το DLL είναι γραμμένη σε C++. Έτσι, προσέξτε να χρησιμοποιήσετε το όνομα σωστά εξαχθεί στη γραμμή εντολών για Rundll ή Rundll32. Εάν θέλετε να αποφύγετε τη χρήση των ονόματα, χρησιμοποιήστε ένα αρχείο μονάδας .def και εξαγωγή της συνάρτησης σημείου εισόδου κατά όνομα. Ανατρέξτε στην τεκμηρίωση του προϊόντος και στο παρακάτω άρθρο για περαιτέρω πληροφορίες σχετικά με τη διακόσμηση όνομα όταν χρησιμοποιείτε προγράμματα μεταγλώττισης Visual C++:
    140485Εξαγωγή PASCAL σύμβολα στο DLL 32-bit
Οι παράμετροι για το σημείο εισόδου Rundll είναι ως εξής:
   hwnd - window handle that should be used as the owner window for
          any windows your DLL creates
   hinst - your DLL's instance handle
   lpszCmdLine - ASCIIZ command line your DLL should parse
   nCmdShow - describes how your DLL's windows should be displayed
				
Στο παρακάτω παράδειγμα:
     RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
				
Rundll θα καλέσετε τη συνάρτηση entrypoint InstallHinfSection() SetupX.dll και να περάσετε τις ακόλουθες παραμέτρους:
   hwnd = (parent window handle)
   hinst = HINSTANCE of SETUPX.DLL
   lpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"
   nCmdShow = (whatever the nCmdShow was passed to CreateProcess)
				
Σημειώστε ότι είναι η συνάρτηση <entrypoint> (ή InstallHinfSection() με το παραπάνω παράδειγμα) που έχει τη δική της γραμμή εντολών (η lpszCmdLine ανάλυση η παράμετρος παραπάνω) και χρησιμοποιήστε τις παραμέτρους μεμονωμένων όπως απαιτείται. Rundll.exe αναλύει μόνο έως τα προαιρετικά ορίσματα που δόθηκαν εντολής γραμμή. Τα υπόλοιπα την ανάλυση είναι η συνάρτηση <entrypoint> . </entrypoint></entrypoint>

Ειδικές παρατηρήσεις σχετικά με τις διαφορές μεταξύ των Windows 95 και Windows NT

Σε Windows NT, Windows 2000 και Windows XP, η συμπεριφορά Rundll32.exe είναι λίγο διαφορετική, για να συμπεριλάβετε γραμμές εντολών UNICODE.

Τα Windows NT προσπαθεί πρώτα να GetProcAddress για <entrypoint>δ. Εάν βρεθεί αυτό το σημείο εισόδου, του πρωτοτύπου θεωρείται ως: </entrypoint>
   void CALLBACK
   EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,
               int nCmdShow);
				
Αυτό είναι το ίδιο ως EntryPoint ANSI, εκτός εάν το lpszCmdLine η παράμετρος είναι τώρα μια συμβολοσειρά UNICODE.

Εάν δεν βρεθεί το σημείο <entrypoint>w εγγραφή, στη συνέχεια, τα Windows NT θα GetProcAddress για μια <entrypoint>και <entrypoint>. Εάν εντοπιστεί είτε, στη συνέχεια, θεωρείται ως ένα σημείο καταχώρησης ANSI και αντιμετωπίζονται με τον ίδιο τρόπο όπως Τα Windows 95/98/Me. Επομένως, εάν θέλετε το αρχείο DLL να εκτελείται στα Windows 95 με υποστήριξη ANSI και των Windows NT/2000/XP με υποστήριξη UNICODE, πρέπει να εξαγάγετε δύο λειτουργίες: EntryPointW και EntryPoint. Τα Windows NT/2000/Me, θα ονομάζεται συνάρτηση EntryPointW με μια γραμμή εντολών UNICODE. σε Windows 95/98/Me, η συνάρτηση EntryPoint θα ονομάζεται με μια γραμμή εντολών ANSI. </entrypoint></entrypoint></entrypoint>

Ιδιότητες

Αναγν. άρθρου: 164787 - Τελευταία αναθεώρηση: Πέμπτη, 26 Μαΐου 2011 - Αναθεώρηση: 3.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Win32 Application Programming Interface στις ακόλουθες πλατφόρμες
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
Λέξεις-κλειδιά: 
kbdll kbFAQ kbinfo kbkernbase kbprogramming kbusage kbmt KB164787 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:164787

Αποστολή σχολίων

 

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