社区
进程/线程/DLL
帖子详情
获取进程句柄问题, 急!!!
herosword
2004-12-17 05:32:31
我用ShellExecuteEx() 执行一个外部程序, 希望的到这个程序进程句柄, 然后WaitForSingleObject等待它退出, 我执行的程序是用 "Open"方式打开一个文件, 即由系统根据文件扩展名来自动启动与该扩展名关联的程序(打开方式中设定的程序), 但如果我打开的文档是一个已经启动的多文档程序打开的话, 我得不到那个进程得句柄, 我就没办法知道那个进程什么时候退出, 我该怎么做, 请高手指点.
...全文
548
9
打赏
收藏
获取进程句柄问题, 急!!!
我用ShellExecuteEx() 执行一个外部程序, 希望的到这个程序进程句柄, 然后WaitForSingleObject等待它退出, 我执行的程序是用 "Open"方式打开一个文件, 即由系统根据文件扩展名来自动启动与该扩展名关联的程序(打开方式中设定的程序), 但如果我打开的文档是一个已经启动的多文档程序打开的话, 我得不到那个进程得句柄, 我就没办法知道那个进程什么时候退出, 我该怎么做, 请高手指点.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
BigFanOfCpp
2004-12-21
打赏
举报
回复
使用
CreateToolhelp32Snapshot和它的相关函数,可以枚举WIN32进程表里的所有进程,应该够用了吧.
class JProcessInfo
{
public:
JProcessInfo();
virtual ~JProcessInfo();
BOOL FindProcessInfo(const CString& cstrProcessName);
BOOL NeedTerminateProcess();
void GetUpdateSystemName(const CString&);
void ClearProcessInfo();
private:
HANDLE m_hProcessSnap;
PROCESSENTRY32 m_pe32;
HANDLE m_hProcess;
HANDLE m_hRealProcess;
CString m_cstrSystemName;
};
JProcessInfo::JProcessInfo():m_hProcessSnap(NULL),m_hProcess(NULL),m_hRealProcess(NULL)
{
memset(&m_pe32,0,sizeof(m_pe32));
m_pe32.dwSize = sizeof(PROCESSENTRY32);
m_hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
}
JProcessInfo::~JProcessInfo()
{
try
{
if (m_hRealProcess)
::CloseHandle(m_hRealProcess);
::CloseHandle(m_hProcessSnap);
}
catch (...)
{
0;
}
}
BOOL JProcessInfo::FindProcessInfo(const CString& cstrProcessName)
{
if (m_hProcessSnap != INVALID_HANDLE_VALUE)
{
if (::Process32First(m_hProcessSnap,&m_pe32))
{
do
{
HANDLE m_hProcess = ::OpenProcess(PROCESS_ALL_ACCESS,FALSE,m_pe32.th32ProcessID);
CString cstrAppName(m_pe32.szExeFile);
if (cstrAppName == cstrProcessName)
{
if (m_pe32.th32ProcessID != ::GetCurrentProcessId() && m_cstrSystemName != cstrProcessName)
{
::TerminateProcess(m_hProcess,0);
if (::WaitForSingleObject(m_hProcess,INFINITE) == WAIT_OBJECT_0)
{
return TRUE;
}
}
else
m_hRealProcess = ::OpenProcess(PROCESS_ALL_ACCESS,FALSE,m_pe32.th32ProcessID);
}
}
while (::Process32Next(m_hProcessSnap,&m_pe32));
if (m_hRealProcess)
return TRUE;
return FALSE;
}
}
return FALSE;
}
BOOL JProcessInfo::NeedTerminateProcess()
{
if (!m_hRealProcess)
return FALSE;
return ::TerminateProcess(m_hRealProcess,0);
}
void JProcessInfo::GetUpdateSystemName(const CString& pm)
{
m_cstrSystemName = pm;
}
void JProcessInfo::ClearProcessInfo()
{
m_cstrSystemName.Empty();
}
herosword
2004-12-21
打赏
举报
回复
怎么没有人回答了呀。
gooyan
2004-12-21
打赏
举报
回复
CreateProcess,OpenProcess
herosword
2004-12-18
打赏
举报
回复
楼上说得都对,可是当那个程序是只允许一个实例运行,而且是个多文档的程序,我可以ShellExecuteEx打开这个文档,但此时得到的进程句柄为0, 我就没办法 wait For it exit了。
oyljerry
2004-12-17
打赏
举报
回复
CreateProcess,ShellExecuteEx都可以获得句柄的
Kudeet
2004-12-17
打赏
举报
回复
可以用CreateProcess,下面是一个MSDN中的小例子,希望能对您有所帮助。
void main( VOID )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// 创建子进程
if( !CreateProcess( NULL, // No module name (use command line).
"MyChildProcess", // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
ErrorExit( "CreateProcess failed." );
}
// 等待子进程退出
WaitForSingleObject( pi.hProcess, INFINITE );
// 关闭句柄
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
Kudeet
2004-12-17
打赏
举报
回复
http://www.vckbase.com/document/viewdoc.asp?id=416
Q: 如何启动一个程序,直到它运行结束?
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c:\\MyProgram.exe";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
DentistryDoctor
2004-12-17
打赏
举报
回复
是否可以通过注册表得到相应扩展名关联的应用程序,再检举进程,从而得到其句柄呢?
herosword
2004-12-17
打赏
举报
回复
例如, 我Open 一个 txt文件, 系统指定的打开方式是UltraEdit, 我的UltraEdit已经打开, 执行ShellExecuteEx后 UltraEdit确实把txt文件打开了. 可是我得不到它得句柄. how can i do?
获取
进程
名,
获取
进程
路径,
获取
当前
进程
的窗口
句柄
。
则两天在做文件操作的一些帮助函数,则其中用到了
获取
进程
的一些方法,在这里留个笔记,下次用到可以学习下。 1.
获取
进程
的名称或者路径。 bool FileHelper::GetExeName(std::string& strExeName) { strExeName.empty(); char tmp[MAX_PATH] = {0}; //
获取
当前
进程
的ID DWORD process
【python
句柄
获取
】——简单明了的
获取
窗口
句柄
,并使用
句柄
操作
获取
相应内容(全网最详细)
点个赞留个关注吧!! 所使用模块 import sys import win32gui import win32con 通过标题名称
获取
句柄
#通过窗口标题
获取
句柄
hld = win32gui.FindWindow(None,u"此电脑") 通过
句柄
获得标题 # 通过
句柄
获得标题 def get_title(hwnd): title = win32gui.GetWindowText(hwnd) print('窗口标题:%s' % (title)) retu...
使用
进程
名
获取
进程
id和
进程
句柄
相关api介绍 CreateToolhelp32Snapshot Process32First Process32Next 利用
进程
名
获取
进程
id代码实现 本文内容为编写一个任务管理器所需要的API介绍以及如何通过
进程
名称
获取
进程
id的方法,函数使用频率高,所以贴出来以便复用。 相关api介绍 CreateToolhelp32Snapshot 函数功能为拍摄当前所有...
关于
获取
进程
句柄
的
问题
使用CreateProcess创建一个
进程
后,PROCESS_INFORMATION结构中会包含
进程
的handle,和唯一存在的
进程
ID 而后使用openprocess打开
进程
时,根据第一个参数 (dwDesiredAccess:想拥有的该
进程
访问权限PROCESS_ALL_ACCESS //所有能获得的权限PROCESS_CREATE_PROCESS //需要创建一个
进程
PR
获取
进程
句柄
的方法
#include <TlHelp32.h> //1.通过
进程
ID
获取
进程
句柄
HANDLE GetProcessHandle(int nID) { return OpenProcess(PROCESS_TERMINATE, FALSE, nID); } //2.通过
进程
名
获取
进程
句柄
HANDLE GetProcessHandle(LPCWSTR lpName) { HAN...
进程/线程/DLL
15,465
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章