回答:
使用できますOutputDebugString
。OutputDebugString
は、ビルドオプションに応じて、OutputDebugStringA(char const*)
またはにマップされるマクロですOutputDebugStringW(wchar_t const*)
。後者の場合、ワイド文字列を関数に提供する必要があります。ワイド文字リテラルを作成するには、L
プレフィックスを使用できます。
OutputDebugStringW(L"My output string.");
通常、次のようにマクロと一緒にマクロバージョンを使用します_T
。
OutputDebugString(_T("My output string."));
プロジェクトがUNICODE用にビルドするように構成されている場合は、次のように展開されます。
OutputDebugStringW(L"My output string.");
UNICODE向けにビルドしていない場合は、次のように展開されます。
OutputDebugStringA("My output string.");
myStr
ます。それかchar*
、wchar_t*
それともLPTSTR
?それがあると仮定すると、char*
あなたは、単に呼び出すOutputDebugStringA(myStr)
か、使用OutputDebugStringW
してwchar_t*
とOutputDebugString
してLPTSTR
私の答えで説明したように。
OutputDebugString
、使用する文字の幅に一致する適切なプリプロセッサシンボルを定義するか、8ビットと16ビットの両方の文字にコンパイルできる柔軟な "T"タイプを使用します。
プロジェクトがGUIプロジェクトの場合、コンソールは表示されません。プロジェクトをコンソールに変更するには、プロジェクトのプロパティパネルに移動して次のように設定する必要があります。
このソリューションは、古典的な " int main()がある場合にのみ機能します」エントリポイント。
しかし、私のような場合(openGLプロジェクト)、プロパティを編集する必要はありません。
AllocConsole();
freopen("CONIN$", "r",stdin);
freopen("CONOUT$", "w",stdout);
freopen("CONOUT$", "w",stderr);
printfとcoutは通常どおり機能します。
ウィンドウを作成する前にAllocConsoleを呼び出すと、コンソールはウィンドウの背後に表示され、後で呼び出すと、前面に表示されます。
更新
freopen
は非推奨であり、安全でない可能性があります。freopen_s
代わりに使用:
FILE* fp;
AllocConsole();
freopen_s(&fp, "CONIN$", "r", stdin);
freopen_s(&fp, "CONOUT$", "w", stdout);
freopen_s(&fp, "CONOUT$", "w", stderr);
EDITBIN
ではなくCONSOLE
を使用している場合でも、サブシステムをに設定できます。WinMain
int main()
印刷するにはreal
、コンソールには、リンカフラグを使用することによって、それが目に見えるようにする必要があり/SUBSYSTEM:CONSOLE
。余分なコンソールウィンドウは煩わしいですが、デバッグの目的には非常に役立ちます。
OutputDebugString
デバッガー内で実行するときに、デバッガーの出力に出力します。
_RPT N()および_RPTF N()のレポートにVC ++ランタイムマクロを使用することを検討してください
CRTDBG.Hで定義されている_RPTnおよび_RPTFnマクロを使用して、デバッグ用のprintfステートメントの使用を置き換えることができます。これらのマクロは、_DEBUGが定義されていない場合、リリースビルドで自動的に非表示になるため、#ifdefsで囲む必要はありません。
例...
if (someVar > MAX_SOMEVAR) {
_RPTF2(_CRT_WARN, "In NameOfThisFunc( ),"
" someVar= %d, otherVar= %d\n", someVar, otherVar );
}
または、VC ++ランタイム関数_CrtDbgReport、_CrtDbgReportWを直接使用することもできます。
_CrtDbgReportおよび_CrtDbgReportWは、デバッグレポートを3つの異なる宛先(デバッグレポートファイル、デバッグモニター(Visual Studioデバッガー)、またはデバッグメッセージウィンドウ)に送信できます。
_CrtDbgReportおよび_CrtDbgReportWは、printf関数またはwprintf関数で定義されたのと同じルールを使用して、argument [n]引数をフォーマット文字列に置き換えることにより、デバッグレポートのユーザーメッセージを作成します。これらの関数は、デバッグレポートを生成し、現在のレポートモードとreportTypeに定義されたファイルに基づいて、1つまたは複数の宛先を決定します。レポートがデバッグメッセージウィンドウに送信されると、ファイル名、lineNumber、およびmoduleNameがウィンドウに表示される情報に含まれます。
_RPTF0
、フォーマット文字列の後に変数が渡されないことが予想される場合に使用できることに注意してください。_RPTFN
マクロは、一方で、必要とするフォーマット文字列以下の少なくとも一つの引数を。
コードを変更せずに(または最小限の変更で)printfを広範囲に使用した既存のプログラムの出力を確認する必要がある場合は、printfを次のように再定義して、共通ヘッダー(stdafx.h)に追加できます。
int print_log(const char* format, ...)
{
static char s_printf_buf[1024];
va_list args;
va_start(args, format);
_vsnprintf(s_printf_buf, sizeof(s_printf_buf), format, args);
va_end(args);
OutputDebugStringA(s_printf_buf);
return 0;
}
#define printf(format, ...) \
print_log(format, __VA_ARGS__)
私はこれを自分で行う方法を探していて、簡単な解決策を見つけました。
「WinMain」機能を提供するデフォルトのWin32プロジェクト(Windowsアプリケーション)をVisual Studioで起動したと想定しています。デフォルトでは、Visual Studioはエントリポイントを "SUBSYSTEM:WINDOWS"に設定します。最初にこれを変更する必要があります:
プロジェクト->プロパティ->リンカ->システム->サブシステム
そして、ドロップダウンリストから「コンソール(/ SUBSYSTEM:CONSOLE)」を選択します。
これで、「WinMain」関数の代わりに「main」関数が必要になるため、プログラムは実行されません。
したがって、C ++で通常行うように、「メイン」関数を追加できます。この後、GUIプログラムを開始するには、「main」関数内から「WinMain」関数を呼び出すことができます。
プログラムの最初の部分は次のようになります。
#include <iostream>
using namespace std;
// Main function for the console
int main(){
// Calling the wWinMain function to start the GUI program
// Parameters:
// GetModuleHandle(NULL) - To get a handle to the current instance
// NULL - Previous instance is not needed
// NULL - Command line parameters are not needed
// 1 - To show the window normally
wWinMain(GetModuleHandle(NULL), NULL,NULL, 1);
system("pause");
return 0;
}
// Function for entry into GUI program
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
// This will display "Hello World" in the console as soon as the GUI begins.
cout << "Hello World" << endl;
.
.
.
関数を使用して、デバッグまたはその他の目的でGUIプログラムの任意の部分でコンソールに出力できます。