社区
进程/线程/DLL
帖子详情
获取进程句柄问题, 急!!!
herosword
2004-12-17 05:32:31
我用ShellExecuteEx() 执行一个外部程序, 希望的到这个程序进程句柄, 然后WaitForSingleObject等待它退出, 我执行的程序是用 "Open"方式打开一个文件, 即由系统根据文件扩展名来自动启动与该扩展名关联的程序(打开方式中设定的程序), 但如果我打开的文档是一个已经启动的多文档程序打开的话, 我得不到那个进程得句柄, 我就没办法知道那个进程什么时候退出, 我该怎么做, 请高手指点.
...全文
514
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?
win10 x64全局
句柄
表
x64全局
句柄
表
在Qt中将QWindow或者QWidget嵌入到别的
进程
中的窗口中(windows)
前提:必须知道另外一个
进程
的窗口
句柄
示例(这里用QWidget举例,QWindow也一样的): 1、首先创建一个
进程
,创建一个顶级窗口“Proc 1 Window”并运行 #include "mainwindow.h" #include <QApplication...
【python】分享一个在Windows下对应用程序python窗口后台截图的方法
#
获取
后台窗口的
句柄
,注意后台窗口不能最小化 hWnd = win32gui.FindWindow("NotePad",None) #窗口的类名可以用Visual Studio的SPY++工具
获取
#
获取
句柄
窗口的大小信息 left, top, right, bot = w
纵谈
进程
枚举
当程序出现异常而失去响应,我们通常的做法是打开Windows任务管理器强行将其"杀死"。Windows任务管理器是个好东西,它能显示当前系统中执行的全部
进程
,以及它们的...可是,你先别
急
,关于
进程
枚举。可能你仅仅知其...
跨
进程
获取
其他程序的DBGrid内容
GetWindowText,WM_GETTEXT可以
获取
EDIT的文本内容; LB_GETTEXT可以
获取
LISTBOX列表项的文本内容; CB_GETLBTEXT可以
获取
COMBOBOX下拉列表项的文本内容; 这里我就不多说了。 对
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章