c++でソフトを作っています。
まったく画面を持たないものを作りたいのですが、
実行すると、コマンドプロンプトのウィンドウが
一瞬だけ現れて消えます。
このウィンドウが出ないようにしたいです。
iostream.hをインクルードしているからでしょうか。
これはデバッグ用でインクルードしていたのですが
最後にコメントアウトしたら、解決できない構文エラーが
出てきて困ってしまいました。
そのためインクルードしたままです。
あまり経験がないので、トンチンカンな質問になって
いるかもしれませんが、これで分かる方いたらお願いします。
No.1
- 回答日時:
Windows用のプログラムを作っているということでよろしいですか?
その場合、プログラムの開始は main()になっていますか?
それとも WinMain() ですか?
前者だとコンソールがどうしても出てしまいますので、後者の
エントリを使うようにしないといけません。
>iostream.h
iostream.h は古いスタイルのものですので、できればより新しい
iostream を使ったほうがよろしいかと思います。もちろん
古いものを使う理由があるのなら無理強いはしませんが。
この回答への補足
>Windows用のプログラムを作っているということでよろしいですか?
そうです。Windows用のプログラムです。
>その場合、プログラムの開始は main()になっていますか?
>それとも WinMain() ですか?
main()になっています。
iostreamについてはそのようにしようと思います。
やってみて気づいたんですが、このプログラムは呼び出された時の引数を使いたいので、Winmainにはできないのでは?と思いました。
No.2ベストアンサー
- 回答日時:
#1です。
> やってみて気づいたんですが、このプログラムは呼び出された時の引数を使いたいので、Winmainにはできないのでは?と思いました。
argv[1] とかを使いたいということですね?
確かにWinMainにすると mainのときのようにそのような調整はしてくれませんので、
自前で組み立てる必要があります。
GetCommandLine というAPIで、コマンドラインの入力を丸々取れます。
Windows9xを考慮する必要がなく、Unicodeで扱っていいのなら
CommandLineToArgvW APIでコマンドライン入力を argv[][] 形式に変換してくれます。
最悪自分でやることになりますが、以下のページが参考になると思います。
コマンドラインの分割
http://techtips.belution.com/ja/vc/0084/
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.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 を使って該当部分を作ることにしました。
いただいたソースは勉強に参考させていただきます。
お探しの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#
-
コンソールアプリケーションのコマンドプロンプト画面を非表示
Visual Basic(VBA)
-
charからLPTSTRへの変換方法
C言語・C++・C#
-
-
4
DOS窓の非表示
C言語・C++・C#
-
5
VB.NETのコンソールアプリケーションについて
Visual Basic(VBA)
-
6
C#において、同じインスタンスを何度もnewしてよいでしょうか。
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2の補数を計算するプログラム
-
intとlongは同じ?
-
再起呼び出しの回数をカウント...
-
C言語で%を使わない余りの出し方
-
迷路を脱出する経路探索プログ...
-
画像の拡大・縮小
-
分数の足し算をさせるプログラ...
-
C言語で簡単なパックマンゲーム...
-
C++で表を作成したいのです ...
-
条件が多い場合
-
複数の共有メモリの作成
-
ヒストグラム均等化処理プログラム
-
3のつく数と3の倍数を表示 C言語
-
argvのNULLチェック
-
乱数で交互に偶数、奇数が、、、。
-
プログラミングに関して
-
OpenCVによる4値化について
-
再帰処理をループ処理に変換
-
16bitで乱数を生成する方法
-
C++ Debug Errorについて教えて
おすすめ情報