おせわになります。
別PGから、VC++(MFC)アプリを引数付きで起動
したいのですが、引数の渡し方が分かりません。
どなたかご教授ねがいます。
ShellExecute(ShellExecuteEx)やCreateProcessでも引数を指定できますが、
どのようにわからないのでしょうか?
(引数は文字列として渡す)
実行時にAPI等に渡すコマンドラインに,引数を追加するだけだと思いますが……。
早速、回答ありがとうございます。
呼び出し側は、CreateProcess関数で呼び出すのですね。
受け取り側は、どのようにすればよいでしょうか?
>受け取り側は、どのようにすればよいでしょうか?
MFCのアプリといわれていますが、コンソールアプリとWindowsアプリでは少し違います。
・MFC Console Application
・MFC Win32 Application - SDI
・MFC Win32 Application - MDI
・MFC Win32 Application - ダイアログ
のどれでしょうか?
ちなみに
>呼び出し側は、CreateProcess関数で呼び出すのですね。
は一番面倒なヤツです。私ならよっぽどのことでない限りSCreateProcessを使いませんけど。
(ShellExecuteで十分)
回答ありがとうございます。
>・MFC Console Application
>・MFC Win32 Application - SDI
>・MFC Win32 Application - MDI
>・MFC Win32 Application - ダイアログ
>のどれでしょうか?
・MFC Win32 Application - SDI
です。
よろしくお願いします。
確認ですが、引数として何を渡したいのでしょうか?
(ファイルのパスならばデフォルトのままで動くような気がするけど)
回答ありがとうございます。
>確認ですが、引数として何を渡したいのでしょうか?
int型の値です。(フラグとして使用)
よろしくお願いします。
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);
}
訂正)
> // atoiやらstrtolやらでint型の値へ変換する
> this->m_flag = atoi(flag);
atoiではなく_ttoi, strtolではなく_tcstolでした。
this->m_flag = _ttoi(flag);
回答ありがとうございます。
掲載していただいたコードで、
引数を渡せることを確認できました。
ただ、当方の知識が不足しているため、
理解ができていません。
例えば、引数を2つ、3つと増やしたい場合、
どのようにすればよいでしょうか?
※参考になるURL等でも構いません。
>例えば、引数を2つ、3つと増やしたい場合、
>どのようにすればよいでしょうか?
どっち側?もらう方?
でしたら、
>これらはコンソールアプリでのargv,argcと同様な扱いになります。
ということです。
コンソールアプリでの argv, argc の使い方がわかれば簡単です。
(argv, argcでGoogle検索するとたくさん解説しているサイトが出てきます。)
MFCのフレームワークを使うのであれば、
CCommandLineInfoクラスから自分用のクラスを派生させて
そのクラスに解析をさせます。
利用側はCCommandLineInfoの派生クラスからフラグ等の値を取得して
それを元に処理します。
引数を増やす場合は自分用のCCommandLineInfoクラスに処理を追加します。
この方法あんまり使われていないみたいですけどね。
ツイート | ![]() |