2

CreateProcess次の手順で、関数を使用してメイン アプリケーションからサブ アプリケーションを起動します。

  1. サブプログラムのウィンドウなしでメインからサブ.exeプログラムを起動しました
  2. を待つrand Sleep
  3. 次に、最初にサブアプリケーションを終了し、次にメインを終了します。

以下は、上記のサンプルコードですが、サブプログラムがウィンドウ (この場合はメモ帳) で実行されており、サブプログラムを終了できません。

#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include <strsafe.h>
#include <direct.h>
#include <string.h>

int main(int argc, char* argv[])
{   

HWND                hWnd;
STARTUPINFO         sInfo;
PROCESS_INFORMATION pInfo;

ZeroMemory(&sInfo, sizeof(sInfo));
sInfo.cb = sizeof(sInfo);
ZeroMemory(&pInfo, sizeof(pInfo));

if (CreateProcess("C:\\WINDOWS\\System32\\notepad.exe", NULL, NULL, NULL, false, CREATE_NO_WINDOW, NULL, NULL, &sInfo, &pInfo))
{
    printf("Sleeping 100ms...\n");
    Sleep(100);

    DWORD dwExitCode;
    GetExitCodeProcess(pInfo.hProcess, &dwExitCode);

    CloseHandle(pInfo.hThread);
    CloseHandle(pInfo.hProcess);

    }

system("pause");

return 0;

 }
4

1 に答える 1

2

メモ帳ウィンドウが表示される理由は、それがコンソール アプリケーションではないためです。MSDNはこれについて次のように述べていCREATE_NO_WINDOWます:

このプロセスは、コンソール ウィンドウなしで実行されるコンソール アプリケーションです。したがって、アプリケーションのコンソール ハンドルは設定されません。 このフラグは、アプリケーションがコンソール アプリケーションでない場合、または CREATE_NEW_CONSOLE または DETACHED_PROCESS で使用されている場合は無視されます。

代わりに、STARTUPINFOあなたが渡すを使用してください:

sInfo.dwFlags = STARTF_USESHOWWINDOW;
sInfo.wShowWindow = SW_HIDE;

メモ帳のメイン関数の最後の引数に影響すると思いますWinMainが、よくわかりません。

メモ帳が閉じない理由については、GetExitCodeProcess実際にプロセスを終了せず、状態を取得するだけです。代わりに使用できますTerminateProcess

TerminateProcess(pInfo.hProcess, 0);
于 2013-01-13T09:40:44.680 に答える