2013-01-24 28 views
1

我使用CreateProcess来运行Adobe Acrobat Reader以显示PDF文件。我想关闭该应用程序。我正在尝试使用TerminatePocess来关闭应用程序。如果只有一个应用程序实例正在运行,则TerminateProcess工作得很好。但是如果有多个实例在运行,它将不会关闭。如果在我的程序外部打开PDF文件,并且我的程序运行Acrobat Reader打开另一个文件,则TerminateProcess将不会关闭我打开的阅读器。当有多个进程打开时,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的人。

+1

您可能需要找到窗口(使用EnumWindow),然后将WM_CLOSE发送到该窗口。 –

回答

3

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

0

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

对于刚刚启动的应用程序,你应该只使用ShellExecuteShellExecuteEx开放所需的文件。操作系统(即Shell)将决定如何打开特定文件。您如何知道Adobe Reader的安装位置 - 在Program FilesProgram Files (x86)中。安装了哪个版本的Reader?而其他任何应用程序如文字处理器或媒体播放器呢?你打算使用非常具体的程序来打开一个文件,你可以打开一个文件,然后决定何时结束这个过程。

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

相关问题