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


かむかむ  2006-11-06 23:54:50  No: 63493

おせわになります。

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

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


Blue  2006-11-07 00:05:06  No: 63494

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


YuO  2006-11-07 00:05:41  No: 63495

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


かむかむ  2006-11-07 00:14:11  No: 63496

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

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


Blue  2006-11-07 00:23:56  No: 63497

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

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

のどれでしょうか?

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


かむかむ  2006-11-07 00:49:38  No: 63498

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

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

・MFC Win32 Application - SDI
です。

よろしくお願いします。


Blue  2006-11-07 01:06:13  No: 63499

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


かむかむ  2006-11-07 01:37:33  No: 63500

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

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

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

よろしくお願いします。


Blue  2006-11-07 01:44:27  No: 63501

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-07 01:46:39  No: 63502

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

this->m_flag = _ttoi(flag);


かむかむ  2006-11-07 02:30:49  No: 63503

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

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

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

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


Blue  2006-11-07 02:34:08  No: 63504

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

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


PATIO  2006-11-07 23:03:10  No: 63505

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加