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_发送到该窗口附近。