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

求问一个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进程造成的泄漏,和ShellExecuteEx本身应该无关
------解决方案--------------------
所以先把EXE进程打开的文件句柄都关闭了再退出
也可能是你服务进程超时TerminateProcess强制kill EXE了,所以造成文件句柄没有释放

------解决方案--------------------
引用:
应该是另一个EXE泄漏,可是那个EXE早已经退出了,为什么他的handle会残留在服务进程里呢?
我一直的理解是那个EXE退出之后(那个EXE每次只运行很短的时间),他即使有泄漏应该也在退出是被系统释放了。
我现在在想,服务进程这边怎么做才能避免这种情况呢?因为服务进程我是可以改的,但那个EXE我却改不了。。。


比如
HBITMAP h=CreateBitmap(...);

....
退出函数时,没有DeleteObject,那么这个h就不可再用,但是系统将一直保留,每次进入函数就创建一个,一段时间后,就N多了
------解决方案--------------------
直接运行那个 exe 看他是不是 有文件句柄没有释放。

知道文件名, 另搞一个程序 对 这个 文件 读写。