- ベストアンサー
コマンドプロンプトのウィンドウが出てしまう
c++でソフトを作っています。 まったく画面を持たないものを作りたいのですが、 実行すると、コマンドプロンプトのウィンドウが 一瞬だけ現れて消えます。 このウィンドウが出ないようにしたいです。 iostream.hをインクルードしているからでしょうか。 これはデバッグ用でインクルードしていたのですが 最後にコメントアウトしたら、解決できない構文エラーが 出てきて困ってしまいました。 そのためインクルードしたままです。 あまり経験がないので、トンチンカンな質問になって いるかもしれませんが、これで分かる方いたらお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 > やってみて気づいたんですが、このプログラムは呼び出された時の引数を使いたいので、Winmainにはできないのでは?と思いました。 argv[1] とかを使いたいということですね? 確かにWinMainにすると mainのときのようにそのような調整はしてくれませんので、 自前で組み立てる必要があります。 GetCommandLine というAPIで、コマンドラインの入力を丸々取れます。 Windows9xを考慮する必要がなく、Unicodeで扱っていいのなら CommandLineToArgvW APIでコマンドライン入力を argv[][] 形式に変換してくれます。 最悪自分でやることになりますが、以下のページが参考になると思います。 コマンドラインの分割 http://techtips.belution.com/ja/vc/0084/
その他の回答 (3)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★追記。 ・ちょっと使い方の記述を間違いましたので修正します。 下の WinMain が修正した正しい使い方です。 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { LPTSTR Argv[ 256 ]; ←最大引数の数 INT Argc; ←引数の個数 Argc = TipCommandLineToArgv( GetCommandLine(), Argv, 256 ); /* メッセージ・ループなど(WS_VISIBLEを指定しないで非表示ウインドウを作成) */ return( 0 ); } 補足: 『TipCommandLineToArgv()』関数の『TipTextMalloc』がオリジナルの関数を使っていましたので 『StrDup』という関数に置き換えて下さい。この『StrDup』を利用するときには『shlwapi.h』の ヘッダをインクルードして『shlwapi.lib』ライブラリをインポートして下さい。 ・『TipTextMalloc』も『StrDup』も malloc などで新しく確保した領域に文字列をコピーします。 そして、確保&コピーした文字列へのポインタを返します。→『TipTextMalloc』は自作関数でした。 ・以上。修正と補足でした。
お礼
ご回答ありがとうございました。 今回はXPを対象としたソフトを作っているので、 CommandLineToArgvW を使って該当部分を作ることにしました。 いただいたソースは勉強に参考させていただきます。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★まったく画面を持たないものを作りたいのならば GUI で作ります。 ・同じ Windows 用プログラムでも CUI と GUI と大きく分けて2つあります。 実行すると『コマンドプロンプトのウィンドウが一瞬だけ現れて消えます。』というのは コンソール・アプリケーション(CUI)ですね。 ・GUI のアプリケーション(WinMain)にすればウインドウを非表示に出来ます。 作り方は普通に CreateWindow などでウインドを作成しますが、非表示の設定にします。 非表示の設定はウインドウスタイルの『WS_VISIBLE』をつけなければ良いのです。 ・あと WinMain() 関数の引数については回答者 No.2 さんの回答のように GetCommandLine 関数から 取得した文字列を自前で引数分割すればいいでしょう。 紹介されているリンクのソースも分割できそうですが、私が昔作成した引数分割関数も載せておきます。 // コマンドライン文字列を1つに分割 LPTSTR TipCommandLineParam( LPCTSTR *lpCommandLine, LPTSTR lpBuff ) { LPTSTR lpDest = lpBuff; LPCTSTR lpTail; if ( (lpCommandLine != NULL) && (*lpCommandLine != NULL) ){ for ( lpTail = *lpCommandLine ; isspace(*lpTail) ; lpTail++ ){ ; } if ( *lpTail != '\0' ){ if ( *lpTail == '\"' ){ while ( *(++lpTail) != '\0' ){ if ( *lpTail == '\"' ){ lpTail++; break; } *lpDest++ = *lpTail; } } *lpDest = '\0'; *lpCommandLine = lpTail; return( lpBuff ); } } return( NULL ); } // 引数をポインタへの配列にセット INT TipCommandLineToArgv( LPCTSTR lpCommandLine, LPTSTR lpArgv[], INT nMax ) { TCHAR szBuff[ MAX_PATH ]; INT nCount; for ( nCount = 0 ; TipCommandLineParam(&lpCommandLine,szBuff) != NULL ; nCount++ ){ if ( nCount >= (nMax - 1) ){ break; } lpArgv[ nCount ] = TipTextMalloc( szBuff ); } lpArgv[ nCount ] = NULL; return( nCount ); } // 引数の個数を数える INT TipCommandLineToArgc( LPCTSTR lpCommandLine ) { TCHAR szBuff[ MAX_PATH ]; INT nCount; for ( nCount = 0 ; TipCommandLineParam(&lpCommandLine,szBuff) != NULL ; nCount++ ){ ; } return( nCount ); } 使い方: int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { TCHAR szCommadLine[ 32768 ]; ←動的確保した方がいいかもね。 LPTSTR Argv[ 256 ]; ←最大引数の数 INT Argc; ←引数の個数 lstrcpy( szCommadLine, GetCommandLine() ); Argc = TipCommandLineToArgv( szCommandLine, Argv, 256 ); /* メッセージ・ループなど(WS_VISIBLEを指定しないで非表示ウインドウを作成) */ return( 0 ); }
- sakusaker7
- ベストアンサー率62% (800/1280)
Windows用のプログラムを作っているということでよろしいですか? その場合、プログラムの開始は main()になっていますか? それとも WinMain() ですか? 前者だとコンソールがどうしても出てしまいますので、後者の エントリを使うようにしないといけません。 >iostream.h iostream.h は古いスタイルのものですので、できればより新しい iostream を使ったほうがよろしいかと思います。もちろん 古いものを使う理由があるのなら無理強いはしませんが。
補足
>Windows用のプログラムを作っているということでよろしいですか? そうです。Windows用のプログラムです。 >その場合、プログラムの開始は main()になっていますか? >それとも WinMain() ですか? main()になっています。 iostreamについてはそのようにしようと思います。 やってみて気づいたんですが、このプログラムは呼び出された時の引数を使いたいので、Winmainにはできないのでは?と思いました。
お礼
難しそうですが、参考URLを見てやってみます。 ご回答ありがとうございました。