TerminateProcess()在64 bin机器中调用32 bin应用程序时失败

时间:2017-03-07 13:26:48

标签: c++ windows-7-x64

请仔细阅读以下代码:

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 bin上创建一个具有32 bin应用程序(Notepad ++。exe)的进程时,Windows 7计算机TerminateProcess()失败并显示错误代码5(拒绝访问)但是如果我使用64位应用程序创建进程(即LPSTR commandBuffer = "\"C:\\Program Files\\depends22_x64\\depends.exe\"")在同一台机器上没有错误。我需要了解为什么会发生这种情况,以及如何在64位Windows 7计算机上正确终止使用32位应用程序创建的进程。

1 个答案:

答案 0 :(得分:1)

此代码错误:

spring.datasource.tomcat.url=jdbc:oracle:thin:@somehost:1521/someservice.local
spring.datasource.tomcat.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.tomcat.username=user
spring.datasource.tomcat.password=password
spring.datasource.tomcat.max-active=10
spring.datasource.tomcat.min-idle=5
spring.datasource.connection-test-query=SELECT COUNT(*) FROM REAL_TABLE

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

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

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

使用if (TerminateProcess(pi.hProcess, exitCode) == 0) std::cout << GetLastError() << std::endl; 显式指定CreateProcess()OpenHandle()返回的进程ID,而不是使用从PROCESS_TERMINATE返回的进程句柄。然后使用该句柄使用CreateProcess()终止进程。

您还需要考虑的是,像notepad ++这样的应用程序会在它们已经运行时自动终止,而是激活已经运行的进程,可能会告诉已经运行的实例打开文件或其他类似文件。在这种情况下,终止创建的进程对之前已经运行的进程没有影响。

相关问题