求问一个ShellExecuteEx进程句柄泄漏的问题
我有一个windows下的服务进程程序,系统是win2008server。
服务做的主要事情就是不断用ShellExecuteEx调用另一个EXE进程。
最近发现有时服务进程内存高达几百M,句柄数达到几百万。
用process ex一看,服务进程里有大量的file句柄,但这些文件服务进程是不用的,而是另一个EXE进程所用。
EXE进程都已经退出,即使它有泄漏,怎么会跑到服务进程里去呢?
子进程启动和监视代码简化如下
memset(&ShExecInfo, 0x00, sizeof(ShExecInfo));
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = szRealExe;
ShExecInfo.lpParameters = sCommandLine;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
if ( ShellExecuteEx(&ShExecInfo)==FALSE )
nWait = WaitForSingleObject(ShExecInfo.hProcess, );
if ( nWait==WAIT_OBJECT_0 )
{
}
if ( nWait==WAIT_TIMEOUT )
{
TerminateProcess(ShExecInfo.hProcess, 999);
}
if ( ShExecInfo.hProcess )
{
CloseHandle(ShExecInfo.hProcess);
ShExecInfo.hProcess = NULL;
}
谢谢!
服务做的主要事情就是不断用ShellExecuteEx调用另一个EXE进程。
最近发现有时服务进程内存高达几百M,句柄数达到几百万。
用process ex一看,服务进程里有大量的file句柄,但这些文件服务进程是不用的,而是另一个EXE进程所用。
EXE进程都已经退出,即使它有泄漏,怎么会跑到服务进程里去呢?
子进程启动和监视代码简化如下
memset(&ShExecInfo, 0x00, sizeof(ShExecInfo));
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = szRealExe;
ShExecInfo.lpParameters = sCommandLine;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
if ( ShellExecuteEx(&ShExecInfo)==FALSE )
nWait = WaitForSingleObject(ShExecInfo.hProcess, );
if ( nWait==WAIT_OBJECT_0 )
{
}
if ( nWait==WAIT_TIMEOUT )
{
TerminateProcess(ShExecInfo.hProcess, 999);
}
if ( ShExecInfo.hProcess )
{
CloseHandle(ShExecInfo.hProcess);
ShExecInfo.hProcess = NULL;
}
谢谢!
...全文
相关推荐
mfc进程函数ShellExecuteEx
假如ShellExecuteEx()没有执行正确,GetLastError 会帮助您找到问题所在。假如ShellExecuteEx执行正确,那么这个函数会返回TRUE. 要关闭一个程式,我们能够通过FindWindow()找到这个窗口,然后向窗口发送关闭消息,就能够了。问题就在于怎样找到正确的窗口。
shellexecute与shellexecuteex的区别
win32和wince系统自带的打开exe文件的函数区别
SHELLEXECUTEINFO 和 ShellExecuteEx的使用
SHELLEXECUTEINFO 和 ShellExecuteEx的使用
使用ShellExecuteEx调用控制台程序(exe)并传入多个参数
使用ShellExecuteEx调用控制台程序(exe)并传入多个参数
ShellExecuteEx权限提升[源码]
本文详细介绍了如何使用ShellExecuteEx函数提升子进程权限。通过设置SHELLEXECUTEINFO结构体中的lpVerb参数为“runas”,可以在主进程以普通用户身份运行时创建具有管理员权限的子进程。文章还对比了不同lpVerb设置(如“open”或NULL)对子进程权限的影响,并提供了函数原型和结构体定义。测试结果表明,当主进程以管理员身份运行时,创建的子进程均为管理员权限;而当主进程为普通用户时,仅当lpVerb设为“runas”时子进程才获得管理员权限。最后,文中给出了一个完整的代码示例,展示了如何通过ShellExecuteEx启动具有不同权限的cmd窗口。


进程/线程/DLL
