Saya punya proyek win32 yang saya muat ke dalam Visual Studio 2005. Saya ingin dapat mencetak sesuatu ke jendela keluaran Visual Studio, tetapi saya tidak bisa selama hidup saya mencari tahu caranya. Saya sudah mencoba 'printf' dan 'cout <<' tetapi pesan saya tetap tidak tercetak.
Apakah ada cara khusus untuk mencetak ke jendela keluaran Visual Studio?
Jawaban:
Anda bisa menggunakan
OutputDebugString
.OutputDebugString
adalah makro yang bergantung pada opsi build Anda, baik dipetakan keOutputDebugStringA(char const*)
atauOutputDebugStringW(wchar_t const*)
. Dalam kasus selanjutnya Anda harus menyediakan string karakter lebar ke fungsi tersebut. Untuk membuat literal karakter lebar, Anda dapat menggunakanL
awalan:Biasanya Anda akan menggunakan versi makro bersama dengan
_T
makro seperti ini:Jika proyek Anda dikonfigurasi untuk membangun UNICODE, itu akan diperluas menjadi:
Jika Anda tidak membangun untuk UNICODE, itu akan diperluas menjadi:
sumber
myStr
. Apakah ituchar*
,wchar_t*
atauLPTSTR
? Dengan asumsi bahwachar*
Anda hanya meneleponOutputDebugStringA(myStr)
atau menggunakanOutputDebugStringW
denganwchar_t*
danOutputDebugString
denganLPTSTR
seperti yang dijelaskan dalam jawaban saya.OutputDebugString
dan tentukan simbol preprocessor yang sesuai untuk menyesuaikan dengan lebar karakter yang Anda gunakan atau gunakan tipe "T" yang fleksibel yang memungkinkan Anda untuk mengkompilasi karakter 8 dan 16 bit.Jika proyek tersebut adalah proyek GUI, tidak ada konsol yang akan muncul. Untuk mengubah proyek menjadi konsol, Anda perlu membuka panel properti proyek dan menyetel:
Solusi ini hanya berfungsi jika Anda memiliki titik masuk klasik " int main () ".
Tetapi jika Anda seperti dalam kasus saya (proyek openGL), Anda tidak perlu mengedit properti, karena ini berfungsi lebih baik:
printf dan cout akan bekerja seperti biasa.
Jika Anda memanggil AllocConsole sebelum pembuatan jendela, konsol akan muncul di belakang jendela, jika Anda memanggilnya setelahnya, konsol akan muncul di depan.
Memperbarui
freopen
sudah usang dan mungkin tidak aman. Gunakanfreopen_s
sebagai gantinya:sumber
EDITBIN
dapat menyetel subsistem keCONSOLE
meskipun Anda sedang menggunakanWinMain
daripadaint main()
.Untuk mencetak ke
real
konsol, Anda harus membuatnya terlihat dengan menggunakan bendera linker/SUBSYSTEM:CONSOLE
. Jendela konsol ekstra mengganggu, tetapi untuk tujuan debugging itu sangat berharga.OutputDebugString
mencetak ke keluaran debugger saat dijalankan di dalam debugger.sumber
Pertimbangkan untuk menggunakan Makro runtime VC ++ untuk Pelaporan _RPT N () dan _RPTF N ()
Contoh...
Atau Anda dapat menggunakan fungsi runtime VC ++ _CrtDbgReport, _CrtDbgReportW secara langsung.
sumber
_RPTF0
dapat digunakan di mana tidak ada variabel yang diharapkan diteruskan setelah format string. The_RPTFN
makro, di sisi lain, membutuhkan setidaknya satu argumen mengikuti format string.Jika Anda ingin mencetak variabel desimal:
sumber
%u
untuk unsigned,%f
untuk float sesuai referensi .Jika Anda perlu melihat output dari program yang ada yang banyak menggunakan printf tanpa mengubah kode (atau dengan sedikit perubahan), Anda dapat mendefinisikan ulang printf sebagai berikut dan menambahkannya ke header umum (stdafx.h).
sumber
Proyek Win32 Anda kemungkinan besar merupakan proyek GUI, bukan proyek konsol. Ini menyebabkan perbedaan pada header yang dapat dieksekusi. Akibatnya, proyek GUI Anda akan bertanggung jawab untuk membuka jendelanya sendiri. Itu mungkin jendela konsol. Panggil
AllocConsole()
untuk membuatnya, dan gunakan fungsi konsol Win32 untuk menulis padanya.sumber
Saya sedang mencari cara untuk melakukan ini sendiri dan menemukan solusi sederhana.
Saya berasumsi bahwa Anda memulai Proyek Win32 default (aplikasi Windows) di Visual Studio, yang menyediakan fungsi "WinMain". Secara default, Visual Studio menetapkan titik masuk ke "SUBSYSTEM: WINDOWS". Anda harus terlebih dahulu mengubahnya dengan membuka:
Proyek -> Properti -> Linker -> Sistem -> Subsistem
Dan pilih "Console (/ SUBSYSTEM: CONSOLE)" dari daftar drop-down.
Sekarang, program tidak akan berjalan, karena fungsi "main" dibutuhkan sebagai pengganti fungsi "WinMain".
Jadi sekarang Anda dapat menambahkan fungsi "main" seperti yang biasa Anda lakukan di C ++. Setelah ini, untuk memulai program GUI, Anda dapat memanggil fungsi "WinMain" dari dalam fungsi "utama".
Bagian awal dari program Anda sekarang akan terlihat seperti ini:
Hasil implementasi saya
Sekarang Anda dapat menggunakan fungsi untuk menampilkan konsol di bagian mana pun dari program GUI Anda untuk debugging atau tujuan lain.
sumber
Anda juga dapat menggunakan metode WriteConsole untuk mencetak di konsol.
sumber