守护程序编写问题记录

      从去年年底接手该程序。跨过一个为期11天的春节。到现在该程序总算告一段落了。中间遇到了一些问题。为了从挫折中获取养料,也为了培养起自己记笔记的习惯。特将问题记录下来。而其中记录的所有关于问题的猜想和解决思路,都是从该次项目中提取而来。不能保证思路一定正确。

一、常识问题

       将服务启动类型设置为自动类型时候,应用程序异常退出。系统在隔一段时间后,会将应用程序重启。

二、应用安装完成后,启动服务,报1053错误。

     (1) 编写的程序本身存在错误。

     (2) 服务没有按照规定编写,正确示例核心代码如下所示:

     int _tmain(int argc, _TCHAR* argv[]) {
WindowsService* service = ServiceInitial();
if (service == NULL) {
delete service;
return 0;
}
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = L"AUHelper";
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;
// 启动服务的控制分派机线程
StartServiceCtrlDispatcher(ServiceTable);
        return 0;

    }

    WindowsService* ServiceInitial() {
char servicePath[MAX_PATH];
if (GetModuleFileNameA(NULL, servicePath, MAX_PATH) == 0) {
return NULL;
}
service = new WindowsService(SERVER_NAME, servicePath, "");
return service;
   }

  void WINAPI ServiceCtrlHandler(DWORD dwCtrl) {
switch (dwCtrl) {
case SERVICE_CONTROL_STOP:
Logger(101, 5, "SERVICE_CONTROL_STOP");
service->ReportServiceStatus(SERVICE_STOP_PENDING, 0);
SetEvent(ghSvcStopEvent);
break;
default:
break;
}
 }

/// <summary>
/// 服务运行的主要执行代码
/// </summary>
void ApplicationStart() {
if (service) { // 报告运行状态
service->ReportServiceStatus(SERVICE_RUNNING, 0);
}
}

/// <summary>
/// 服务运行的主要执行代码终止执行后的后续处理
/// </summary>
void ApplicationEnd() {
//停止服务程序
if (service) {
ServiceCtrlHandler(SERVICE_CONTROL_STOP);
}
}

void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) {
servieStutusHandle = RegisterServiceCtrlHandlerA(SERVER_NAME, ServiceCtrlHandler);//注册控制处理
ghSvcStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!servieStutusHandle || ghSvcStopEvent == NULL) {
Logger_error("Register CtrlHandler or CreateEvent error");
CloseHandle(ghSvcStopEvent);
return;
}
SERVICE_STATUS serviceStatus;
serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
serviceStatus.dwServiceSpecificExitCode = 0;
service->BindServiceStatus(serviceStatus, servieStutusHandle);
service->ReportServiceStatus(SERVICE_START_PENDING, 100);
try {
ApplicationStart();
WaitForSingleObject(ghSvcStopEvent, INFINITE);
}
catch (const std::system_error& e) {
Logger_error("Application start error,%s", e.what());
}
service->ReportServiceStatus(SERVICE_STOPPED, 0);
CloseHandle(ghSvcStopEvent);
Logger(101, 5, "service stopped");
if (service != NULL) {
delete service;
}
 }

二、#error No Target Architecture

出现这个情况的问题,目前还不是很明确。不过代码中引入#include<Windows.h>会出现很多问题。一般把#include<Windows.h>放入最前面,可以避免很多问题。

三、程序入口设置错误, 提示: ]<K;祕A5? msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 璞m叽鸡pb  

我的程序中出现这个问题,是因为程序入口参数有问题,入口程序参数改成以下形式,问题就解决了:

 int _tmain(int argc, _TCHAR* argv[]);

四、升级程序流程

(1) 下载、压缩升级文件。

(2) 停止服务

(3) 更新可执行文件

(4) 启动服务



### 回答1: 程序守护服务是一种可以确保程序在后台持续运行的服务。在C#中,我们可以使用一些技术来实现程序守护服务。 首先,我们可以使用Windows服务来创建程序守护服务。Windows服务是在后台运行的应用程序,它可以在系统启动时自动启动,并在整个系统运行期间持续运行。我们可以使用C#编写一个Windows服务,并通过安装该服务来注册到系统中。通过服务管理器,我们可以启动、停止和监控该服务的运行状态。 另外,我们还可以使用第三方库如Topshelf来简化创建和管理程序守护服务的过程。Topshelf是一个开源的C#库,它提供了一组易于使用的API,可以将一个常规的C#控制台应用程序转换为一个Windows服务。通过使用Topshelf,我们可以更加方便地定义服务的启动、停止和运行逻辑,并可以通过命令行参数或配置文件来配置服务的行为。 无论是使用Windows服务还是Topshelf,我们都需要确保程序以服务的方式运行时具备一些必要的特性。首先,我们需要确保程序能够在后台持续运行,而不受用户交互的影响。其次,我们需要能够处理异常,保证程序的稳定性。此外,我们需要定义适当的启动和停止逻辑,以确保在服务启动时进行必要的初始化操作,在服务停止时清理资源并保存状态。 总结来说,程序守护服务是一种可以确保程序在后台持续运行的服务。在C#中,我们可以使用Windows服务或第三方库如Topshelf来创建和管理程序守护服务,以确保程序在系统运行期间始终保持活动状态。 ### 回答2: 程序守护服务是指在计算机中运行的一种服务,主要负责监控、管理和维护其他程序的运行状态。在C#语言中,可以使用一些技术手段来实现程序守护服务。 首先,可以使用多线程技术来监控其他程序的运行状态。通过创建一个独立的线程,并在该线程中循环检测需要守护程序是否在运行,如果程序异常退出,则可以重新启动程序,并记录异常信息。 其次,可以使用Windows服务(Windows Service)来实现程序守护。Windows服务是一种在后台运行的应用程序,可以自动启动和停止。通过创建一个Windows服务,并在服务中编码实现对其他程序的监控和管理,可以确保守护服务在计算机启动时自动启动,并在计算机关闭时自动停止。 另外,可以使用第三方的守护服务框架,如Topshelf。Topshelf是一个开源的C#框架,可以轻松地将常规控制台应用程序转换为Windows服务,提供了丰富的功能和配置选项,便于开发和管理程序守护服务。 总之,程序守护服务是一种重要的技术手段,可以提高程序的稳定性和可靠性。在C#中,可以通过多线程、Windows服务或使用第三方框架实现程序守护服务,确保程序在异常退出时能够及时重新启动,并提供监控和管理功能。 ### 回答3: 程序守护服务(Program Daemon Service)是指在操作系统中以守护进程形式运行的一种服务。在C#语言中,可以通过使用System.ServiceProcess命名空间提供的类库来实现程序守护服务。 首先,我们可以创建一个继承自ServiceBase的自定义服务类,该类需要重写OnStart()和OnStop()方法。在OnStart()方法中,可以实现服务的初始化代码,例如建立数据库连接、读取配置文件等;而在OnStop()方法中,可以实现服务的停止逻辑,例如关闭数据库连接、释放资源等。 接下来,我们需要在Main()函数中创建一个ServiceBase数组,并将我们自定义的服务类传入。通过调用ServiceBase.Run()方法来启动服务。在服务启动之前,可以通过命令行参数来指定服务的运行方式,例如“-install”表示安装服务,“-uninstall”表示卸载服务。 在服务启动后,我们可以通过ServiceController类来管理和控制服务的运行。例如,使用ServiceController.Start()和ServiceController.Stop()方法启动和停止服务,使用ServiceController.Pause()和ServiceController.Continue()方法暂停和恢复服务运行。 此外,我们还可以在自定义服务类中实现一些特定的功能,例如实现定时执行任务、监控服务状态等。通过使用System.Timers命名空间中提供的Timer类,我们可以在指定的时间间隔内触发特定的事件,从而实现定时执行任务的功能。 总结来说,C#语言中可以通过System.ServiceProcess命名空间提供的类库来实现程序守护服务。我们需要创建一个自定义服务类,并重写OnStart()和OnStop()方法。通过ServiceBase.Run()方法来启动服务,使用ServiceController类来管理和控制服务的运行。此外,还可以使用System.Timers命名空间中的Timer类实现定时执行任务的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值