我用C ++编写了一个Windows服务程序。它执行的任务之一是运行用PowerBuilder编写的非常大的业务应用程序。它执行大量数据库进程并使用SharePoint来回传输数据。 PowerBuilder应用程序可以在某个位置中止它,可能的原因是因为服务有一个有限的桌面堆栈'与普通桌面应用相比。 作为测试,我们尝试使用名为AlwaysUp的通用服务应用程序来运行PowerBuilder应用程序,并且它完全没有任何问题。我很难过为什么AlwaysUp没有问题。以下是我用于启动PowerBuilder应用程序的代码:
// report running status
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hStatus, &ServiceStatus);
// run the application
event = CreateEvent(0, FALSE, FALSE, 0);
if ( CreateProcess( NULL, CommandLine, NULL, NULL, FALSE,
DETACHED_PROCESS | dwPriority, NULL,
szModule, &si, &pi ) == 0 ) {
// CreateProcess Failed
return 0;
}
// wait for either the process to end or stop event
WaitHandles[0] = pi.hProcess;
WaitHandles[1] = event;
do {
dwError = WaitForMultipleObjects(2, WaitHandles, FALSE, 60000);
switch ( dwError ) {
case WAIT_OBJECT_0:
// process ended
bRunning = FALSE;
break;
case WAIT_OBJECT_0+1:
// event triggered
bRunning = FALSE;
break;
case WAIT_TIMEOUT:
// timeout
break;
default:
// error
bRunning = FALSE;
break;
}
} while ( bRunning );
// close the handles
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(event);