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

A 回答 (4件)

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2001/07/06 23:42

CWinAppのメンバ「m_lpCmdLine」を参照すればよいです。


InitInstance内で呼び出せばいいよん。

この回答への補足

ありがとうございます。
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パラメータの先頭に、ダミーのスペースを入れるのがいいのかなあ。。。

補足日時:2001/07/06 11:44
    • good
    • 0

No 1 の方が紹介れているリンク先の方法とは別に、次のような仕組みもあります。



__argc や __argv といったマクロです。
このマクロは、STDLIB.H に定義されています。

__argc は argc と同じ、
__argv も argv と同じ役割です。

マクロの中身は普通の C 関数アクセスに置き換えられているだけなので、InitInstance だろうが CWinApp 派生クラスのコンストラクタだろうが、どこからでも使えます。

argc argv[] に慣れているのでしたら、利用が簡単だと思います。

ただ、実際には関数呼び出しになるので、左辺値にできません。
代入は必要ないと思いますが…。
また、微妙に呼び出しコストもあるでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/07/06 23:38

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



参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=83519
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/07/06 23:36

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q引数で argc argvが使用されていないのですが!?

以下のプログラムで
 int main(int argc, char* argv[ ] )
 で質問ですが! 引数の argc argvを定義して
 同プログラム内で他に使われていないのですが!
 なぜですか お叱りを覚悟でご質問いたしました。

 よろしくお願いいたします。 

#include <stdio.h>
#include <string.h>

/*構造体に定義*/
struct TestKekka
{
char shimei[80]; /*氏名*/
int kokugo;
int sugaku;
int eigo;
};

int main(int argc, char* argv[ ] )
{
int heikin;

struct TestKekka sato; /* 佐藤君 */
struct TestKekka tanaka; /* 田中君 */
struct TestKekka suzuki; /* 鈴木君 */

/* 佐藤君んのデータ */
strcpy (sato.shimei, "佐藤一郎");
sato.kokugo = 90;
sato.sugaku = 80;
sato.eigo = 75;

/* 田中君のデータ */
strcpy (tanaka.shimei, "田中次郎");
tanaka.kokugo = 80;
tanaka.sugaku = 70;
tanaka.eigo = 60;

/* 鈴木君データ */
strcpy(suzuki.shimei,"鈴木三郎");
suzuki.kokugo = 70;
suzuki.sugaku = 50;
suzuki.eigo = 100;

/* 学生ごとに3科目の平均点を表示する */
heikin = (sato.kokugo + sato.sugaku + sato.eigo) / 3;
printf("%sの平均点 : %d\n", sato.shimei, heikin);

heikin = (tanaka.kokugo + tanaka.sugaku + tanaka.eigo) / 3;
printf ("%sの平均点 : %d\n", tanaka.shimei, heikin);

heikin = (suzuki.kokugo + suzuki.sugaku + suzuki.eigo) / 3;
printf("%s平均点数 : %d\n", suzuki.shimei, heikin);

return 0;
}

以下のプログラムで
 int main(int argc, char* argv[ ] )
 で質問ですが! 引数の argc argvを定義して
 同プログラム内で他に使われていないのですが!
 なぜですか お叱りを覚悟でご質問いたしました。

 よろしくお願いいたします。 

#include <stdio.h>
#include <string.h>

/*構造体に定義*/
struct TestKekka
{
char shimei[80]; /*氏名*/
int kokugo;
int sugaku;
int eigo;
};

int main(int argc, char* argv[ ] )
{
int heikin;

struct TestKekka sato; /*...続きを読む

Aベストアンサー

既に#2の方が述べていますが
int main(int argc, char* argv[ ] )の書き方は
main関数特有の決まりごとだと覚えてください。
そして、argc,argvは使っても良いし、使わなくても良いのです。
つまり、定義した変数は、必ず使わないといけないという規則はC言語にはないのです。
(ほかの言語も同様ですが・・・)
普通、変数は、使用するために定義しますが、それを定義だけして使用しなくても良いのです。
これは、例えば、あなたが提示されたプログラムのint heikin;の次の行に、
int i;
と追加し、この変数iを使用しなくても、かまわないということです。
使用しなくても良いという意味は、使用しなくてもエラーには、ならないという意味であり、
それが良いプログラムであるということではありません。
int i;の定義を他の人が見たら、使わないのに何故定義をしているんだという、つっこみが入るかもしれませんで、使わない変数は定義しないほうが、一般的には良いでしょう。

Qmain関数のとる引数(argc , *argv[])の意味について

 今日は、Cの初心者です宜しくお願いします。
 
 main関数(main(int argc , *argv[]))のとる引数、argcのCと*argv[]のVはどのような意味の略なのでしょうか、
なにか意味があるようなきがするのですが。
 宜しくお願いします。

Aベストアンサー

文字列の個数(argument count)

"ARGument Vector" の略という説と、"ARGument Value" の略という説がある。

Qプログラミング(argcとargv)

入力された数の合計とその計算式を表示するプログラムをつくっています。惜しい(?)ところまでいったのですがその先がなかなか進みません。以下のプログラムのどこを修正したらよいでしょうか?教えてください。
#include <stdio.h>
#include <stdlib.h>

#define nMAX 10

int main(int argc, char **argv){
int sum = 0;

if(argc < 2){
printf("Too few option!\n");
return 1;
}

int i, n;
for(i = 1; i < argc; i++){
n = atoi(argv[i]);
sum = sum + n;
}
printf("%d\n", sum);

}

Aベストアンサー

合計は出ているので、計算式の表示で困っているということでしょうか。
暇なので計算式表示部分を書いてみました。
printf("%d\n", sum); の部分と置き換えます。
参考にしてください。

for (i=1; i<argc; i++) {
n = atoi(argv[i]);
if (i == 1) printf("%d", n);
else printf("%+d", n);
}
printf("=%d\n", sum);

実行結果はこんな感じ。

$ ./sum -1 2 -3 4 0
-1+2-3+4+0=2

Qint main(int argc, char* argv[]) についての質問

こんにちは.つね日ごろ思っている質問させてください.
Cの参考書には,
(1)
void main(void)
{
}

(2)
int main(int argc, char* argv[])
{
return 0;
}
の2つのパターンが記載されていますが,
どういう違いがあるのでしょうか?

(1)の場合main関数は,型を持たず,引数も持たない.
※Turbo Cなどのコンパイラーでは,
return文がないと警告出ます.
(2)の場合は,int 型をかえし,引数はint型 変数と char型ポインタ配列(?)
を指定している.
といったくらいしか分かりません.

(2)に関してもう少し述べれば,
コマンドラインからファイルを指定し,実行することが
できると勉強した記憶があるのですが,
理解があいまいです.

特に(2)の場合のmain関数の意味と,その使い方について
アドバイスお願い致します.

Aベストアンサー

> (1)
> void main(void)
  ...
> (2)
> int main(int argc, char* argv[])
  ...
> の2つのパターンが記載されていますが,どういう違いがあるのでしょうか?

(1) は、間違いです。少なくとも ANSI-C の規格に合致していません。

main() は、特別な関数で、ANSI-C の規格では以下の三通りのうちのどれか
でなくてはいけない、と定められています。

int main(void)
int main(int argc, char *argv[]);
int main(int argc, char *argv[], char *envp[]);

因みに三番目の形式では、三つ目の引数には環境変数が入ります。
以下のようなコードで確認ができます。

int main(int argc, char *argv[], char *envp[])
{
  int i = 0;
  while (envp[i]) {
    printf("envp[%d] = '%s'\n", i, envp[i]);
    ++i;
  }
  return 0;
}


> ※Turbo Cなどのコンパイラーでは,return文がないと警告出ます

Turbo C は、規格に厳格なのでしょう。返り値が void なのはおかしいので、
int だとみなすよ、という警告も出てるはず。で、int が帰り値だとみなし
ているので return が無いと、返り値が不定になるよ、と警告を出している
のでしょう。

> (1)
> void main(void)
  ...
> (2)
> int main(int argc, char* argv[])
  ...
> の2つのパターンが記載されていますが,どういう違いがあるのでしょうか?

(1) は、間違いです。少なくとも ANSI-C の規格に合致していません。

main() は、特別な関数で、ANSI-C の規格では以下の三通りのうちのどれか
でなくてはいけない、と定められています。

int main(void)
int main(int argc, char *argv[]);
int main(int argc, char *argv[], char *envp[]);

因みに三番目の形式では、三...続きを読む

Qmain(int argc,char **argv[])の意味を教えて下さい

 今晩は、Cの初心者です宜しくお願いします。
 main関数の引数で、int main(int argc,char **argv[])とint main(int argc,char *argv[])と書かれている場合がありますが、
「**argv」と「*argv」の意味の違いはどのようなもので、どのように使い分けるのでしょうか。
また、必ずポインタ型でとるという決まりでしょうか。
宜しくお願いします。

Aベストアンサー

これは質問者さん向けというより、半分他の回答者さんに向けたコメントですが、

おそらく質問者さんの本当の意図は、ポインタと配列の違いではなく、
main関数の引数宣言の仕方に2パターンあるが、これはどう使い分けるのか、
というところにあるのではないでしょうか。
私はそう考えて回答3を書きました。

ところが、質問者さんが**argv を **argv[]と書き間違えちゃったために、
質問を深読みしちゃって
C言語におけるポインタとは何か、というかなり難易度の高い議題で
回答がいっぱい集まっちゃったと。

で、ちょっとだけ質問者さんを弁護。

質問者さんは回答1のお礼欄に

> int main(int argc,char **argv) でした、すみません、どのような意味でしょうか。

と書かれています。

わたしが回答3を書こうとした時点で、すでにこのコメントがあったため、
私は回答3で関数の引数宣言における **argv と *argv[] の違いについて回答しています。

質問者さんは、こういう訂正は、こういうのはお礼ではなく補足コメントにすべきだったと思いますが、

回答された方々も、回答される前に、既に付けられた回答と、そこへの
質問者者さんのコメントなどをちゃんと読んでから回答していれば、
ここまでムダな回答が続くことが無かったんではないかと思います。

これは質問者さん向けというより、半分他の回答者さんに向けたコメントですが、

おそらく質問者さんの本当の意図は、ポインタと配列の違いではなく、
main関数の引数宣言の仕方に2パターンあるが、これはどう使い分けるのか、
というところにあるのではないでしょうか。
私はそう考えて回答3を書きました。

ところが、質問者さんが**argv を **argv[]と書き間違えちゃったために、
質問を深読みしちゃって
C言語におけるポインタとは何か、というかなり難易度の高い議題で
回答がいっぱい集まっちゃっ...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報