MFCでのコマンドライン引数

[戻る]
PECO 2002/04/17(水) 10:55:01
 VC++6.0(MFC)でプログラムを作成しています。
以下の様にCreateProcess関数でアプリを起動させてます。

ret=CreateProcess(NULL,
        “C:\\BIN\\TEST.EXE AAA”,
        NULL,
        NULL,
        FALSE,
        CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS,
        NULL,
        NULL,
        &startInfo,
        &procInfo);

 その際、起動されたアプリでコマンドライン引数(2番目の引数で指定された“AAA”の値)
を受け取りたいのですが、起動されたアプリ側の、Initinstance関数中で
ProcessShellCommand関数が呼ばれると「AAAが見つかりませんでした」とメッセージが表示
されてしまいます。
ProcessShellCommand関数を無効にすると、ShowWindow(SW_SHOW)の処理でエラーが発生し
てしまいます。
ParseCommandLine関数を無効にすると、処理はとおる様になるのですが
ParseCommandLine関数を無効にすることで支障はないのでしょうか?

いもちぃ 2002/04/17(水) 11:04:54
それ以前に、引数の数が一致してませんが・・。

いもちぃ 2002/04/17(水) 11:13:57
>それ以前に、引数の数が一致してませんが・・。

すみません、見落としです。聞かなかったことにしてください。

第1パラメータにEXEのファイル、第2パラメータに"AAA"と
入れてもダメですか?
あと、第1パラメータを“C:\\BIN\\TEST.EXE AAA”として、
第2パラメータをNULLにする手もあります。

sugar 2002/04/17(水) 11:21:06
もしかして、このTEST.EXEって、SDI/MDIアプリケーションですね?
引数"AAA"を伴うことで、これを「初期オープンするファイル名」と勘違いしていますね、
TEST.EXEは。
(厳密には、TEST.EXEで実行されるParseCommandLine。)

MFCが提供する引数解析機能を利用するなら、CCmdLineInfoクラスに手を加える必要がありま
す。
独自に引数解析を実装するなら、ParseCommandLine()を外しても問題ないと思います。

PECO 2002/04/17(水) 13:19:49
[[解決]]
いもちぃさん、sugarさん、お返事ありがとうございます。

>第1パラメータにEXEのファイル、第2パラメータに"AAA"と
>入れてもダメですか?
としますと、AAAを引数として受け取ってはもらえませんでした。

>あと、第1パラメータを“C:\\BIN\\TEST.EXE AAA”として、
>>第2パラメータをNULLにする手もあります。
ではアプリが起動かかりませんでした。

>もしかして、このTEST.EXEって、SDI/MDIアプリケーションですね?
そうです、SDIアプリケーションを作成しています。

>引数"AAA"を伴うことで、これを「初期オープンするファイル名」と勘違いしていますね、
ファイルが見つかりませんといったメッセージが返ってきます。

>独自に引数解析を実装するなら、ParseCommandLine()を外しても問題ないと思います。
ありがとうございます。この方法で作成してみたいと思います。

wood 2002/04/17(水) 22:50:17
もうお済のようですけど下記のようなことやってます

C:\\BIN\\TEST.EXE /AAA
のように実行されます



起動する側
------------------------------------------------------------------------
BOOL    SSMCORE::COR_APSTART( int i_Wait,int i_Owner, CString *i_CMD)
{
    char    CMD[520];
    ZeroMemory( &si , sizeof( STARTUPINFO ));
    ZeroMemory( &pi , sizeof( PROCESS_INFORMATION ));
    si.cb            = sizeof( STARTUPINFO );
    si.dwFlags        = STARTF_USESHOWWINDOW;
    si.wShowWindow    = SW_SHOWNORMAL;
    
    //
    sprintf(CMD,"%s /%4.4d", *i_CMD, i_Owner);
    RT_CD = CreateProcess(NULL,CMD ,NULL ,NULL ,
              FALSE,                
              CREATE_NEW_PROCESS_GROUP, // 0
              NULL ,NULL ,&si ,&pi);
    if (RT_CD != 0)
    {
        // 終了を待つ MessageBoxは自分に制御をすぐ渡すときは不要
        if(i_Wait == 1)    {
            WaitForSingleObject( pi.hProcess, INFINITE );
        }
        // PROCESS_INFORMATION 構造体に返るハンドルは開放されないので
        // 呼び出し側が開放しなければならない
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
        return FALSE;
    }
    return TRUE;

}

-----------------------------------------------------------------------------
起動される側
void C**View::OnInitialUpdate()
{
    char *COMMAND_LINE;
    COMMAND_LINE = GetCommandLine();
    Owner_No = CORE.COR_CMDCHK( COMMAND_LINE );

PECO 2002/04/18(木) 10:52:53
woodさんお返事ありがとうございます。

ソースを見て質問させていただきたいのですが

>起動される側
>void C**View::OnInitialUpdate()
>{
>    char *COMMAND_LINE;
>    COMMAND_LINE = GetCommandLine();
>    Owner_No = CORE.COR_CMDCHK( COMMAND_LINE );

この処理の中の
CORE.COR_CMDCHK( COMMAND_LINE )
ではどの様なことをやっているのでしょうか?

又、起動される側の
C**App::InitInstance()
の中ではParseCommandLine関数は呼び出しているのでしょうか?

「済み」としてしまっているのですが、もし良かったら、お答えお願いします。

wood 2002/04/18(木) 12:17:04
>CORE.COR_CMDCHK
CHAR → INT にしているだけ

起動する側のここを
  sprintf(CMD,"%s /%4.4d", *i_CMD, i_Owner);
見てもらえばわかるように
"TEST.EXE /0001"
のように起動しますので”/”をはずして
”0001”をINTにしているだけですよ

>ParseCommandLine
使っていません
調べたことあるけど値渡しのようなことやるには不向きのようだったので採用しませんでした

私の方法だと引数の解析がきちんとで出来る(法則性)ようにしてあげれば
いろいろ出来ると思いますよ

PECO 2002/04/18(木) 13:20:58
woodさんありがとうございました。
これで、不安を解消することが出来ます。
返答を参考にして開発に活かして行きたいと思います。

古いスレッドには追加発言できません。