• ベストアンサー

EXEへの引数渡しについて

VC++でプログラミングしています。 MFCを使ってダイアログベースのEXEを造っています。 このEXEは別のプロセスから CreateProcess関数で起動され、 引数も渡されます。 で、質問です。 ダイアログのEXEでは、渡された引数を解析するために、何処で、 どのようにしたらよいのでしょうか? C言語での (argc, argv) のような仕組みがあるのでしょうか? 識者の方、ご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • osaosa42
  • ベストアンサー率60% (20/33)
回答No.4

#第2パラメータの先頭に、ダミーのスペースを入れるのがよいと思います。

nabezo-
質問者

お礼

回答ありがとうございました。 大変参考になりました。 機会があれば、またアドバイスお願いします。

その他の回答 (3)

  • osaosa42
  • ベストアンサー率60% (20/33)
回答No.3

CWinAppのメンバ「m_lpCmdLine」を参照すればよいです。 InitInstance内で呼び出せばいいよん。

nabezo-
質問者

補足

ありがとうございます。 osaosa42 さんには、度々アドバイスして頂き、感謝です。 m_lpCmdLine を参照して確認したのですが、不明な点があります。 呼び出し側のプロセスが CreateProcess() の第2パラメータで 文字列を渡したのですが、m_lpCmdLine はNULLとなっています。 いろいろ試しましたが、文字列の中の最初のスペース以降の部分が m_lpCmdLine に入っていました。 #こういう仕様??? 以下がテスト結果です。 GetCommandLine() もやってみました。 CreateProcess()で起動するプロセスは "c:\temp\test.exe" とします。 <テスト1> 第2パラメータ:NULL m_lpCmdLine:NULL GetCommandLine:"c:\temp\test.exe" <テスト2> 第2パラメータ:"123456" m_lpCmdLine:NULL GetCommandLine:"123456" <テスト3> 第2パラメータ:"12 34 56" m_lpCmdLine:"34 56" GetCommandLine:"12 34 56" パラメータの有無をチェック/解析したいのですが、純粋にパラメータを 取得することはできないのでしょうか? 第2パラメータがNULLの時、GetCommandLine() が NULLになってくれれば よかったのですが。。。 #第2パラメータの先頭に、ダミーのスペースを入れるのがいいのかなあ。。。

回答No.2

No 1 の方が紹介れているリンク先の方法とは別に、次のような仕組みもあります。 __argc や __argv といったマクロです。 このマクロは、STDLIB.H に定義されています。 __argc は argc と同じ、 __argv も argv と同じ役割です。 マクロの中身は普通の C 関数アクセスに置き換えられているだけなので、InitInstance だろうが CWinApp 派生クラスのコンストラクタだろうが、どこからでも使えます。 argc argv[] に慣れているのでしたら、利用が簡単だと思います。 ただ、実際には関数呼び出しになるので、左辺値にできません。 代入は必要ないと思いますが…。 また、微妙に呼び出しコストもあるでしょう。

nabezo-
質問者

お礼

回答ありがとうございました。 大変参考になりました。 今回は m_lpCmdLine を使うことにしました。

  • coolguys
  • ベストアンサー率18% (351/1917)
回答No.1

参考URLのようなことでしょうか?

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=83519
nabezo-
質問者

お礼

回答ありがとうございました。 大変参考になりました。

関連するQ&A

  • _TCHAR*での引数の読み込み

    VC++2010での、通常の #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { return 0; } のウィザードを使って、arvg[1]やargv[2]に引数を与えて、本体内で通常のCで使う printf("%s\n", argv[1]); や fopen(argv[1], "r"); を使いたいのですが、引数の型が_TCHAR*になっているため文字がそのまま使えません。 int main(int argc, char *argv[]) で使えば問題なく使えるのですが、デフォルトのウィザードを使った時の使い方を知っておきたいのです。 御経験のある方、御教示お願い致します。

  • コマンドラインから引数を渡したいのですが・・・

    VC.NETで参考書に載っていた下のようなコードを書きました。 #include <iostream> #include <cstdlib> using namespace std; int main (int argc, char *argv[]) { int sum; if (argc != 3) { cout << "引数の個数が違います。"; return 1; } sum = atoi (argv[1]) + atoi (argv[2]); cout << "合計=" << sum << '\n'; return 0; } しかしながら、引数の個数が違います。としか出力されません。どうすればよろしいでしょうか?

  • ダイアログ、ボタンについて

    VC++でプログラミングしています。 MFC AppWizard(exe) でダイアログベースで造っています。 以下の方法を教えてください。 ・EXE起動時、ダイアログのサイズを変更したい。 起動時に画面サイズをチェックして、画面いっぱいの大きさにしたいため。 ・EXE起動後、ボタンに表示している文字列を変更したい。 識者の方、ご教授願います。

  • VC++から引数付きexeファイルの実行

    タイトルの通り、VC++から外部ファイルを実行したいのですがどのような関数を使えばよいのでしょうか? exeファイルを実行中は親プロセスであるVCのプログラムの方を止めておきたいのです。 出来ればexeファイルは引数付きで実行したいと思いますので、よろしくお願いします。 開発環境はVisualStudio2005です。

  • main の引数には const 付けた方が

    C言語での質問です。 引数を取るような main 関数は int main( int argc, char *argv[]){~} とされていますが、argvの指す文字列を変更する、というのはいくら何でもまずいので、 int main( int argc, const char *argv[]){~} あるいは int main( int argc, const char const * const * argv){~} の方がいいのではないでしょうか? 何故、constを付けない形が出回っているのでしょうか?

  • VB6で、C言語の(argv,argc)みたいな、コマンドライン引数を実現する方法は?

    Microsoft-VisualBasic6でプログラミングしてます。 外部から(不特定の)ファイル名を指定して、 VBモジュールを起動して処理をしたいのですが、 C言語でいう、(argv,argc)みたいなものを使って(いわゆるコマンドライン引数)、 VBプログラミングする方法を教えて下さい。 <実行例>  ・(モジュール名) (任意のファイル名)   vbmodule.exe sample-a.cvs

  • コマンドライン引数 *argv[]はなぜポインタ?

    C言語初心者です。 コマンドライン引数、 int main(int argc, char *argv[]) というのを最近勉強しましたが、引数2番目がポインタになっている理由について、 どなたか教えて下さい。 そういう仕様なんだから、それに従いましょう、ということでしょうか? int main(int argc, char argv[]) では、ダメなのでしょうか? このポインタでの引数渡しについて、 なんらかの納得のいく考え方をご存知の方がいらしたら、教えて下さい。 宜しくお願い致します。

  • ダイアログベースのEXEでESCキーを押しても終了しないようにする方法

    VC++ 6.0 でダイアログベースのEXEを造っています。 ESCキーを押すとEXEは終了しますが、ESCキーを無視して 終了しないようにするにはどうしたらよいでしょうか? 識者の方、ご教授願います。

  • 子プロセス(EXEファイル)が要求する文字列(パスワードなど)へ代入する方法

    VC++にて、親プロセスから子プロセス(EXEファイル)をCreateProcessで起動し、 子プロセスが要求するダイアログ(文字とOKボタンのクリック)への入力を親プロ セスから制御する方法を教えてください。

  • C言語でコマンドラインの引数について。

    コマンドラインで引数をわたす基本的なプログラムは main(int argc,char *argv[]){....] ですよね。 今回実行時に、 >実行ファイル名 123 + 233 といれたら、123+233を計算してくれるプログラムを作ろうとしています。 その場合、main(int argc,int *argv[]){} としたら、argv[1]に123が入って、argv[2]に+が入って、argv[3]に233が、入るというわけではないんでしょうか? とりあえず、確認で #include<stdio.h> main(int argc,int *argv[]) { printf("%d\n%d\n",argv[1],argv[3]); } としてみたんですが、実行結果は、とても長い数字がでてきてきました。 なにがいけないのか教えてください。 お願いします。 あとWindows MEでVC++6を使ってます。

専門家に質問してみよう