
windowsアプリケーションでprintfを使用したいのですがうまくできません。
AllocConsole関数を使えば、良いと聞いたのですが動きません。使い方が間違っているのでしょうか?
AllocConsole();
freopen("file", "w", stdout); //標準出力をコンソールにする
freopen("file", "r", stdin); //標準入力をコンソールにする
printf("いいえ");
error C3861: 'AllocConsole': 識別子が見つかりませんでした
とエラーが出ます。
どなたかご教授お願いします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.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);
No.4
- 回答日時:
訂正
> 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();
}
No.3
- 回答日時:
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 …
を参考にしてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python エラー
-
適切な変換関数が存在しない???
-
VB2008で定数に色の設定をした...
-
コールバック関数指定時のエラー
-
Excelのエラーで困ってます。
-
visual C++ でビルドの中止がで...
-
SQLServerについて
-
バッチからsqlplusの接続エラー...
-
コンパイルできません。
-
フォートランプログラムのエラ...
-
レコードセットをcloseする所で...
-
BC30002: 型 'ListItem' が定義...
-
VC2010のビルドエラーを全部出...
-
Visual Studioのstrcpy_sについて
-
VisualC++でエラーが大量に
-
エクセルのエラーメッセージ「4...
-
左側がクラス、構造体、共用体...
-
ASP.NETの実行時のエラーについて
-
BCC・stdio.h・_stddef.hのエラー
-
multiple definitionというエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
Excelのエラーで困ってます。
-
バッチからsqlplusの接続エラー...
-
適切な変換関数が存在しない???
-
visual C++ でビルドの中止がで...
-
fortranでプログラムを実行する...
-
デバッグ中のエラーのことで教...
-
Handlesについて
-
HEWを使用しているのですが、こ...
-
ビルド失敗 指定されたファイ...
-
VB2008で定数に色の設定をした...
-
コンパイルできません。
-
DLL関数を使ったプログラム
-
sys/time.hのインクルードがで...
-
ccコマンド時の0711-317エラー
-
左側がクラス、構造体、共用体...
-
c#プログラムについて
-
Visual Studioのstrcpy_sについて
-
LPCWSTRとchar
おすすめ情報