アプリ版:「スタンプのみでお礼する」機能のリリースについて

c++でソフトを作っています。

まったく画面を持たないものを作りたいのですが、
実行すると、コマンドプロンプトのウィンドウが
一瞬だけ現れて消えます。
このウィンドウが出ないようにしたいです。

iostream.hをインクルードしているからでしょうか。
これはデバッグ用でインクルードしていたのですが
最後にコメントアウトしたら、解決できない構文エラーが
出てきて困ってしまいました。
そのためインクルードしたままです。


あまり経験がないので、トンチンカンな質問になって
いるかもしれませんが、これで分かる方いたらお願いします。

A 回答 (4件)

#1です。



> やってみて気づいたんですが、このプログラムは呼び出された時の引数を使いたいので、Winmainにはできないのでは?と思いました。

argv[1] とかを使いたいということですね?
確かにWinMainにすると mainのときのようにそのような調整はしてくれませんので、
自前で組み立てる必要があります。

GetCommandLine というAPIで、コマンドラインの入力を丸々取れます。
Windows9xを考慮する必要がなく、Unicodeで扱っていいのなら
CommandLineToArgvW APIでコマンドライン入力を argv[][] 形式に変換してくれます。

最悪自分でやることになりますが、以下のページが参考になると思います。

コマンドラインの分割
http://techtips.belution.com/ja/vc/0084/
    • good
    • 0
この回答へのお礼

難しそうですが、参考URLを見てやってみます。
ご回答ありがとうございました。

お礼日時:2007/04/28 14:13

★追記。


・ちょっと使い方の記述を間違いましたので修正します。
 下の 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』は自作関数でした。
・以上。修正と補足でした。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

今回はXPを対象としたソフトを作っているので、
CommandLineToArgvW を使って該当部分を作ることにしました。

いただいたソースは勉強に参考させていただきます。

お礼日時:2007/05/05 10:56

★まったく画面を持たないものを作りたいのならば 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 …
    • good
    • 0

Windows用のプログラムを作っているということでよろしいですか?



その場合、プログラムの開始は main()になっていますか?
それとも WinMain() ですか?
前者だとコンソールがどうしても出てしまいますので、後者の
エントリを使うようにしないといけません。

>iostream.h

iostream.h は古いスタイルのものですので、できればより新しい
iostream を使ったほうがよろしいかと思います。もちろん
古いものを使う理由があるのなら無理強いはしませんが。

この回答への補足

>Windows用のプログラムを作っているということでよろしいですか?
そうです。Windows用のプログラムです。

>その場合、プログラムの開始は main()になっていますか?
>それとも WinMain() ですか?
main()になっています。

iostreamについてはそのようにしようと思います。

やってみて気づいたんですが、このプログラムは呼び出された時の引数を使いたいので、Winmainにはできないのでは?と思いました。

補足日時:2007/04/03 23:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています