INFO: Menelepon CRT Output rutinitas dari aplikasi GUI

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 105305 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

RINGKASAN

Menggunakan C Run-time output rutinitas, seperti printf(), dari GUI aplikasi, diperlukan untuk membuat konsol. Aplikasi Win32 pemrograman antarmuka (API) AllocConsole() menciptakan konsol. CRT setvbuf() rutin menghilangkan buffer sehingga output terlihat segera.

Metode ini bekerja jika aplikasi GUI dijalankan dari baris perintah atau dari File Manager. Namun, metode ini tidak berhasil jika aplikasi mulai dari manajer Program atau melalui perintah "start". Berikut kode ini menunjukkan bagaimana untuk mengatasi masalah ini:
   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 );
				
Kode ini membuka pegangan CRT tingkat rendah baru konsol benar output menangani, menghubungkan aliran baru dengan yang menangani tingkat rendah, dan menggantikan stdout dengan aliran yang baru. Proses ini mengurus fungsi yang menggunakan stdout, seperti printf(), puts(), dan sebagainya. Menggunakan prosedur yang sama untuk stdin dan stderr.

Perhatikan bahwa kode ini tidak memperbaiki masalah dengan menangani 0, 1 dan 2. Dalam Bahkan, berkat komplikasi lainnya, hal ini tidak mungkin untuk memperbaiki ini, dan oleh karena itu diperlukan untuk menggunakan aliran I/O bukan I/O tingkat rendah.

INFORMASI LEBIH LANJUT

Ketika sebuah aplikasi GUI dimulai dengan perintah "mulai", tiga OS standar menangani STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, dan Memusatkan STD_ERROR_HANDLE adalah semua "perhatian keluar" oleh inisialisasi konsol rutinitas. Ini menangani tiga digantikan oleh berlaku nilai ketika GUI aplikasi panggilan AllocConsole(). Oleh karena itu, setelah selesai, memanggil GetStdHandle() akan selalu kembali nilai-nilai pegangan yang berlaku. Masalahnya adalah bahwa CRT sudah selesai inisialisasi sebelum aplikasi Anda mendapatkan kesempatan untuk memanggil AllocConsole(); tiga rendah I/O pegangan 0, 1 dan 2 memiliki sudah dibentuk untuk menggunakan asli memusatkan perhatian keluar OS menangani, sehingga semua CRT I/O dikirim untuk menangani OS tidak sah dan CRT output tidak muncul di konsol. Menggunakan solusi yang dijelaskan di atas untuk menghilangkan masalah ini.

Dalam kasus untuk memulai aplikasi GUI dari baris perintah tanpa "awal" perintah, standar memusatkan OS menangani adalah tidak benar perhatian keluar, tapi salah mewarisi dari CMD.EXE. Ketika aplikasi 's CRT initializes, tiga rendah I/O pegangan 0, 1 dan 2 diinisialisasi menggunakan tiga menangani angka yang aplikasi mewarisi dari CMD.EXE. Kapan panggilan aplikasi AllocConsole(), konsol inisialisasi rutin upaya untuk menggantikan inisialisasi konsol percaya tidak sah OS standar menangani dengan nilai-nilai pegangan berlaku dari konsol baru. Oleh kebetulan, karena konsol inisialisasi rutin cenderung memberikan tiga nilai yang sama untuk menangani OS standar, konsol initilization akan menggantikan nilai-nilai pegangan OS standar yang sama nilai-nilai yang ada sebelum--yang diwarisi dari CMD.EXE. Oleh karena itu, CRT I/O bekerja dalam hal ini.

Sangat penting untuk menyadari bahwa kemampuan untuk menggunakan CRT rutinitas dari GUI aplikasi yang dijalankan dari baris perintah bukanlah oleh desain jadi ini mungkin tidak bekerja di masa depan versi Windows NT atau Windows. Dalam versi masa depan, Anda mungkin perlu solusi tidak hanya untuk aplikasi mulai pada perintah jalur dengan "mulai <application name="">", tetapi juga untuk aplikasi mulai pada baris perintah dengan "nama aplikasi". </application>

Properti

ID Artikel: 105305 - Kajian Terakhir: 14 September 2011 - Revisi: 2.0
Berlaku bagi:
Kata kunci: 
kbconsole kbinfo kbkernbase kbmt KB105305 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:105305

Berikan Masukan

 

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