5

この関数を使用して、CreateProcess()「mstsc.exe」を使用してrdpクライアントアプリを起動します。その後、終了したいのでTerminateProcess()関数を使用しますが、エラーコード5で失敗します。「mstsc.exe」を「notepad.exe」に置き換えると、終了機能が動作します。コードは次のとおりです。

TCHAR szCommandLine[] = TEXT("mstsc.exe");
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi;
BOOL bResult = CreateProcess(NULL, szCommandLine, NULL, NULL,
    FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
::Sleep(3000);
if (TerminateProcess(pi.hProcess, 0) == 0) {
printf("failed: %d", GetLastError());
}

誰かがそれを説明して解決するのを手伝ってもらえますか?私が観察したのは、pi返されたpidが、taksmanagerまたは「ProcessExplorer」で観察されたプロセス「mstsc.exe」のIDとは異なることです。

4

2 に答える 2

3

ホストプロセスは32ビットで、64ビットウィンドウで実行していますか?

その場合、32ビットのmstscを呼び出し、64ビットバージョンを生成しているため、異なるPIDが生成されます。このスレッドをチェックしてください

于 2012-08-23T15:56:26.273 に答える
3

別のプロセスを終了する前に、特権を取得する必要があります。

これを試して:

void UpdatePrivilege(void)
{
    HANDLE hToken;
    TOKEN_PRIVILEGES tp;
    LUID luid;

    if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))
    {
       LookupPrivilegeValue(NULL,SE_DEBUG_NAME, &luid);

       tp.PrivilegeCount = 1;
       tp.Privileges[0].Luid = luid;
       tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

       AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
    }
}

TerminateProcessを呼び出す前に、この関数を呼び出します。

于 2012-08-23T16:02:40.563 に答える