掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
MessageBox (ID:52705)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
WinExec() を調べてみました。 ブレークポイントを張り、混合モードでステップ実行(F11)です。 スタック上にSTATUPINFO と PROCESS_INFORMATION をとり、 STARTUPINFO を全クリアした後、メンバ cb に構造体サイズ 0x44 を設定、 wShowWindow メンバに引数 SW_SHOW を設定しています。 そして、CreateProcess() を呼び出すわけですが、 lpCommandLine は WinExec() に与えた文字列。 lpStartupInfo とlpProcessInformation はスタックに作成した領域を 渡しますが、ほかのパラメタは全て0になっているようです。 // WinExec と等価な呼び出し STARTUPINFO sStartupInfo; PROCESS_INFORMATION sProcInfo; BOOL bResult; ZeroMemory( &sStartupInfo, sizeof(sStartupInfo)); sStartupInfo.cb = sizeof(sStartupInfo); sStartupInfo.wShowWindow = SW_SHOW; bResult = CreateProcess( NULL,cmdline,NULL,NULL,FALSE,0,NULL,NULL,&sStartupInfo,&sProcInfo ); if( bResult == FALSE ) { DWORD dw = GetLastError(); // エラー処理等 } まあ、このような呼び出しを行う場合は WinExec() と同じだよということですね。 実際 WinExec() を使っても大丈夫でした。 しかし、将来のバージョンで使えなくなるかも知れないことを考えると、 CreateProcess() を使うべき。 自分用に次のようなのを作っておけば引数指定が楽ですよね。 simple.cpp CreateSimpleProcess( LPSTR cmdline ) { ... 上のルーチン } WinExec() の欠点とされていることを気にするなら CreateSimpleProcessEx( LPSTR cmd, LPSTR cmdargs ) { char scmd[272]; #if 0 sprintf( scmd, "\"%s\"", cmd ); // おっとこれはまずいかな。 #else char * p = scmd; char * q = cmd; *p++ = 0x22; // '\"' を打つのが面倒なので while( *q ) *p++ = *q++; *p++ = 0x22; *p = 0; #endif ... CreateProcess( scmd, cmdars, ... ); } にしても、同じようなことをするのに似たような関数がいっぱいあるというのは Windows の最大の欠点ですね。 #これを長所という方おられますか?
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.