• ベストアンサー

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

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

  • otaks
  • お礼率53% (270/507)

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

  • ベストアンサー
  • 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

  • コマンドプロンプトからのコンパイル

    PCに「Visual Studio .NET」が入っています。 ソフト上から↓のようなプログラムを実行する方法は友達に教えてもらったのですが コマンドプロンプトからコンパイルして実行するにはどうしたらよいのでしょうか。 よろしくお願いします。 ---------------------------- #include <iostream> using namespace std; int main() { cout << "ようこそc++へ!\n"; return 0; }

  • コマンドプロンプトが瞬時に終了してしまうのですが・・・。

    駆け出し中の駆け出しです。 例の一番最初にやる「hello」と表示させるプログラム↓ #include <stdio.h> int main(){printf("hello\n");return 0;} を実行したのですが一瞬だけコマンドプロンプトが起動してhelloと表示されてるのは何とかわかるんですが、一瞬(0.1秒くらい?)しか表示されず、即効でプロンプトが消えてしまいます。もともとCDに入っていたサンプルを実行しても同じでした。これはどうしようもないのでしょうか。 windowsxpです。

  • コマンドプロンプトが起動できない

    Windows2000でコマンドプロンプトが正常に起動しません。 アクセサリの”コマンドプロンプト”からも、SYSTEM32のCMD.exeを起動しても、一瞬ウィンドウが立ち上がった後に終了してしまいます。 何かいい解決方法をご存知の方はいらっしゃいませんか。 よろしくお願いします。

  • コマンドプロンプトについて

    Windows2000やXPにおける、コマンドプロンプトについてお伺いします。 よく使うコマンドなどを、Windowsのアイコンをクリックしただけで実行できるようにしたいのですができますか? どうすればいいのでしょうか? 例えば、私はipconfigをよく使うのですが、コマンドプロンプトを開いていちいちrenewやreleaseといったことを、その度々に打ち込まないといけないのですが、これを省略して、アイコンを作って、それをクリックするだけで実行できたらいいなと思っています。 こういうことができるかどうか、また、やり方など教えてください。よろしくお願いします。

  • コマンドプロンプトについて

    javaの入門書を読みながらjavaの学習をしています。 コマンドプロンプトのウィンドウについて質問致します。 最初にコマンドプロンプトにて以下のコマンドを実行しコンパイルします。 javac Helloworld.java 次に以下のコマンドで実行します。 java Helloworld すると実行結果が表示されず新しいウィンドウが開いてしまいます。 最初のウィンドウには「続行するには何かキーを押してください . . .」 と表示されています。 これはコマンドプロンプトの設定がおかしいのでしょうか? コンパイルは通っているので実行後、HelloWorldと表示されるはずなのですが・・・。 何卒、御教授願います。

  • コマンドプロンプトが一瞬で消える

    コマンドプロンプトを開いた状態に出来ません。 スタート⇒すべてのプログラム⇒アクセサリの中のコマンドプロンプトをクリックしても、画面が一瞬表示されてすぐに消えてしまいます。 ファイル名を指定して実行から、cmdと入力してもコマンドプロンプトの画面が一瞬現れ、すぐに消えてしまいます。 分かる方、何故、一瞬で消えてしまうのか教えてください。 お願いします。

  • コマンドプロンプトが表示されなくなった

    OSは、Windows 2000です。 ATコマンドを走らせるために、下記のホームページを参照しました。 http://support.microsoft.com/kb/313565/ja 上記HP通り、現在実行中のサービス一覧を表示するために コマンド プロンプトで『net start』を入力し、Enter キーを押しました。 何か一瞬見えたのですが、コマンド プロンプトの画面がすぐ消えました。 その後、コマンド プロンプトをクリックしても、ほんの一瞬なにか見えるのですが 表示されません。 どうしたらよいのでしょうか? どなたかアドバイスをいただけないでしょうか? よろしくお願い致します。

  • コマンドプロンプトの拡張

    UNIX系であればコマンド実行にTeraTermなどを使用していますが、Windowsでコマンド実行する際は標準のコマンドプロンプトを使用しています。 ですがコマンドプロンプトは非常に使いにくいです。 そこでコマンドプロンプトのコンソールを拡張したような何かいいソフトウェアはありませんでしょうか? 尚、Cygwinの存在は知っていますがもう少し手軽に使いたいと考えています。  どうぞよろしくお願いします。

  • コマンドプロンプト

    Windows Update 実行後の不要なバックアップファイルを消去するには、管理者プロンプトから DISM/online/cleanup-image/spsuperseded と入力実行すれば良い、との事なので、 コマンドプロンプトを管理者で立ち上げると、プロンプトが C:\windows\system32> となったので上記のコマンドを入力・実行したところ エラー87 online/cleanup-image/spsuperseded は不明なオプションです。 と表示される。 上記のコマンドを実行するにはどうすれば良いのか教えて下さい。

  • windowsのコマンドプロンプト上でJAVACコマンド

    本日ですがJAVAの参考書を買ってきて早速つまずいてまして、皆様のお知恵をいただければと思います。 windowsのコマンドプロンプト上でjavacコマンドを入力するように参考書に書いてあり、javacコマンドを入力すると 'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と出てしまいます。メモ帳にて書いた構文に間違いはありませんでした。ちなみにwindows VISTAとwindows2000で試しましたが両方とも同じ出力が返ってきました。 なぜコマンドがうまく通らないのかわかる方回答お願いします。