2

次のように、TerminateProcess を使用して、ShellExecuteEX によって起動されたアプリを終了しようとしています。

SHELLEXECUTEINFO ExecuteInfo;
ExecuteInfo.fMask = SEE_MASK_FLAG_NO_UI; /* Odd but true */
ExecuteInfo.hwnd = NULL;
ExecuteInfo.cbSize = sizeof(ExecuteInfo);
ExecuteInfo.lpVerb = NULL;
ExecuteInfo.lpFile = "http://www.microsoft.com";
ExecuteInfo.lpParameters = "";
ExecuteInfo.lpDirectory = NULL;
ExecuteInfo.nShow =  SW_SHOW;;
ShellExecuteEx(&ExecuteInfo);
//WaitForSingleObject(ExecuteInfo.hProcess, 0);
Sleep(4000);
TerminateProcess(ExecuteInfo.hProcess, 0);

IE は開くが、閉じない。私は何か間違ったことをしていますか?

4

2 に答える 2

5

MSDNによると、設定するにはforにfMask設定する必要があります。NULLかどうかを確認するためのテストを追加します。ちなみに、私はいつもを使って運が良かった。SEE_MASK_NOCLOSEPROCESS.hProcessCreateProcess

編集:

これは、CreateProcessを使用して行う方法です。

PROCESS_INFORMATION pi = {0};
STARTUPINFO si = {0};
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;


CreateProcess(  NULL,
                "C:\\Program Files\\Internet Explorer\\iexplore.exe http://www.google.com/",
                NULL,
                NULL,
                FALSE,
                NORMAL_PRIORITY_CLASS,
                NULL,
                NULL,
                &si,
                &pi );


Sleep(4000);
TerminateProcess(pi.hProcess, 0);

エラーチェックを追加する必要があり、次のAssocQueryStringように 使用してデフォルトのブラウザのパスを照会できます。AssocQueryString(0,ASSOCSTR_EXECUTABLE,"http","open", szExe, &cchExe);

于 2011-05-19T21:18:49.407 に答える
0

返された hProcess を (デバッガーなどで) チェックすることで、より多くの情報を得ることができます。また、SEE_MASK_NOCLOSEPROCESSフラグが設定されていることを確認してください。

しかし、私の超能力は次のように述べています。IE ドキュメントを開いたからといって、必ずしも新しいプロセスが作成されるわけではありません。作成したプロセスが、実際にドキュメントをホストする別のプロセスを生成した可能性があります。Raymond Chen は、このブログ記事の途中でそれについて言及しています。

于 2011-05-19T21:39:25.603 に答える