//*********************************************************
BOOL Uninstall()
{
if (!IsInstalled())
return TRUE;
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
{
MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK);
return FALSE;
}
SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);
if (hService == NULL)
{
::CloseServiceHandle(hSCM);
MessageBox(NULL, _T("Couldn't open service"), szServiceName, MB_OK);
return FALSE;
}
SERVICE_STATUS status;
::ControlService(hService, SERVICE_CONTROL_STOP, &status);
//删除服务
BOOL bDelete = ::DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
if (bDelete)
return TRUE;
LogEvent(_T("Service could not be deleted"));
return FALSE;
}
//*********************************************************
//Functiopn: LogEvent
//Description: 记录服务事件
// niying
va_start(pArg, pFormat);
_vstprintf(chMsg, pFormat, pArg);
va_end(pArg);
lpszStrings[0] = chMsg;
hEventSource = RegisterEventSource(NULL, szServiceName);
if (hEventSource != NULL)
{
ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL);
DeregisterEventSource(hEventSource);
}
}
我在开发的时候用到了DLL里面的函数,开始的时候采用的静态导入的方法,但是发现服务开机启动以后就死掉了,这里不是DLL路径的问题。
没办法,自己只得用动态导入的方法,还好,服务自动开机运行了,还算正常吧。
小提示:如果需要弹出MessageBox消息,比如让服务可以与桌面进行交互。 这个在服务里面可以设置。
当然,我这里的初始化参数已经设置好了,在DOS命令里面安装完成后,你会发现,那个框,我已经替你选上了。
//重要说明,服务最好不要直接编译执行,虽然是exe,最好的方式是安装,
安装命令 DOS 下: ServiceName.exe /install
卸载命令 DOS下 :ServiceName.exe /uninstall
直接运行exe不仅会报错,还会导致服务开机不能自动运行。
大多的时候,你直接运行exe都会报1063错误,就是因为你把服务以控制台的方式运行了。