弄了一个程序,将其注册成系统服务,ServiceMain(){}内的代码似乎没有执行!奇怪....

weping 2006-05-26 03:54:03
#include "stdafx.h"
#include "Windows.h"
#include "Winsvc.h"
#include "stdio.h"
#include "time.h"
#include "stdlib.h"
#include "process.h"

SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
BOOL bRunning=true;
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ServiceCtrlHandler(DWORD Opcode);
BOOL InstallService();
BOOL DeleteService();
int main(int argc, char* argv[])
{
if(argc>1)
{
if(strcmp(argv[1],"-i")==0) //按装服务,参数为 -i
{
if(InstallService())
printf("\n\nService Installed Sucessfully\n");
else
printf("\n\nError Installing Service\n");
}
if(strcmp(argv[1],"-d")==0) //卸载服务 参数 -d
{
if(DeleteService())
printf("\n\nService UnInstalled Sucessfully\n");
else
printf("\n\nError UnInstalling Service\n");
}
else
{
printf("\n\nUnknown Switch Usage\n\nFor Install use Srv1 -i\n\nFor UnInstall use Srv1 -d\n");
}
}
else
{ //没有参数时就开始执行程序
SERVICE_TABLE_ENTRY DispatchTable[]=
{{"Service1",ServiceMain},{NULL,NULL}};
StartServiceCtrlDispatcher(DispatchTable);
}
spawnlp(P_WAIT,"novel.exe",NULL); //测试一下程序中要执行的程序是否正常,可删除
printf(" OK"); //可删除
return 0;
}

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
DWORD status;
DWORD specificError;
m_ServiceStatus.dwServiceType = SERVICE_WIN32;
m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwServiceSpecificExitCode = 0;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;

m_ServiceStatusHandle = RegisterServiceCtrlHandler("Service1",
ServiceCtrlHandler);
if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
{
return;
}
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))
{
}

bRunning=true;
while(bRunning)
{
//Place Your Code for processing here....
spawnlp(P_WAIT,"novel.exe",NULL); //程序似乎没有执行到这儿来... 不知道是那儿的问题? 我是想让这个程序每隔一定时间就执行novel.exe
Sleep(60000);
}
return;
}

void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;

SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus);
bRunning=false;
break;
case SERVICE_CONTROL_INTERROGATE:
break;
}
return;
}

BOOL InstallService()
{
char strDir[1024];
HANDLE schSCManager,schService;
GetCurrentDirectory(1024,strDir);
strcat(strDir,"service.exe");
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);

if (schSCManager == NULL)
return false;
LPCTSTR lpszBinaryPathName=strDir;

schService = CreateService(schSCManager,"Service1",
"The Display Name Needed", // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_AUTO_START, // start type
SERVICE_ERROR_NORMAL, // error control type
lpszBinaryPathName, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password

if (schService == NULL)
return false;

CloseServiceHandle(schService);
return true;
}

BOOL DeleteService()
{
HANDLE schSCManager;
SC_HANDLE hService;
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);

if (schSCManager == NULL)
return false;
hService=OpenService(schSCManager,"Service1",SERVICE_ALL_ACCESS);
if (hService == NULL)
return false;
if(DeleteService(hService)==0)
return false;
if(CloseServiceHandle(hService)==0)
return false;

return true;
}


---------------------------------------------
以上代码在VC++ 6.0下编译通过。
...全文
573 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
weping 2006-05-26
  • 打赏
  • 举报
回复
谢谢两位的回复,问题已经解决,可以结贴啦!
mynamelj 2006-05-26
  • 打赏
  • 举报
回复
调式服务,是要先启动服务,不能够直接在编译器中运行.要先在服务器管理器中启动或用以下dos命令起动,然后再按编译中的F5进行调试.

dos command:
net start 服务名

另外你可以 attach 你的服务进程进行调试.
weping 2006-05-26
  • 打赏
  • 举报
回复
程序没有出错,如果程序执行了spawnlp(P_WAIT,"novel.exe",NULL); 那我应该可以在任务管理器里看见novel吧?
flyelf 2006-05-26
  • 打赏
  • 举报
回复
你是怎么调试的?
weping 2006-05-26
  • 打赏
  • 举报
回复
求求大家帮帮我吧!

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧