![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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で質問しましょう!
似たような質問が見つかりました
- その他(OS) Windowsで大量の画像サイズを半自動で変更する方法 6 2023/02/17 08:45
- Visual Basic(VBA) 起動中のアプリ、ソフトの取得 3 2022/12/28 11:13
- Android(アンドロイド) スマホの広告に困っています 5 2023/06/19 09:02
- Windows 10 windows11 起動エラー 0xc0000225 1 2022/05/14 11:58
- その他(パソコン・周辺機器) デバイスのペアリングのウィンドウサイズがおかしい 1 2023/01/18 18:48
- HTML・CSS インクルードした要素がヘッダーにかぶってしまう 3 2022/09/13 17:35
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- Chrome(クローム) googleアカウントのアイコンをローマ字または漢字で表示させたい 2 2023/05/06 22:25
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
実行時のコマンドプロンプトを非表示 Visual C++
C言語・C++・C#
-
DOS窓の非表示
C言語・C++・C#
-
charからLPTSTRへの変換方法
C言語・C++・C#
-
-
4
system関数がうまくいかない
C言語・C++・C#
-
5
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
6
コンソールアプリケーションのコマンドプロンプト画面を非表示
Visual Basic(VBA)
-
7
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
8
コマンド(例えばls)の出力結果を文字列で取得するプログラムの作成方法
C言語・C++・C#
-
9
複数の変数を宣言する時、同時に初期化?できないでしょうか?
Java
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
16bppBMPの仕様について
-
2の補数を計算するプログラム
-
C言語プログラミング 漸化式に...
-
併合処理ソートについて
-
画像の拡大・縮小
-
argvのNULLチェック
-
C言語の問題
-
returnの使い方
-
c言語のリダイレクトによる円...
-
吸湿性のあるものを天秤で秤量...
-
2÷3などの余りについて
-
プログラミング初心者です。 Py...
-
printf で二進表示を行いたい。
-
マイナスからプラスへ転じた時...
-
【C言語教えてください】sin波...
-
O(n log n)について2
-
エクセルのクイックアクセスツ...
-
「Aに対するBの割合」と「Aに対...
-
プログラムで関数は使わない方...
-
コンパイルエラーについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報