別PGからVC++(MFC)アプリを引数付きで起動


かむかむ  2006-11-06 14:54:50  No: 63493  IP: 192.*.*.*

おせわになります。

別PGから、VC++(MFC)アプリを引数付きで起動
したいのですが、引数の渡し方が分かりません。

どなたかご教授ねがいます。

編集 削除
Blue  2006-11-06 15:05:06  No: 63494  IP: 192.*.*.*

ShellExecute(ShellExecuteEx)やCreateProcessでも引数を指定できますが、
どのようにわからないのでしょうか?
(引数は文字列として渡す)

編集 削除
YuO  2006-11-06 15:05:41  No: 63495  IP: 192.*.*.*

実行時にAPI等に渡すコマンドラインに,引数を追加するだけだと思いますが……。

編集 削除
かむかむ  2006-11-06 15:14:11  No: 63496  IP: 192.*.*.*

早速、回答ありがとうございます。

呼び出し側は、CreateProcess関数で呼び出すのですね。
受け取り側は、どのようにすればよいでしょうか?

編集 削除
Blue  2006-11-06 15:23:56  No: 63497  IP: 192.*.*.*

>受け取り側は、どのようにすればよいでしょうか?
MFCのアプリといわれていますが、コンソールアプリとWindowsアプリでは少し違います。

・MFC Console Application
・MFC Win32 Application - SDI
・MFC Win32 Application - MDI
・MFC Win32 Application - ダイアログ

のどれでしょうか?

ちなみに
>呼び出し側は、CreateProcess関数で呼び出すのですね。
は一番面倒なヤツです。私ならよっぽどのことでない限りSCreateProcessを使いませんけど。
(ShellExecuteで十分)

編集 削除
かむかむ  2006-11-06 15:49:38  No: 63498  IP: 192.*.*.*

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

>・MFC Console Application
>・MFC Win32 Application - SDI
>・MFC Win32 Application - MDI
>・MFC Win32 Application - ダイアログ
>のどれでしょうか?

・MFC Win32 Application - SDI
です。

よろしくお願いします。

編集 削除
Blue  2006-11-06 16:06:13  No: 63499  IP: 192.*.*.*

確認ですが、引数として何を渡したいのでしょうか?
(ファイルのパスならばデフォルトのままで動くような気がするけど)

編集 削除
かむかむ  2006-11-06 16:37:33  No: 63500  IP: 192.*.*.*

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

>確認ですが、引数として何を渡したいのでしょうか?

int型の値です。(フラグとして使用)

よろしくお願いします。

編集 削除
Blue  2006-11-06 16:44:27  No: 63501  IP: 192.*.*.*

SDIのデフォルトだと、ファイル名として解釈されてしまうので、

BOOL CXXXXApp::InitInstance()

メソッドの

// DDE、file open など標準のシェル コマンドのコマンドラインを解析します。
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);

// コマンドラインでディスパッチ コマンドを指定します。
if (!ProcessShellCommand(cmdInfo))
    return FALSE;

を代える必要があります。
今回の場合は、ParseCommandLine(cmdInfo);をコメントアウトすればいいでしょう。

で、どうやって受けるかというと、CXXXAppクラスのm_lpCmdLineを使ってもいいですが、
分割するのが面倒なので、グローバル変数の__argv,__argcを使います。
これらはコンソールアプリでのargv,argcと同様な扱いになります。

よって、

// DDE、file open など標準のシェル コマンドのコマンドラインを解析します。
CCommandLineInfo cmdInfo;
//ParseCommandLine(cmdInfo);

// コマンドラインでディスパッチ コマンドを指定します。
if (!ProcessShellCommand(cmdInfo))
    return FALSE;

// フラグがあれば取得する
if (__argc >= 2)
{
    LPCTSTR flag = __argv[ 1 ];
    // atoiやらstrtolやらでint型の値へ変換する
    // 一例(m_flagはCXXXAppクラスのメンバ変数とする)
    this->m_flag = atoi(flag);
}

編集 削除
Blue  2006-11-06 16:46:39  No: 63502  IP: 192.*.*.*

訂正)
>    // atoiやらstrtolやらでint型の値へ変換する
>    this->m_flag = atoi(flag);
atoiではなく_ttoi, strtolではなく_tcstolでした。

this->m_flag = _ttoi(flag);

編集 削除
かむかむ  2006-11-06 17:30:49  No: 63503  IP: 192.*.*.*

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

掲載していただいたコードで、
引数を渡せることを確認できました。

ただ、当方の知識が不足しているため、
理解ができていません。

例えば、引数を2つ、3つと増やしたい場合、
どのようにすればよいでしょうか?
※参考になるURL等でも構いません。

編集 削除
Blue  2006-11-06 17:34:08  No: 63504  IP: 192.*.*.*

>例えば、引数を2つ、3つと増やしたい場合、
>どのようにすればよいでしょうか?
どっち側?もらう方?

でしたら、
>これらはコンソールアプリでのargv,argcと同様な扱いになります。
ということです。
コンソールアプリでの argv, argc の使い方がわかれば簡単です。
(argv, argcでGoogle検索するとたくさん解説しているサイトが出てきます。)

編集 削除
PATIO  2006-11-07 14:03:10  No: 63505  IP: 192.*.*.*

MFCのフレームワークを使うのであれば、
CCommandLineInfoクラスから自分用のクラスを派生させて
そのクラスに解析をさせます。
利用側はCCommandLineInfoの派生クラスからフラグ等の値を取得して
それを元に処理します。
引数を増やす場合は自分用のCCommandLineInfoクラスに処理を追加します。

この方法あんまり使われていないみたいですけどね。

編集 削除