求问一个ShellExecuteEx进程句柄泄漏的问题

microyzy 2013-10-24 02:37:22
我有一个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;
}

谢谢!
...全文
273 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
y358253794 2015-05-30
  • 打赏
  • 举报
回复
楼主求加个QQ指导一下,谢谢 358253794
microyzy 2013-10-24
  • 打赏
  • 举报
回复
有了思路,先3q各位
schlafenhamster 2013-10-24
  • 打赏
  • 举报
回复
直接运行那个 exe 看他是不是 有文件句柄没有释放。 知道文件名, 另搞一个程序 对 这个 文件 读写。
microyzy 2013-10-24
  • 打赏
  • 举报
回复
3q,那就是说,服务进程这边无论怎么改都是行不通的?
oyljerry 2013-10-24
  • 打赏
  • 举报
回复
引用 5 楼 microyzy 的回复:
ls的意思是,记事这个进程退出,也无法释放? 不好意思,我一直以为进程退出系统就给释放了。
引用计数没有清零,就不会释放
microyzy 2013-10-24
  • 打赏
  • 举报
回复
ls的意思是,记事这个进程退出,也无法释放? 不好意思,我一直以为进程退出系统就给释放了。
worldy 2013-10-24
  • 打赏
  • 举报
回复
引用 3 楼 microyzy 的回复:
应该是另一个EXE泄漏,可是那个EXE早已经退出了,为什么他的handle会残留在服务进程里呢? 我一直的理解是那个EXE退出之后(那个EXE每次只运行很短的时间),他即使有泄漏应该也在退出是被系统释放了。 我现在在想,服务进程这边怎么做才能避免这种情况呢?因为服务进程我是可以改的,但那个EXE我却改不了。。。
比如 HBITMAP h=CreateBitmap(...); .... 退出函数时,没有DeleteObject,那么这个h就不可再用,但是系统将一直保留,每次进入函数就创建一个,一段时间后,就N多了
microyzy 2013-10-24
  • 打赏
  • 举报
回复
应该是另一个EXE泄漏,可是那个EXE早已经退出了,为什么他的handle会残留在服务进程里呢? 我一直的理解是那个EXE退出之后(那个EXE每次只运行很短的时间),他即使有泄漏应该也在退出是被系统释放了。 我现在在想,服务进程这边怎么做才能避免这种情况呢?因为服务进程我是可以改的,但那个EXE我却改不了。。。
oyljerry 2013-10-24
  • 打赏
  • 举报
回复
所以先把EXE进程打开的文件句柄都关闭了再退出 也可能是你服务进程超时TerminateProcess强制kill EXE了,所以造成文件句柄没有释放
worldy 2013-10-24
  • 打赏
  • 举报
回复
估计是ShellExecuteEx调用的另一个EXE进程造成的泄漏,和ShellExecuteEx本身应该无关

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧