ΠΛΗΡΟΦΟΡΙΕΣ: Κλήση ρουτίνες CRT εξόδου από μια εφαρμογή Γραφικών

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

Περίληψη

Για να χρησιμοποιήσετε τις ρουτίνες εξόδου C χρόνου εκτέλεσης, όπως η printf() από μια εφαρμογή Γραφικών, είναι απαραίτητο να δημιουργήσετε μια κονσόλα. Το Win32 διασύνδεση προγραμματισμού εφαρμογών (API) AllocConsole() δημιουργεί στην κονσόλα. Η ρουτίνα setvbuf() CRT καταργεί buffering, έτσι ώστε η έξοδος είναι ορατά αμέσως.

Αυτή η μέθοδος λειτουργεί αν η εφαρμογή GUI εκτελείται από τη γραμμή εντολών ή από τη Διαχείριση αρχείων. Ωστόσο, αυτή η μέθοδος δεν λειτουργεί, εάν η εφαρμογή ξεκινά από τη Διαχείριση προγραμμάτων ή μέσω της εντολής "Έναρξη". Ο ακόλουθος κώδικας δείχνει τον τρόπο για να επιλύσετε αυτό το ζήτημα:
   int hCrt;
   FILE *hf;

   AllocConsole();
   hCrt = _open_osfhandle(
             (long) GetStdHandle(STD_OUTPUT_HANDLE),
             _O_TEXT
          );
   hf = _fdopen( hCrt, "w" );
   *stdout = *hf;
   i = setvbuf( stdout, NULL, _IONBF, 0 );
				
Αυτός ο κωδικός ανοίγει μια νέα λαβή CRT χαμηλού επιπέδου στο δείκτη χειρισμού εξόδου σωστή κονσόλα προς τα επάνω, συσχετίζει μια νέα ροή με συγκεκριμένο δείκτη χειρισμού χαμηλού επιπέδου και αντικαθιστά stdout με συγκεκριμένο νέας ροής. Αυτή η διαδικασία αναλαμβάνει λειτουργίες που χρησιμοποιούν stdout, όπως η printf() puts() και ούτω καθεξής. Χρησιμοποιήστε την ίδια διαδικασία για stdin και stderr.

Σημειώστε ότι αυτός ο κωδικός δεν διορθώνει προβλήματα με δείκτες χειρισμού 0, 1 και 2. Στην πραγματικότητα, οφείλεται σε άλλες επιπλοκές, δεν είναι δυνατό να διορθωθεί αυτό, και επομένως είναι απαραίτητη η χρήση της ροής εισόδου/εξόδου αντί της εισόδου/εξόδου χαμηλού επιπέδου.

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

Όταν μια εφαρμογή Γραφικών ξεκινά με "Αρχική"εντολή, το λειτουργικό Σύστημα τρεις βασικές χειρίζεται STD_INPUT_HANDLE, STD_OUTPUT_HANDLE και STD_ERROR_HANDLE είναι όλα"μηδενικά έξω" από τις ρουτίνες προετοιμασίας της κονσόλας. Αυτές οι τρεις λαβές αντικαθίστανται από έγκυρες τιμές όταν η εφαρμογή GUI καλεί AllocConsole(). Συνεπώς, μόλις γίνει αυτό, καλώντας GetStdHandle() θα επιστρέφει πάντα τιμές έγκυρος δείκτης χειρισμού. Το πρόβλημα είναι ότι το CRT έχει ήδη ολοκληρωθεί η προετοιμασία, πριν η εφαρμογή σας λαμβάνει μια ευκαιρία για να καλέσετε AllocConsole(), τα τρία χαμηλής λαβές εισόδου/εξόδου 0, 1 και 2 έχουν ήδη οριστεί για να χρησιμοποιήσετε την αρχική μηδενιστούν εκτός δείκτες χειρισμού του λειτουργικού Συστήματος, έτσι ώστε όλες οι εισόδου/εξόδου CRT αποστέλλεται στους δείκτες λειτουργικού Συστήματος δεν είναι έγκυρη και CRT εξόδου δεν εμφανίζεται στην κονσόλα. Χρησιμοποιήστε τη λύση που περιγράφεται παραπάνω για να εξαλείψετε αυτό το πρόβλημα.

Σε περίπτωση που ξεκινά η εφαρμογή Γραφικών από τη γραμμή εντολών χωρίς την εντολή "Έναρξη", τους δείκτες χειρισμού τυπικής λειτουργικού Συστήματος δεν είναι σωστά μηδενιστούν εκτός, αλλά εσφαλμένα έχουν μεταβιβαστεί από το Cmd.exe. Όταν ξεκινά η εφαρμογή CRT, τις τρεις χαμηλής λαβές εισόδου/εξόδου 0, 1 και 2 είναι προετοιμασία για να χρησιμοποιήσετε τους αριθμούς τρεις δείκτη χειρισμού που μεταβιβάζονται στην εφαρμογή CMD.EXE. Όταν η εφαρμογή καλεί AllocConsole(), τις ρουτίνες προετοιμασίας κονσόλας επιχειρήσετε να αντικαταστήσετε τι θεωρεί την προετοιμασία της κονσόλας για να μη τυπικές τιμές δείκτη χειρισμού λειτουργικού Συστήματος με τιμές έγκυρος δείκτης χειρισμού από τη νέα κονσόλα. Από coincidence, επειδή οι ρουτίνες προετοιμασίας κονσόλα μπορεί να δίνετε τις ίδιες τρεις τιμές για τις τυπικές λαβές λειτουργικού Συστήματος, η κονσόλα initilization θα αντικαταστήσει τις τυπικές τιμές δείκτη χειρισμού λειτουργικού Συστήματος με τις ίδιες τιμές που υπήρχαν πριν--εκείνα που έχουν μεταβιβαστεί από το Cmd.exe. Επομένως, εισόδου/εξόδου CRT λειτουργεί σε αυτήν την περίπτωση.

Είναι σημαντικό να αντιληφθούν ότι η ικανότητα χρήσης ρουτίνες CRT από μια εφαρμογή Γραφικών που εκτελούνται από τη γραμμή εντολών δεν ήταν από τη σχεδίαση, έτσι μπορεί αυτό να μην λειτουργούν σε μελλοντικές εκδόσεις των Windows NT ή των Windows. In a future version, you may need the workaround not just for applications started on the command line with "start <application name="">", but also for applications started on the command line with "application name". </application>

Ιδιότητες

Αναγν. άρθρου: 105305 - Τελευταία αναθεώρηση: Σάββατο, 18 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Win32 Application Programming Interface στις ακόλουθες πλατφόρμες
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
Λέξεις-κλειδιά: 
kbconsole kbinfo kbkernbase kbmt KB105305 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:105305

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

 

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