- 締切済み
windowsフォームアプリケーションでprintfの使用
windowsアプリケーションでprintfを使用したいのですがうまくできません。 AllocConsole関数を使えば、良いと聞いたのですが動きません。使い方が間違っているのでしょうか? AllocConsole(); freopen("file", "w", stdout); //標準出力をコンソールにする freopen("file", "r", stdin); //標準入力をコンソールにする printf("いいえ"); error C3861: 'AllocConsole': 識別子が見つかりませんでした とエラーが出ます。 どなたかご教授お願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- bluecampus
- ベストアンサー率66% (138/209)
ついでに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);
- bluecampus
- ベストアンサー率66% (138/209)
訂正 > 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(); }
- bluecampus
- ベストアンサー率66% (138/209)
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 を参考にしてください。
- cyacya2000
- ベストアンサー率54% (39/71)
>#include <wincon.h>を加えたところエラーが82個になりました。エラー箇所がwincon.hとなっております。 具体的なエラーメッセージが示されていないのでなんとも言えませんが、もしかしたら、 windows,hをインクルードした後にwincon.hをインクルードすると上手くいきませんか? #include <windows.h> #include <wincon.h> と言う具合に
お礼
ご教授いただいた通り変更したところうまく動きました。 ありがとうございます。
- cyacya2000
- ベストアンサー率54% (39/71)
>error C3861: 'AllocConsole': 識別子が見つかりませんでした とエラーが出ます。 そのエラーが出るのであれば単純にincludeが抜けているだけではないでしょうか? #include <wincon.h>
補足
早速のご返答ありがとうございます。 #include <wincon.h>を加えたところエラーが82個になりました。エラー箇所がwincon.hとなっております。
お礼
詳しく教えてくださりありがとうございます。 参考にして活かしたいと思います。