|
发表于 2020-7-3 16:54:46
|
显示全部楼层
一般来说,服务没有界面
你想用服务来干什么呢? 如果是开机自启动,添加注册表或者计划任务就可以了
提升权限?可能性不大吧
如果是守护进程之类的,不需要MFC
下面是我原来写(抄)的一个简单的服务测试用例,在while循环中做自己想做的事
- #include <windows.h>
- #include <stdio.h>
- #include <ctime>
- #define SERVER_NAME "NB SERVER TEST"
- #define SZDEPENDENCIES ""
- SERVICE_STATUS_HANDLE sshStatusHandle;
- SERVICE_STATUS status;
- int InitService();
- void PrintLog(char *fmt, ...);
- DWORD WINAPI service_ctrl(
- __in DWORD dwCtrlCode,
- __in DWORD dwEventType,
- __in LPVOID lpEventData,
- __in LPVOID lpContext
- )
- {
- // Handle the requested control code.
- //
- switch (dwCtrlCode)
- {
- // Stop the service.
- //
- // SERVICE_STOP_PENDING should be reported before
- // setting the Stop Event - hServerStopEvent - in
- // ServiceStop(). This avoids a race condition
- // which may result in a 1053 - The Service did not respond...
- // error.
- case SERVICE_CONTROL_STOP:
- {
- //ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 0);
- status.dwCurrentState = SERVICE_STOPPED;
- SetServiceStatus(sshStatusHandle, &status);;
- break;
- }
- // Update the service status.
- case SERVICE_CONTROL_INTERROGATE:
- {
- break;
- }
- // service control device event
- case SERVICE_CONTROL_DEVICEEVENT:
- {
- break;
- }
- default:
- {
- break;
- }
- }
- return NO_ERROR;
- }
- void ServerTest(){
- int i=0;
- while(1){
- Sleep(5000);
- PrintLog("第 %6d 次PrintLog.",i++);
- }
- }
- void WINAPI service_main(DWORD dwArgc, LPTSTR *lpszArgv)
- {
- status.dwServiceType = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS;
- status.dwCurrentState = SERVICE_START_PENDING;
- status.dwControlsAccepted = SERVICE_ACCEPT_STOP |
- SERVICE_ACCEPT_SHUTDOWN;
- status.dwWin32ExitCode = 0;
- status.dwServiceSpecificExitCode = 0;
- status.dwCheckPoint = 0;
- status.dwWaitHint = 0;
- // register our service control handler:
- //
- sshStatusHandle = RegisterServiceCtrlHandlerEx( TEXT(SERVER_NAME), service_ctrl, NULL );
- if (!sshStatusHandle)
- {
- return;
- }
- // SERVICE_STATUS members that don't change in example
- //
- status.dwServiceType = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS;
- status.dwServiceSpecificExitCode = 0;
- status.dwWin32ExitCode = S_OK;
- status.dwCheckPoint = 0;
- status.dwWaitHint = 0;
- status.dwCurrentState = SERVICE_RUNNING;
- status.dwControlsAccepted = SERVICE_ACCEPT_STOP |
- SERVICE_ACCEPT_SHUTDOWN;
- BOOL bRe = SetServiceStatus(sshStatusHandle, &status);
- //ServerTest();
- return;
- }
- void Initialize()
- {
- sshStatusHandle = NULL;
- status.dwServiceType = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS;
- status.dwCurrentState = SERVICE_STOPPED;
- status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
- status.dwWin32ExitCode = 0;
- status.dwServiceSpecificExitCode = 0;
- status.dwCheckPoint = 0;
- status.dwWaitHint = 0;
- }
- int main()
- {
- BOOL bResult=TRUE;
- SERVICE_TABLE_ENTRY st[2];
- st[0].lpServiceName = SERVER_NAME;
- st[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)service_main;
- st[1].lpServiceName = NULL;
- st[1].lpServiceProc = NULL;
- //设置SERVICE_STATUS
- Initialize();
-
- bResult = StartServiceCtrlDispatcher(st);
- return 0;
- }
- //日志函数
- void PrintLog(char *fmt, ...)
- {
- DWORD dwRe = GetLastError();
- time_t now = time(0);
- tm *ltm = localtime(&now);
- char sztime[1024] = {0};
- sprintf(sztime,"%04d-%02d-%02d %02d:%02d:%02d ",1900+ltm->tm_year,1+ltm->tm_mon,ltm->tm_mday,ltm->tm_hour,ltm->tm_min,ltm->tm_sec);
- strcat_s(sztime,fmt);
- FILE *fp = NULL;
- va_list argp; //定义保存函数参数的结构
- int argn = 0; //纪录参数个数
- char szTmpPath[MAX_PATH] = {0};
- strcat_s(szTmpPath,"C:\\NB_Server_Test.log");
- errno_t err = fopen_s(&fp, szTmpPath, "a+t");
- if( fp != NULL )
- {
- va_start(argp,fmt);
- vfprintf(fp, sztime, argp);
- fprintf(fp, "\n");
- fclose(fp);
- va_end(argp);
- }
- SetLastError(dwRe);
- }
复制代码 |
评分
-
查看全部评分
|