1

我正在使用CreateProcess运行 Adob​​e 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 的人时它才有效。

4

2 回答 2

3

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

于 2013-01-24T22:17:16.257 回答
0

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

对于刚刚启动的应用程序,您应该只使用ShellExecuteShellExecuteEx打开所需的文件操作系统(即Shell)将确定如何打开特定文件。您如何知道 Adob​​e Reader 安装在Program Files哪里Program Files (x86)?安装了哪个版本的 Reader?那么任何其他应用程序呢,比如文字处理器或媒体播放器?你是谁来使用非常特定的程序打开文件来打开文件的,你来决定何时终止这个过程。

不仅如此,您的应用程序可能会产生其他进程 - 您会关闭所有子进程(沿着进程树)吗?

于 2013-01-26T12:39:32.713 回答