c++でソフトを作っています。
まったく画面を持たないものを作りたいのですが、
実行すると、コマンドプロンプトのウィンドウが
一瞬だけ現れて消えます。
このウィンドウが出ないようにしたいです。
iostream.hをインクルードしているからでしょうか。
これはデバッグ用でインクルードしていたのですが
最後にコメントアウトしたら、解決できない構文エラーが
出てきて困ってしまいました。
そのためインクルードしたままです。
あまり経験がないので、トンチンカンな質問になって
いるかもしれませんが、これで分かる方いたらお願いします。
No.2ベストアンサー
- 回答日時:
#1です。
> やってみて気づいたんですが、このプログラムは呼び出された時の引数を使いたいので、Winmainにはできないのでは?と思いました。
argv[1] とかを使いたいということですね?
確かにWinMainにすると mainのときのようにそのような調整はしてくれませんので、
自前で組み立てる必要があります。
GetCommandLine というAPIで、コマンドラインの入力を丸々取れます。
Windows9xを考慮する必要がなく、Unicodeで扱っていいのなら
CommandLineToArgvW APIでコマンドライン入力を argv[][] 形式に変換してくれます。
最悪自分でやることになりますが、以下のページが参考になると思います。
コマンドラインの分割
http://techtips.belution.com/ja/vc/0084/
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』は自作関数でした。
・以上。修正と補足でした。
ご回答ありがとうございました。
今回はXPを対象としたソフトを作っているので、
CommandLineToArgvW を使って該当部分を作ることにしました。
いただいたソースは勉強に参考させていただきます。
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/w …
No.1
- 回答日時:
Windows用のプログラムを作っているということでよろしいですか?
その場合、プログラムの開始は main()になっていますか?
それとも WinMain() ですか?
前者だとコンソールがどうしても出てしまいますので、後者の
エントリを使うようにしないといけません。
>iostream.h
iostream.h は古いスタイルのものですので、できればより新しい
iostream を使ったほうがよろしいかと思います。もちろん
古いものを使う理由があるのなら無理強いはしませんが。
この回答への補足
>Windows用のプログラムを作っているということでよろしいですか?
そうです。Windows用のプログラムです。
>その場合、プログラムの開始は main()になっていますか?
>それとも WinMain() ですか?
main()になっています。
iostreamについてはそのようにしようと思います。
やってみて気づいたんですが、このプログラムは呼び出された時の引数を使いたいので、Winmainにはできないのでは?と思いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
あるあるbotに投稿したけど採用されなかったあるある募集
あるあるbotに投稿したけど採用されなかったあるあるをこちらに投稿してください
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
実行時のコマンドプロンプトを非表示 Visual C++
C言語・C++・C#
-
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
VC++から引数付きexeファイルの実行
C言語・C++・C#
-
-
4
DOS窓の非表示
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
whileとifを使い偶数を出すには
-
再起呼び出しの回数をカウント...
-
OpenCVによる4値化について
-
OpenGLの惑星プログラム
-
2の補数を計算するプログラム
-
円周にアンチエイリアスをかける
-
分数の足し算をさせるプログラ...
-
組織的ディザ法のプログラムが...
-
当たり判定の処理がわかりません。
-
カードシャッフルのブログラム...
-
intとlongは同じ?
-
3のつく数と3の倍数を表示 C言語
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
-
std::set<int> で、ある値が何...
-
「Aに対するBの割合」と「Aに対...
-
#define _CRT_SECURE_NO_WARNIN...
-
【gcc・cygwin】multiple defin...
-
ある商品のロス率を5%見込み、...
-
Enterキーを押されたら次の処理...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2の補数を計算するプログラム
-
intとlongは同じ?
-
C言語で簡単なパックマンゲーム...
-
迷路を脱出する経路探索プログ...
-
関数とビット列
-
3のつく数と3の倍数を表示 C言語
-
再起呼び出しの回数をカウント...
-
OpenCVによる4値化について
-
C++で表を作成したいのです ...
-
コマンドプロンプトのウィンド...
-
再帰処理をループ処理に変換
-
画像の拡大・縮小
-
プログラミングに関して
-
【C#】SQL文の中に変数を埋め込...
-
分数の足し算をさせるプログラ...
-
argvのNULLチェック
-
C言語で%を使わない余りの出し方
-
whileとifを使い偶数を出すには
-
ヌメロンのプログラム
-
条件が多い場合
おすすめ情報