dポイントプレゼントキャンペーン実施中!

windowsアプリケーションでprintfを使用したいのですがうまくできません。
AllocConsole関数を使えば、良いと聞いたのですが動きません。使い方が間違っているのでしょうか?

AllocConsole();
freopen("file", "w", stdout); //標準出力をコンソールにする
freopen("file", "r", stdin); //標準入力をコンソールにする
 printf("いいえ");

error C3861: 'AllocConsole': 識別子が見つかりませんでした
とエラーが出ます。
どなたかご教授お願いします。

A 回答 (5件)

ついでにprintfを使った場合はこんな感じ。



// #pragma onceの下
#if !defined(WINVER)
#define WINVER 0x0500
#endif

#if !defined(_WIN32_WINNT)
#define _WIN32_WINNT WINVER
#endif

#include "windows.h"
#include "wincon.h"

#pragma comment(lib, "user32.lib")
#pragma comment(lib, "kernel32.lib")

#include <cstdio>
#pragma warning(disable : 4996)

// form load
if (::GetConsoleWindow() == NULL)
{
  ::AllocConsole();
  freopen("CONOUT$", "w", stdout);
  freopen("CONIN$", "r", stdin);

  HWND hWnd = ::GetConsoleWindow();
  if (hWnd != NULL)
  {
    HMENU hMenu = ::GetSystemMenu(hWnd, 0);
    ::RemoveMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
  }
}

// form closed
if (::GetConsoleWindow() != NULL) {
  ::FreeConsole();
}

// button click
// DateTime::Now.ToString()からchar型配列にするのはメンドイから
// GetLocalTimeで代用
SYSTEMTIME st;
::GetLocalTime(&st);
printf("%04hd/%02hd%/%02hd %02hd:%02hd:%02hd\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
    • good
    • 0

訂正


>  Boolean RemoveMenu(IntPtr hMenu, UInt32 uPosition, UInt32 uFlags);
UInt32 RemoveMenu(IntPtr hMenu, UInt32 uPosition, UInt32 uFlags);


windows.h等をインクルードする場合は
// #pragma onceの直下に記述
#if !defined(WINVER)
#define WINVER 0x0500
#endif

#if !defined(_WIN32_WINNT)
#define _WIN32_WINNT WINVER
#endif

#include "windows.h"
#include "wincon.h"

#pragma comment(lib, "user32.lib")
#pragma comment(lib, "kernel32.lib")

として
// Form1_Load
if (::GetConsoleWindow() == NULL)
{
  ::AllocConsole();
  StreamWriter^ StdOut = gcnew StreamWriter(Console::OpenStandardOutput(), Encoding::Default);
  StdOut->AutoFlush = true;
  Console::SetOut(StdOut);

  HWND hWnd = ::GetConsoleWindow();
  if (hWnd != NULL)
  {
    HMENU hMenu = ::GetSystemMenu(hWnd, 0);
    ::RemoveMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
  }
}

// Form1_FormClosed
if (::GetConsoleWindow() != NULL)
{
  Console::SetOut(StreamWriter::Null);
  ::FreeConsole();
}
    • good
    • 0

printfではなくConsole::Write(Console::WriteLine)では駄目でしょうか?


機能的にさほど大差ないと思います。
(String^をそのまま渡せるのがでかいと思う。)

Console::Writeを使うのであれば、DllImportを使ってこんな感じでしょうか。
参考:http://www42.atwiki.jp/jfactory/pages/49.html
  http://www.atmarkit.co.jp/fdotnet/dotnettips/142 …

// Visual Studio 2005 CLR Windowsフォームアプリケーション
// フォームを開いたときにコンソール画面を作成し、
// フォームを閉じたときに破棄する。
// ボタンを押すと、コンソール画面に現在時刻を表示する。
// ※インデント保持のため全角スペースを使用。
//  コピペ時に全角空白を置換しないとエラーが出ます。

// Form1.h の #pragma once のすぐ下に記述
namespace Win32
{
  using namespace System;
  using namespace System::Runtime::InteropServices;

  [DllImport("kernel32.dll")]
  UInt32 AllocConsole();
  [DllImport("kernel32.dll")]
  UInt32 FreeConsole();
  [DllImport("kernel32.dll")]
  IntPtr GetConsoleWindow();

  [DllImport("user32.dll")]
  IntPtr GetSystemMenu(IntPtr hWnd, UInt32 bRevert);
  [DllImport("user32.dll")]
  Boolean RemoveMenu(IntPtr hMenu, UInt32 uPosition, UInt32 uFlags);

  const UInt32 SC_CLOSE = 0x0000F060;
  const UInt32 MF_BYCOMMAND = 0x00000000;
};


// namespace プロジェクト名 { の下の
// using namespace の羅列の下に追加
using namespace System::IO;
using namespace System::Text;

// デザイン画面よりForm1のイベントのLoadを追加し、
// 下記コードを記述
if (Win32::GetConsoleWindow() == IntPtr::Zero)
{
  Win32::AllocConsole();
  StreamWriter^ StdOut = gcnew StreamWriter(Console::OpenStandardOutput(), Encoding::Default);
  StdOut->AutoFlush = true;
  Console::SetOut(StdOut);

  IntPtr hWnd = Win32::GetConsoleWindow();
  if (hWnd != IntPtr::Zero)
  {
    IntPtr hMenu = Win32::GetSystemMenu(hWnd, 0);
    Win32::RemoveMenu(hMenu, Win32::SC_CLOSE, Win32::MF_BYCOMMAND);
  }
}

// デザイン画面よりForm1のイベントのForm_Closedを追加し、
// 下記コードを記述
if (Win32::GetConsoleWindow() != IntPtr::Zero)
{
  Console::SetOut(StreamWriter::Null);
  Win32::FreeConsole();
}

// デザイン画面よりButton1を追加し、クリックイベントを追加し、
// 下記コードを記述
Console::WriteLine(L"{0}", DateTime::Now);


DllImportを使わず、windows.h等を#includeして使う場合
http://social.msdn.microsoft.com/Forums/ja-JP/vc …
を参考にしてください。
    • good
    • 0
この回答へのお礼

詳しく教えてくださりありがとうございます。
参考にして活かしたいと思います。

お礼日時:2010/02/04 17:23

>#include <wincon.h>を加えたところエラーが82個になりました。

エラー箇所がwincon.hとなっております。

具体的なエラーメッセージが示されていないのでなんとも言えませんが、もしかしたら、
windows,hをインクルードした後にwincon.hをインクルードすると上手くいきませんか?
#include <windows.h>
#include <wincon.h>
と言う具合に
    • good
    • 0
この回答へのお礼

ご教授いただいた通り変更したところうまく動きました。
ありがとうございます。

お礼日時:2010/02/04 16:38

>error C3861: 'AllocConsole': 識別子が見つかりませんでした


とエラーが出ます。

そのエラーが出るのであれば単純にincludeが抜けているだけではないでしょうか?
#include <wincon.h>

この回答への補足

早速のご返答ありがとうございます。
#include <wincon.h>を加えたところエラーが82個になりました。エラー箇所がwincon.hとなっております。

補足日時:2010/02/03 20:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!