我正在使用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的人。
答案 0 :(得分:3)
CreateProcess()
只能为您直接创建的进程提供HANDLE
。有时,应用程序可能会启动自己的另一个进程来执行其工作,或者它可能会将信息(如传递的文件名)传递给另一个正在运行的进程,然后自行退出。如果这是Adobe在内部所做的事情,那么这些行为将会解释您所看到的症状。
答案 1 :(得分:0)
好的,您启动Adobe Reader实例,用户读取 PDF内容。但是,当你读者应该关闭时,你是谁来决定?让最终用户决定何时关闭所述应用程序。您是否在应用程序关闭之前等待几秒/分钟 - 这是一个糟糕的设计。您是否在应用程序关闭时为应用程序提供了一个选项(如某些Close Adobe Reader
按钮) - 这不是一个好的选择!
要启动应用程序,您应该使用ShellExecute
或ShellExecuteEx
打开所需的文件。操作系统(即 Shell )将确定如何打开特定文件。您如何知道Adobe Reader的安装位置 - Program Files
或Program Files (x86)
。安装了哪个版本的Reader?那么任何其他应用程序,比如文字处理器或媒体播放器呢?您是谁使用非常具体的程序打开文件来打开文件,然后决定何时终止此类过程。
更重要的是,您的应用程序可能会产生其他进程 - 您是否会关闭所有子进程(在进程树下)?