打开多个进程时,TerminateProcess不工作

时间:2013-01-24 20:40:20

标签: winapi createprocess

我正在使用CreateProcess运行Adobe Acrobat Reader来显示PDF文件。我想关闭该应用程序。我正在尝试使用TerminatePocess来关闭应用程序。如果只有一个应用程序实例正在运行,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的人。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

要启动应用程序,您应该使用ShellExecuteShellExecuteEx 打开所需的文件。操作系统(即 Shell )将确定如何打开特定文件。您如何知道Adobe Reader的安装位置 - Program FilesProgram Files (x86)。安装了哪个版本的Reader?那么任何其他应用程序,比如文字处理器或媒体播放器呢?您是谁使用非常具体的程序打开文件来打开文件,然后决定何时终止此类过程。

更重要的是,您的应用程序可能会产生其他进程 - 您是否会关闭所有子进程(在进程树下)?