怎么写一个服务程序? msdn中有个非常简单的例子,名字就叫simplemsdn光盘\Samples\VC98\sdk\winbase\winnt\service 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 只有nt下面才有服务,9x没有的。msdn里有一个详细的例子,搜索service sample就可以找到!! //在服务控制管理器数据库中注册后台服务线程void CmdRegisterService(){ SCHANDLE schService; SCHANDLE schSCManager; TCHAR szPath[512]; //获得后台服务进程执行路径 if(GetModuleFileName(NULL,szPath,512)==0) {tprintf(TEXT(“Unable to install %s - %s\n"), TEXT(“Service Example"), GetLastErrorText(szErr, 256)); return; } //打开服务控制管理器数据库 schSCManager=OpenSCManager( NULL, //本地机器 NULL, //默认数据库 SCMANAGERALLACCESS //访问权限 ); //在此数据库中创建后台服务线程对象 if(schSCManager) { schService=CreateService( schSCManager, //服务控制管理器数据库 TEXT(“ServiceExample"), //后台服务名称 TEXT(“Service Example"),//在服务控制面板中显示的//服务名称 SERVICE_ALL_ACCESS, //访问权限 SERVICE_WIN32_OWN_PROCESS, //服务类型 SERVICE_AUTO_START, //启动类型,随系统自动//加载 SERVICE_ERROR_NORMAL, szPath, NULL, NULL,TEXT(“"),NULL, //本地系统帐号NULL);// 没有口令 //在这里可以创建多个后台服务线程对象,完成不同的//后台任务 if(schService) {tprintf(TEXT(“%s installed.\n"),TEXT(“Service Example")); CloseServiceHandle(schService); } else {tprintf(TEXT(“CreateService failed-%s\n"), GetLastErrorText(szErr, 256)); } CloseServiceHandle(schSCManager); } else tprintf(TEXT(“OpenSCManager failed - %s\n"),GetLastErrorText(szErr,256));}//定义后台服务线程入口表SERVICETABLEENTRY MyServiceTable[]={ { TEXT(“ServiceExample"),//后台服务线程的名称 (LPSERVICEMAINFUNCTION)MyServiceMain//后台服//务线程入口点 }, {NULL, NULL } //标志表的结束};//服务线程入口函数void WINAPI MyServiceMain(DWORD dwArgc, LPTSTR *lpszArgv){ //注册服务控制处理函数sshStatusHandle=RegisterServiceCtrlHandler(TEXT(“ServiceExample"), Servi ceControlHandler); if(!sshStatusHandle)goto cleanup; //服务类型 ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS; //指定的出错代码 ssStatus.dwServiceSpecificExitCode=0; //启动自己定义的后台服务 ServiceStart();cleanup: if(sshStatusHandle)(VOID)ReportStatusToSCMgr(SERVICESTOPPED,dwErr,0); return;}//服务控制处理函数:负责接收和处理服务控制管理器发出的//命令VOID WINAPI ServiceControlHandler(DWORD dwCtrlCode){ switch(dwCtrlCode) { //停止服务之前,应首先向服务控制管理器回送状态信息 case SERVICE_CONTROLSTOP: ReportStatusToSCMgr(SERVICE_STOP_PENDING,NOE RROR, 0); ServiceStop(); return; //更新服务状态 case SERVICE_CONTROL_INTERROGATE: break; default: break; } //向服务控制面板管理器回送状态信息 ReportStatusToSCMgr(ssStatus.dwCurrentState, NOERROR, 0); }//设置当前服务状态并将状态信息回送到服务控制管理器BOOL ReportStatusToSCMgr(DWORD dwCurrentState,DWORDdwWin32ExitCode,WORD dwWaitHint){ static DWORD dwCheckPoint=1; BOOL fResult=TRUE; if(dwCurrentState==SERVICESTARTPENDING) ssStatus.dwControlsAccepted=0; else ssStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP; //设置状态信息 ssStatus.dwCurrentState=dwCurrentState; ssStatus.dwWin32ExitCode=dwWin32ExitCode; ssStatus.dwWaitHint=dwWaitHint; if((dwCurrentState==SERVICE_RUNNING )‖ (dwCurrentState==SERVICE_STOPPED)) ssStatus.dwCheckPoint=0; else ssStatus.dwCheckPoint=dwCheckPoint++; //将状态信息回送到服务控制管理器 if(!(fResult=SetServiceStatus(sshStatusHandle,&ssStatus))){ AddToMessageLog(TEXT(“SetServiceStatus"));//向NT事//件管理器报告出错消息 } return fResult;}//服务进程入口voidCRTAPI1 main(int argc, char **argv){ if((argc>1)&&((*argv[1]==‘-')‖(*argv[1]==‘/')) ) { if(stricmp(“register", argv[1]+1)==0) CmdRegisterService(); //注册后台服务线程对象 else goto dispatch; exit(0); } dispatch: //启动服务控制分配器,建立主线程与服务控制面板的//连接 if(StartServiceCtrlDispatcher(MyServiceTable)) AddToMessageLog(TEXT (“StartServiceCtrlDispatcher success."));}void ServiceStart(){ //向服务控制管理器报告服务正在启动 if(!ReportStatusToSCMgr(SERVICE_START_PENDING, //service stateNOERROR,dwWaitHint))return; //下面是线程的初始化代码(注意:初始化代码执行时间//不应超过设定的nWaitHi nt,否则服务控制管理器会认//为服务线程已经没有响应 //向服务控制管理器报告服务已经启动 if(!ReportStatusToSCMgr(SERVICE_RUNNING, //service stateNOERROR, //exit code0)) //wait hint return;//开始执行服务}//停止后台服务线程void ServiceStop(){ //添加结束服务线程代码} [求助] 关于用C++开发windows Mobile程序的新手问题 急!!!!图像闪烁问题 关于winsock的问题 文件包含的问题 如何写全局钩子截获启动的应用程序及系统的键盘事件,小弟必拱手献上100分已表谢意!! 如果一个线程由于运行完毕而退出,那么由它创建的子线程是不是也会跟着销毁! IWamAdmin/IMSAdminBase 需要link哪个库文件? 如何让视类上的"X"(关闭窗口)失效?高手出招呀! 工具栏贴图 请高手指教,怎样用VC写一个屏幕保护程序?对不起,只能给20分了 有高手吗? 如何在程序中改变菜单的字体大小,不改系统其它程序窗口的菜单字体大小哦!
msdn里有一个详细的例子,搜索service sample就可以找到!!
void CmdRegisterService()
{
SCHANDLE schService;
SCHANDLE schSCManager;
TCHAR szPath[512];
//获得后台服务进程执行路径
if(GetModuleFileName(NULL,szPath,512)==0)
{tprintf(TEXT(“Unable to install %s - %s\n"),
TEXT(“Service Example"), GetLastErrorText(szErr, 256));
return;
}
//打开服务控制管理器数据库
schSCManager=OpenSCManager(
NULL, //本地机器
NULL, //默认数据库
SCMANAGERALLACCESS //访问权限
);
//在此数据库中创建后台服务线程对象
if(schSCManager)
{ schService=CreateService(
schSCManager, //服务控制管理器数据库
TEXT(“ServiceExample"), //后台服务名称
TEXT(“Service Example"),//在服务控制面板中显示的//服务名称
SERVICE_ALL_ACCESS, //访问权限
SERVICE_WIN32_OWN_PROCESS, //服务类型
SERVICE_AUTO_START, //启动类型,随系统自动//加载
SERVICE_ERROR_NORMAL,
szPath,
NULL,
NULL,
TEXT(“"),
NULL, //本地系统帐号
NULL);// 没有口令
//在这里可以创建多个后台服务线程对象,完成不同的
//后台任务
if(schService)
{tprintf(TEXT(“%s installed.\n"),TEXT(“Service Example"));
CloseServiceHandle(schService);
}
else
{tprintf(TEXT(“CreateService failed-%s\n"),
GetLastErrorText(szErr, 256));
}
CloseServiceHandle(schSCManager);
}
else
tprintf(TEXT(“OpenSCManager failed - %s\n"),
GetLastErrorText(szErr,256));
}
//定义后台服务线程入口表
SERVICETABLEENTRY MyServiceTable[]=
{
{
TEXT(“ServiceExample"),//后台服务线程的名称
(LPSERVICEMAINFUNCTION)MyServiceMain//后台服//务线程入口点
},
{NULL, NULL } //标志表的结束
};
//服务线程入口函数
void WINAPI MyServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
//注册服务控制处理函数
sshStatusHandle=RegisterServiceCtrlHandler(TEXT(“ServiceExample"), Servi ceControlHandler);
if(!sshStatusHandle)
goto cleanup;
//服务类型
ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;
//指定的出错代码
ssStatus.dwServiceSpecificExitCode=0;
//启动自己定义的后台服务
ServiceStart();
cleanup:
if(sshStatusHandle)
(VOID)ReportStatusToSCMgr(
SERVICESTOPPED,dwErr,0);
return;
}//服务控制处理函数:负责接收和处理服务控制管理器发出的
//命令
VOID WINAPI ServiceControlHandler(DWORD dwCtrlCode)
{
switch(dwCtrlCode)
{
//停止服务之前,应首先向服务控制管理器回送状态信息
case SERVICE_CONTROLSTOP:
ReportStatusToSCMgr(SERVICE_STOP_PENDING,NOE RROR, 0);
ServiceStop();
return;
//更新服务状态
case SERVICE_CONTROL_INTERROGATE:
break;
default:
break;
}
//向服务控制面板管理器回送状态信息
ReportStatusToSCMgr(ssStatus.dwCurrentState, NOERROR, 0);
}//设置当前服务状态并将状态信息回送到服务控制管理器
BOOL ReportStatusToSCMgr(DWORD dwCurrentState,DWORD
dwWin32ExitCode,WORD dwWaitHint)
{
static DWORD dwCheckPoint=1;
BOOL fResult=TRUE;
if(dwCurrentState==SERVICESTARTPENDING)
ssStatus.dwControlsAccepted=0;
else
ssStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP;
//设置状态信息
ssStatus.dwCurrentState=dwCurrentState;
ssStatus.dwWin32ExitCode=dwWin32ExitCode;
ssStatus.dwWaitHint=dwWaitHint;
if((dwCurrentState==SERVICE_RUNNING )‖
(dwCurrentState==SERVICE_STOPPED))
ssStatus.dwCheckPoint=0;
else
ssStatus.dwCheckPoint=dwCheckPoint++;
//将状态信息回送到服务控制管理器
if(!(fResult=SetServiceStatus(sshStatusHandle,&ssStatus))){
AddToMessageLog(TEXT(“SetServiceStatus"));//向NT事//件管理器报告出错消息
}
return fResult;
}//服务进程入口
voidCRTAPI1 main(int argc, char **argv)
{
if((argc>1)&&((*argv[1]==‘-')‖(*argv[1]==‘/')) )
{
if(stricmp(“register", argv[1]+1)==0)
CmdRegisterService(); //注册后台服务线程对象
else
goto dispatch;
exit(0);
}
dispatch:
//启动服务控制分配器,建立主线程与服务控制面板的
//连接
if(StartServiceCtrlDispatcher(MyServiceTable))
AddToMessageLog(TEXT (“StartServiceCtrlDispatcher success."));
}void ServiceStart()
{
//向服务控制管理器报告服务正在启动
if(!ReportStatusToSCMgr(
SERVICE_START_PENDING, //service state
NOERROR,
dwWaitHint))
return;
//下面是线程的初始化代码(注意:初始化代码执行时间
//不应超过设定的nWaitHi nt,否则服务控制管理器会认
//为服务线程已经没有响应
//向服务控制管理器报告服务已经启动
if(!ReportStatusToSCMgr(
SERVICE_RUNNING, //service state
NOERROR, //exit code
0)) //wait hint
return;
//开始执行服务
}
//停止后台服务线程
void ServiceStop()
{
//添加结束服务线程代码
}