• 締切済み

windowsフォームアプリケーションでprintfの使用

windowsアプリケーションでprintfを使用したいのですがうまくできません。 AllocConsole関数を使えば、良いと聞いたのですが動きません。使い方が間違っているのでしょうか? AllocConsole(); freopen("file", "w", stdout); //標準出力をコンソールにする freopen("file", "r", stdin); //標準入力をコンソールにする  printf("いいえ"); error C3861: 'AllocConsole': 識別子が見つかりませんでした とエラーが出ます。 どなたかご教授お願いします。

みんなの回答

回答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/142closebtn/closebtn.html // 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/vcgeneralja/thread/fa08965d-c311-4764-8576-86b6e1b75ada を参考にしてください。

shokka
質問者

お礼

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

回答No.2

>#include <wincon.h>を加えたところエラーが82個になりました。エラー箇所がwincon.hとなっております。 具体的なエラーメッセージが示されていないのでなんとも言えませんが、もしかしたら、 windows,hをインクルードした後にwincon.hをインクルードすると上手くいきませんか? #include <windows.h> #include <wincon.h> と言う具合に

shokka
質問者

お礼

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

回答No.1

>error C3861: 'AllocConsole': 識別子が見つかりませんでした とエラーが出ます。 そのエラーが出るのであれば単純にincludeが抜けているだけではないでしょうか? #include <wincon.h>

shokka
質問者

補足

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

関連するQ&A