我在一个工程中要调用一个外部的服务程序名叫StreamServer的服务程序.我先用
strcpy(cFileName,"C:\\Program Files\\StreamServer\\StreamServer.exe");
STARTUPINFO serverinfo;
memset(&serverinfo,0,sizeof(serverinfo));
serverinfo.cb = sizeof(serverinfo);
PROCESS_INFORMATION m_pServerinfo;if(!CreateProcess(NULL,cFileName,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&serverinfo,&m_pServerinfo))
后用HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,TRUE,m_pServerinfo.dwProcessId);
if(handle != NULL)
{ CloseHandle(m_pServerinfo.hThread);
CloseHandle(m_pServerinfo.hProcess);
TerminateProcess(handle,0);
}
但服务程序不退出内存.我应该怎样做才能把它退出内存? 又怎样在只能让这个服务程序运行一次呢?
strcpy(cFileName,"C:\\Program Files\\StreamServer\\StreamServer.exe");
STARTUPINFO serverinfo;
memset(&serverinfo,0,sizeof(serverinfo));
serverinfo.cb = sizeof(serverinfo);
PROCESS_INFORMATION m_pServerinfo;if(!CreateProcess(NULL,cFileName,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&serverinfo,&m_pServerinfo))
后用HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,TRUE,m_pServerinfo.dwProcessId);
if(handle != NULL)
{ CloseHandle(m_pServerinfo.hThread);
CloseHandle(m_pServerinfo.hProcess);
TerminateProcess(handle,0);
}
但服务程序不退出内存.我应该怎样做才能把它退出内存? 又怎样在只能让这个服务程序运行一次呢?
解决方案 »
- 实习的苦恼
- VC开发的应用程序在没有安装VC的电脑上双击没有反应,静态链接和Release都试过,还是不行
- 如何改变CListCtrl中的图像?
- 松开一个字母键的时候不会发送WM_KEYUP吗,那会发送什么消息呢?
- CTabctrl的标签如何换成图片标签?
- PDFlib问题中关于格式转换的问题
- 在客户区画一条曲线,然后根据参数让它变换起来,如何控制它及一些相关问题?
- 100分请教:请问如何用VC来还原一个已备份的数据库?(来都有分)
- 怎样修改自己的OCX控件在设计时的大小?
- 高手低手都来看看吧:如何监控注册表?(UP有分)
- (*愿意200分相送*)怎样对打印机使用进行密码设置呀,急啊
- 求一段简单的把阿拉伯数字转换为中文大写金额的函数
PS: TerminateProcess(handle,0);这种做法太粗暴了:(
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/dllproc/base/service_functions.htm
进程创建成功后,先CloseHandle(m_pServerinfo.hThread);
CloseHandle(m_pServerinfo.hProcess);
因为这个时候你调用创建进程的这个进程会保留一个所被创建进程的引用。进程在对它的引用都Close掉的时候才会释放它所占用的内存!
又怎样在只能让这个服务程序运行一次呢?
没有明白你的意思!!!
StreamServer.exe是一个服务程序。。我想在CreateProcess(NULL,cFileName,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&serverinfo,&m_pServerinfo)前检查是否存在或内存中是否创建了该进程。存在就不需要重新创建该进程了。若不存在就重新创建该进程就重新创建。。
if(CreateProcess(strPath, sCommandLine.GetBuffer(sCommandLine.GetLength()) ,
NULL,NULL,FALSE,0,NULL,
NULL,&StartupInfo,&ProcessInfo))
{
// BeginProgress();
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}