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関数を無効にすることで支障はないのでしょうか?
それ以前に、引数の数が一致してませんが・・。
>それ以前に、引数の数が一致してませんが・・。
すみません、見落としです。聞かなかったことにしてください。
第1パラメータにEXEのファイル、第2パラメータにAAAと
入れてもダメですか?
あと、第1パラメータを“C:\\BIN\\TEST.EXE AAA”として、
第2パラメータをNULLにする手もあります。
もしかして、このTEST.EXEって、SDI/MDIアプリケーションですね?
引数AAAを伴うことで、これを「初期オープンするファイル名」と勘違いしていますね、
TEST.EXEは。
(厳密には、TEST.EXEで実行されるParseCommandLine。)
MFCが提供する引数解析機能を利用するなら、CCmdLineInfoクラスに手を加える必要がありま
す。
独自に引数解析を実装するなら、ParseCommandLine()を外しても問題ないと思います。
いもちぃさん、sugarさん、お返事ありがとうございます。
>第1パラメータにEXEのファイル、第2パラメータにAAAと
>入れてもダメですか?
としますと、AAAを引数として受け取ってはもらえませんでした。
>あと、第1パラメータを“C:\\BIN\\TEST.EXE AAA”として、
>>第2パラメータをNULLにする手もあります。
ではアプリが起動かかりませんでした。
>もしかして、このTEST.EXEって、SDI/MDIアプリケーションですね?
そうです、SDIアプリケーションを作成しています。
>引数AAAを伴うことで、これを「初期オープンするファイル名」と勘違いしていますね、
ファイルが見つかりませんといったメッセージが返ってきます。
>独自に引数解析を実装するなら、ParseCommandLine()を外しても問題ないと思います。
ありがとうございます。この方法で作成してみたいと思います。
もうお済のようですけど下記のようなことやってます
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 );
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関数は呼び出しているのでしょうか?
「済み」としてしまっているのですが、もし良かったら、お答えお願いします。
>CORE.COR_CMDCHK
CHAR → INT にしているだけ
起動する側のここを
sprintf(CMD,%s /%4.4d, *i_CMD, i_Owner);
見てもらえばわかるように
TEST.EXE /0001
のように起動しますので”/”をはずして
”0001”をINTにしているだけですよ
>ParseCommandLine
使っていません
調べたことあるけど値渡しのようなことやるには不向きのようだったので採用しませんでした
私の方法だと引数の解析がきちんとで出来る(法則性)ようにしてあげれば
いろいろ出来ると思いますよ
woodさんありがとうございました。
これで、不安を解消することが出来ます。
返答を参考にして開発に活かして行きたいと思います。