Winapi 当有多个进程打开时TerminateProcess不工作

Winapi 当有多个进程打开时TerminateProcess不工作,winapi,createprocess,Winapi,Createprocess,我正在使用CreateProcess运行Adobe Acrobat Reader以显示PDF文件。我想关闭该应用程序。我正在尝试使用terminateprocess关闭应用程序。如果只有一个应用程序实例正在运行,TerminateProcess工作正常。但如果有多个实例正在运行,它将不会关闭。如果在我的程序外打开PDF文件,并且我的程序运行Acrobat Reader打开其他文件,TerminateProcess将不会关闭我打开的读取器 我正在使用: result = CreateProcess

我正在使用
CreateProcess
运行Adobe Acrobat Reader以显示PDF文件。我想关闭该应用程序。我正在尝试使用
terminateprocess
关闭应用程序。如果只有一个应用程序实例正在运行,
TerminateProcess
工作正常。但如果有多个实例正在运行,它将不会关闭。如果在我的程序外打开PDF文件,并且我的程序运行Acrobat Reader打开其他文件,
TerminateProcess
将不会关闭我打开的读取器

我正在使用:

result = CreateProcess(NULL, LaunchExeCharString, NULL, NULL, FALSE, bWait ? HIGH_PRIORITY_CLASS : NULL, NULL, WorkingPathName, &StartupInfo, &ProcessInformation);
其中,
LaunchExeCharString
是读卡器的名称(AcroRd32.exe)

StartupInfo
如下所示:

StartupInfo.cb              = sizeof(STARTUPINFO);
StartupInfo.lpReserved      = NULL;
StartupInfo.lpDesktop       = NULL;
StartupInfo.lpTitle         = NULL;
StartupInfo.dwX             = 0;
StartupInfo.dwY             = 0;
StartupInfo.dwXSize         = 0;
StartupInfo.dwYSize         = 0;
StartupInfo.dwXCountChars   = 0;
StartupInfo.dwYCountChars   = 0;
StartupInfo.dwFillAttribute = 0;
StartupInfo.dwFlags         = STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow     = RunMode;
StartupInfo.cbReserved2     = 0;
StartupInfo.lpReserved2     = NULL;
StartupInfo.hStdInput       = NULL;
StartupInfo.hStdOutput      = NULL;
StartupInfo.hStdError       = NULL;
然后我用

TerminateProcess(ProcessInformation.hProcess, 0);

正如我所说,如果另一个PDF文件打开,TerminateProcess将不会终止我的acrord32.exe实例。只有当我是唯一一个运行acrord32的人时,它才有效。

CreateProcess()
只能为它直接创建的进程提供一个
句柄。有时,应用程序可能会启动自己的另一个进程来完成其工作,或者它可能会将信息(如传递的文件名)传递给另一个正在运行的进程,然后退出自身。如果Adobe内部正在这样做的话,这些行为可以解释您看到的症状。

好的,您启动一个Adobe Reader实例,用户读取PDF内容。但是你是谁来决定读者什么时候关门呢?让最终用户决定何时关闭所述应用程序。在应用程序应该关闭之前,您是否要等待几秒钟/分钟?这是一个糟糕的设计。当您的应用程序应该关闭时,您是否在应用程序中为用户提供了一个选项(如某些
关闭Adobe Reader
按钮),这不是一个好选项

对于刚刚启动的应用程序,您应该只使用
ShellExecute
ShellExecuteEx
打开所需的文件。操作系统(即Shell)将决定如何打开特定文件。您如何知道Adobe Reader安装在哪里?在
程序文件中,或在
程序文件(x86)
中。安装了哪个版本的读卡器?还有其他应用程序呢,比如文字处理器或媒体播放器?使用非常特定的程序打开文件时,您是谁?您需要决定何时终止此过程


除此之外,您的应用程序可能会生成其他进程—您是否会关闭所有子进程(进程树下)

您可能必须找到该窗口(使用EnumWindow),然后将WM_发送到该窗口附近。