gpt4 book ai didi

c++ - 将批处理脚本作为 Windows 服务运行

转载 作者:太空宇宙 更新时间:2023-11-04 12:26:11 27 4
gpt4 key购买 nike

我们有一个 java 应用程序,它作为服务器运行在远程 Windows 系统上,该系统通过包含一些初始化配置的批处理脚本启动。

为了避免每次都登录系统并启动/停止服务,我计划将该批处理脚本添加为“Windows 服务”并通过命令提示符远程使用它。在多次尝试失败后,我开始知道没有使用第三方软件的简单方法,由于软件使用限制,我不允许使用第三方软件。

作为解决方案,我编写了一个 C/C++ 程序,可以将其添加为服务并使用。程序工作文件。现在我正在尝试使用此代码运行批处理脚本 [使用 system() 方法],但批处理脚本没有被执行。它在独立模式下运行良好。

礼貌:http://www.devx.com/cplus/Article/9857

请帮助我解决问题。

批处理脚本:

batscr.bat


ECHO Error Log Open >C:\MyServices\ERR.LOG
ECHO Error 1 >>C:\MyServices\ERR.LOG
ECHO Message 1 >>C:\MyServices\ERR.LOG

============================================= =

执行批处理脚本的独立 C 程序

批处理程序.cpp


#include
#include

void main()
{
system("C:\\MyServices\\batscr.bat");
}

=======================

服务程序

启动脚本.cpp



#include
#include
#include

#define SLEEP_TIME 5000
#define LOGFILE "C:\\MyServices\\memstatus.txt"

SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;

void ServiceMain(int argc, char** argv);
void ControlHandler(DWORD request);
void InitService();
void main()
{
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = "StartScript";
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;
// Start the control dispatcher thread for our service
StartServiceCtrlDispatcher(ServiceTable);
}


void ServiceMain(int argc, char** argv)
{
int error;

ServiceStatus.dwServiceType = SERVICE_WIN32;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;

hStatus = RegisterServiceCtrlHandler(
"StartScript",
(LPHANDLER_FUNCTION)ControlHandler);
if (hStatus == (SERVICE_STATUS_HANDLE)0)
{
// Registering Control Handler failed
return;
}
// Initialize Service
InitService();

// We report the running status to SCM.
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (hStatus, &ServiceStatus);



return;
}

// Service initialization
void InitService()
{
system("C:\\MyServices\\batscr.bat");
return;
}

// Control handler function
void ControlHandler(DWORD request)
{
switch(request)
{
case SERVICE_CONTROL_STOP:
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
return;

case SERVICE_CONTROL_SHUTDOWN:
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
return;

default:
break;
}

// Report current status
SetServiceStatus (hStatus, &ServiceStatus);

return;
}

感谢和问候......

最佳答案

这可能对你有一点帮助 Link here

...这是一个很常见的问题。

关于c++ - 将批处理脚本作为 Windows 服务运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2374944/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com