【发布时间】:2015-09-30 10:02:05
【问题描述】:
我们正在运行一个负责监控一组进程的 Windows 服务。该服务基本上只负责 (a) 检查定义的作业是否正在运行,以及 (b) 如果它们没有运行则启动这些作业。
服务是通过以下命令创建的(sc:https://technet.microsoft.com/en-us/library/bb490995.aspx):
sc create "My Service" binPath= C:\heyoo\myservice.exe type= own start= auto error= normal
sc start "SCF Service"
该服务负责创建的作业之一是“Camera.exe”。 Camera.exe 从连接的摄像机 (FireWire 1394) 检索视频源,并对它们进行一些处理。
一周前,该服务已从使用 ShellExecute 重写为使用 CreateProcess,因此它能够更好地监控已定义的作业(因为它获取进程的 HANDLE)。
ShellExecute 调用(旧方法):
bool Execute()
{
int result = (int)ShellExecute(NULL, "open", "C:\\bin\\Camera.exe", NULL, NULL, SW_SHOWDEFAULT);
return result > 32;
}
CreateProcess 调用(新方法):
// Called with Execute("C:\\bin\\Camera.exe", "");
bool Execute(std::string prog, std::string args)
{
std::string cmd = std::string(prog) + " " + args;
char *path = new char[cmd.length()+1];
strcpy(path, cmd.c_str());
STARTUPINFO si = {0};
si.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
DWORD creationFlags = REALTIME_PRIORITY_CLASS;
BOOL result = CreateProcess(NULL, path, NULL, NULL, FALSE, creationFlags, NULL, NULL, &si, &pi);
delete[] path;
if (result) {
SetProcInfo(pi);
}
return result;
}
使用新的 CreateProcess 方法,我们注意到 (A) 网络在一定时间间隔后系统性地失败,并且 (B) 从相机检索到的图像包含无效的时间戳(正确的时间戳对我们至关重要)。
A 经常断开整个网络连接,并且需要重新启动才能重新联机。 B 导致图像处理失败,因为我们高度依赖有效的时间戳。
问题(A 和 B)仅在 Service.exe 作为服务运行时出现。从命令行运行Service.exe或Camera.exe时,没有出现任何问题。
今天我从服务中删除了 CreateProcess 调用(返回到 ShellExecute),问题又消失了。我对 API 调用做错了什么?
【问题讨论】:
标签: windows winapi createprocess shellexecute