2017-03-07 50 views
0

请经过下面的代码:了TerminateProcess()失败时在64箱机在32箱应用程序调用

LPSTR commandBuffer = "\"C:\\Program Files (x86)\\Notepad++\\notepad++.exe\""; 
STARTUPINFO si; 
PROCESS_INFORMATION pi; 
ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
ZeroMemory(&pi, sizeof(pi)); 
si.dwFlags = STARTF_USESHOWWINDOW; 
si.wShowWindow = SW_MINIMIZE; 
if (CreateProcess(NULL, 
    commandBuffer, 
    NULL, 
    NULL, 
    FALSE, 
    0, 
    NULL, 
    NULL, 
    &si, 
    &pi)) { 

    Sleep(5000); 
    UINT exitCode = 0; 
    if (!TerminateProcess(pi.hProcess, exitCode)) 
     std::cout << GetLastError() << std::endl; 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
} 

在这里,当我创建一个进程,在64 32箱应用(记事本++ EXE。) bin Windows 7机器TerminateProcess()失败,出现错误代码5(拒绝访问),但如果我在同一台机器上创建一个64位应用程序(即LPSTR commandBuffer = "\"C:\\Program Files\\depends22_x64\\depends.exe\"")的进程,则不会出现错误。我需要了解为什么会发生这种情况,以及如何才能在64位Windows 7计算机上正确终止使用32位应用程序创建的进程。

回答

1

这段代码是错误的:

if (TerminateProcess(pi.hProcess, exitCode)) 
     std::cout << GetLastError() << std::endl; 

了TerminateProcess失败比0成功以外的代码返回0。 C++ if()语句将非零值计算为true,并将零计算为false。所以,你需要写:

if (TerminateProcess(pi.hProcess, exitCode) == 0) 
     std::cout << GetLastError() << std::endl; 

至于实际的问题。我无法重现它在Windows 10的64位,但如果它仍然存在,请尝试以下操作:

而不是使用CreateProcess()返回的进程句柄,创建使用OpenHandle()一个新的手柄从CreateProcess()返回的进程ID明确指定PROCESS_TERMINATE。然后使用该句柄来终止使用ProcessTerminate()的过程。


什么,你还需要考虑的是,像记事本++应用程序将自动终止本身时,他们已经在运行,而是激活已在运行的过程中,也许说的是已经运行的实例中打开文件或一些这样的。在这种情况下,终止创建的进程不会影响之前已经运行的进程。

+1

来自CreateProcess的句柄将始终具有完全访问权限。我会冒险猜测'depends.exe'可能会自动升高,或者崩溃,或者出乎意料地行为。 –

+0

@NineBerry:纠正了您所指出的程序错误,谢谢。我会尝试建立一个新的句柄并使用它来终止这个过程。感谢您的回应。 – Sajal

相关问题