• ベストアンサー

コマンドプロンプトのウィンドウが出てしまう

c++でソフトを作っています。 まったく画面を持たないものを作りたいのですが、 実行すると、コマンドプロンプトのウィンドウが 一瞬だけ現れて消えます。 このウィンドウが出ないようにしたいです。 iostream.hをインクルードしているからでしょうか。 これはデバッグ用でインクルードしていたのですが 最後にコメントアウトしたら、解決できない構文エラーが 出てきて困ってしまいました。 そのためインクルードしたままです。 あまり経験がないので、トンチンカンな質問になって いるかもしれませんが、これで分かる方いたらお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

#1です。 > やってみて気づいたんですが、このプログラムは呼び出された時の引数を使いたいので、Winmainにはできないのでは?と思いました。 argv[1] とかを使いたいということですね? 確かにWinMainにすると mainのときのようにそのような調整はしてくれませんので、 自前で組み立てる必要があります。 GetCommandLine というAPIで、コマンドラインの入力を丸々取れます。 Windows9xを考慮する必要がなく、Unicodeで扱っていいのなら CommandLineToArgvW APIでコマンドライン入力を argv[][] 形式に変換してくれます。 最悪自分でやることになりますが、以下のページが参考になると思います。 コマンドラインの分割 http://techtips.belution.com/ja/vc/0084/

otaks
質問者

お礼

難しそうですが、参考URLを見てやってみます。 ご回答ありがとうございました。

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★追記。 ・ちょっと使い方の記述を間違いましたので修正します。  下の 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』は自作関数でした。 ・以上。修正と補足でした。

otaks
質問者

お礼

ご回答ありがとうございました。 今回はXPを対象としたソフトを作っているので、 CommandLineToArgvW を使って該当部分を作ることにしました。 いただいたソースは勉強に参考させていただきます。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★まったく画面を持たないものを作りたいのならば 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 ); }

参考URL:
http://wisdom.sakura.ne.jp/system/winapi/win32/win6.html
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

Windows用のプログラムを作っているということでよろしいですか? その場合、プログラムの開始は main()になっていますか? それとも WinMain() ですか? 前者だとコンソールがどうしても出てしまいますので、後者の エントリを使うようにしないといけません。 >iostream.h iostream.h は古いスタイルのものですので、できればより新しい iostream を使ったほうがよろしいかと思います。もちろん 古いものを使う理由があるのなら無理強いはしませんが。

otaks
質問者

補足

>Windows用のプログラムを作っているということでよろしいですか? そうです。Windows用のプログラムです。 >その場合、プログラムの開始は main()になっていますか? >それとも WinMain() ですか? main()になっています。 iostreamについてはそのようにしようと思います。 やってみて気づいたんですが、このプログラムは呼び出された時の引数を使いたいので、Winmainにはできないのでは?と思いました。

関連するQ&A