
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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
intとlongは同じ?
-
条件が多い場合
-
再帰処理をループ処理に変換
-
再起呼び出しの回数をカウント...
-
rand()の乱数は何故良くないの?
-
迷路を脱出する経路探索プログ...
-
プログラミングに関して
-
最早開始時間と最遅完了時刻を...
-
20'(角度)の計算がわかりま...
-
信頼区間の1.96や1.65ってどこ...
-
Aの値からBの値を除するとは??
-
数字以外が入力されたらエラー...
-
値差の%計算方法について
-
「Aに対するBの割合」と「Aに対...
-
#defineが使用するメモリ領域に...
-
cout関数を使っているのですが...
-
2÷3などの余りについて
-
構造体の勉強中です 合計点の高...
-
main.c:7:43: warning: implici...
-
C言語 エラーの原因がわからな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で簡単なパックマンゲーム...
-
2の補数を計算するプログラム
-
c言語プログラミングについて f...
-
再起呼び出しの回数をカウント...
-
intとlongは同じ?
-
openCVの画像処理について
-
C言語
-
【C#】SQL文の中に変数を埋め込...
-
C言語プログラミング 漸化式に...
-
カードシャッフルのブログラム...
-
C++ Debug Errorについて教えて
-
デバッグビルドとリリースビル...
-
迷路を脱出する経路探索プログ...
-
C++デバックエラーについて詳し...
-
C++ bmp 透過処理
-
複数の共有メモリの作成
-
C言語で%を使わない余りの出し方
-
C言語
-
2次関数プログラムを描写する...
-
16bitで乱数を生成する方法
おすすめ情報