web-dev-qa-db-ja.com

Visual Studio 2010のWin32アプリケーションでprintf出力を表示する方法

Win32 アプリケーション(WinMainで入力)で Visual Studio 201 のprintf出力をどのように表示できますか?

20
Nick Van Brunt

厳密に質問に答えると、Visual Studio 2010のWin32アプリケーションでwinbase.hOutputDebugString関数を使用して、printfのような関数を使用できます。

その方法を示す簡単なプログラムを書きました。

#include <windows.h>
#include <stdio.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdShow, int nCmdShow)
{
    int number = 10;
    char str[256];
    sprintf_s(str, "It works! - number: %d \n", number);

    OutputDebugString(str);

    return 0;
}

OutputDebugString関数はLPCSTRをパラメーターとして受け取ります。 sprintf_sは、印刷前に文字列をフォーマットします。

これにより、結果がVisual Studio 2010の出力ウィンドウに出力されます。

お役に立てば幸いです。

28
rbento

コンソールウィンドウが必要です。これを取得する最も簡単な方法は、リンカーオプションを変更することです。プロジェクト+プロパティ、リンカー、システム、サブシステム=コンソール。 main()メソッドを追加します。

int main() {
    return _tWinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW);
}
14
Hans Passant

過去に AllocConsole 関数を使用してこれを実行したことは知っていますが、予想よりも少しトリッキーだったことも思い出します。

AllocConsoleでGoogleをすばやく検索すると、明らかに関連性があると思われる Windows Developer Journalの記事 が表示されます。そこからは、次のように漠然と私が思い出すものに似ているようです。

void SetStdOutToNewConsole()
{
    int hConHandle;
    long lStdHandle;
    FILE *fp;

    // Allocate a console for this app
    AllocConsole();

    // Redirect unbuffered STDOUT to the console
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen(hConHandle, "w");
    *stdout = *fp;

    setvbuf(stdout, NULL, _IONBF, 0);
}
13
torak

答えてくれてありがとうtorak。それは私を大いに助けました。

より大きなスクロールバックバッファーが必要だったので、 API関数 を確認した後、いくつか追加しました。他の人を助けるためにここで共有:

void SetStdOutToNewConsole()
{
    // allocate a console for this app
    AllocConsole();

    // redirect unbuffered STDOUT to the console
    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    int fileDescriptor = _open_osfhandle((intptr_t)consoleHandle, _O_TEXT);
    FILE *fp = _fdopen( fileDescriptor, "w" );
    *stdout = *fp;
    setvbuf( stdout, NULL, _IONBF, 0 );

    // give the console window a nicer title
    SetConsoleTitle(L"Debug Output");

    // give the console window a bigger buffer size
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    if ( GetConsoleScreenBufferInfo(consoleHandle, &csbi) )
    {
        COORD bufferSize;
        bufferSize.X = csbi.dwSize.X;
        bufferSize.Y = 9999;
        SetConsoleScreenBufferSize(consoleHandle, bufferSize);
    }
}

これにより、スクロールバック(画面バッファー)の高さが9999行に増加します。

Windows XPおよびWindows 7でテスト済み。

9

既存のprintfを変更する必要がなく、VS出力ウィンドウに出力する別の方法は、次のようになります。

#define printf printf2

int __cdecl printf2(const char *format, ...)
{
    char str[1024];

    va_list argptr;
    va_start(argptr, format);
    int ret = vsnprintf(str, sizeof(str), format, argptr);
    va_end(argptr);

    OutputDebugStringA(str);

    return ret;
}

...

printf("remains %s", "the same");
9
colin lamarre

これは、サンプルコードを含め、これを行う方法を説明するページです

AllocConsole()を使用してコンソールウィンドウを作成し、C標準ファイルハンドルを新しいコンソールウィンドウのHANDLEに関連付ける必要があります。

2
coffeebean

MinGWの場合、「_ O_TEXT」の代わりに「_A_SYSTEM」を使用します。移植されたQuintin Willison答えは次のとおりです。

#include <io.h>
void SetStdOutToNewConsole()
{
  // allocate a console for this app
  AllocConsole();
  // redirect unbuffered STDOUT to the console
  HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
  int fileDescriptor = _open_osfhandle((intptr_t)consoleHandle, _A_SYSTEM);
  FILE *fp = _fdopen( fileDescriptor, "w" );
  *stdout = *fp;
  setvbuf( stdout, NULL, _IONBF, 0 );
  // give the console window a nicer title
  SetConsoleTitle(L"Debug Output");
  // give the console window a bigger buffer size
  CONSOLE_SCREEN_BUFFER_INFO csbi;
  if ( GetConsoleScreenBufferInfo(consoleHandle, &csbi) )
  {
    COORD bufferSize;
    bufferSize.X = csbi.dwSize.X;
    bufferSize.Y = 9999;
    SetConsoleScreenBufferSize(consoleHandle, bufferSize);
  }
}
0
User