StartServiceCtrlDispatcher有什么作用,我调用出现错误:服务进程无法连接到服务控制器上

yanjinbin0 2009-05-14 06:10:15
StartServiceCtrlDispatcher解释是:函数负责把程序主线程连接到服务控制管理程序
这个到底是怎么理解的,我可以理解为[运行服务]吗??

但是为什么我调用却提示错误:
服务进程无法连接到服务控制器上 -这是为啥.
...全文
2609 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanjinbin0 2009-05-14
  • 打赏
  • 举报
回复
搞了半天算理解一半了:
StartServiceCtrlDispatcher就是告诉进程现在被系统服务控制程序接管了.接管后服务控制台会发送各种控制消息给你.所以需要你自己处理这些消息.

其实出错是因为我不是在服务里面执行的程序,所以当然连接不了服务控制台了。
后面我把程序放在服务控制台里面运行就完全OK了.
an_bachelor 2009-05-14
  • 打赏
  • 举报
回复
特別是 vista下你很可能被UAC降低了權限
an_bachelor 2009-05-14
  • 打赏
  • 举报
回复
基本上你就可以這麽理解
你檢查下是不是自己的參數或者權限的問題
biweilun 2009-05-14
  • 打赏
  • 举报
回复
在2000/XP等基于NT 的操作系统中,有一个服务管理器,它管理的后台进程被称为 service。

服务是一种应用程序类型,它在后台运行,与 UNIX 后台应用程序类似。服务应用程序通常可以

在本地和通过网络为用户提供一些功能,例如客户端/服务器应用程序、Web 服务器、数据库服

务器以及其他基于服务器的应用程序。

后台服务 程序是在后台悄悄运行的。我们通过将自己的程序登记为服务,可以使自己的程序不出现

在任务管理器中,并且随系统启动而最先运行,随系统关闭而最后停止。



服务控制管理器是一个RPC 服务器,它显露了一组应用编程接口,程序员可以方便的编写程序来配置

服务和控制远程服务器中服务程序。

服务程序通常编写成控制台类型的应用程序,总的来说,一个遵守服务控制管理程序接口要求的程序

包含下面三个函数:

1。服务程序主函数(main):调用系统函数 StartServiceCtrlDispatcher 连接程序主线程到服务控制管理程序。

2。服务入口点函数(ServiceMain):执行服务初始化任务,同时执行多个服务的服务进程有多个服务入口函数。

3。控制服务处理程序函数(Handler):在服务程序收到控制请求时由控制分发线程引用。(此处是Service_Ctrl)。

另外在系统运行此服务之前需要安装登记服务程序:installService 函数。删除服务程序则需要先删除服务安装登记:removeService 函数。



服务类型:

类型
说明

SERVICE_FILE_SYSTEM_DRIVER=2
文件系统驱动服务。

SERVICE_KERNEL_DRIVER=1
驱动服务。

SERVICE_WIN32_OWN_PROCESS=16
独占一个进程的服务。

SERVICE_WIN32_SHARE_PROCESS=32
与其他服务共享一个进程的服务。


新建WIN32控制台程序, 其源文件名为service.cpp 。我用的开发工具是VC++.NET。



1.服务程序主函数

服务控制管理程序启动服务程序后,等待服务程序主函数调用系统函StartServiceCtrlDispatcher。一个SERVICE_WIN32_OWN_PROCESS 类型的服务应该立即调用 StartServiceCtrlDispatcher 函数,可以在服务启动后让服务入口点函数完成初始化工作。对于 SERVICE_WIN32_OWN_PROCESS 类型的服务和程序中所有服务共同的初始化工作可以在主函数中完成,但不要超过30秒。否则必须建立另外的线程完成这些共同的初始化工作,从而保证服务程序主函数能及时地调用 StartServiceCtrlDispatcher 函数。





主函数处理了三中命令行参数:- install,- remove,- debug,分别用于安装,删除和调试服务程序。如果不带参数运行,则认为是服务控制管理出现启动该服务程序。参数不正确则给出提示信息。



StartServiceCtrlDispatcher 函数负责把程序主线程连接到服务控制管理程序。具体描述如下:

BOOL StartServiceCtrlDispatcher(

const LPSERVICE_TABLE_ENTRY lpServiceTable);

lpServiceStartTable 指向 SERVICE_TABLE_ENTRY 结构类型的数组,他包含了调用进程所提供的每个服务的入口函数和字符串名。表中的最后一个元素必须为 NULL,指明入口表结束。SERVICE_TABLE_ENTRY 结构具体描述如下:



typedef struct _SERVICE_TABLE_ENTRY { LPTSTR lpServiceName; LPSERVICE_MAIN_FUNCTION lpServiceProc;

} SERVICE_TABLE_ENTRY, *LPSERVICE_TABLE_ENTRY;



lpServiceName 是一个以 NULL 结尾的字符串,标识服务名。如果是 SERVICE_WIN32_OWN_PROCESS 类型的服务,这个字符串会被忽略。

lpServiceProc 指向服务入口点函数。





//服务程序主函数。

#include "stdafx.h"

#include "Windows.h"

#define SZAPPNAME "serverSample" //服务程序名

#define SZSERVICENAME "serviceSample" //标识服务的内部名



//内部变量

bool bDebugServer=false;

SERVICE_STATUS ssStatus;

SERVICE_STATUS_HANDLE sshStatusHandle;

DWORD dwErr=0;

TCHAR szErr[256];



//下面的函数由程序实现

void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv);

void WINAPI Service_Ctrl(DWORD dwCtrlCode);

void installService();

void removeService();

void debugService(int argc,char** argv);

bool ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwWaitHint);

void AddToMessageLog(LPTSTR lpszMsg);



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

{

SERVICE_TABLE_ENTRY dispatchTable[]=

{

{TEXT(SZSERVICENAME),(LPSERVICE_MAIN_FUNCTION)Service_Main},

{ NULL,NULL}

};

if((argc>1)&&((*argv[1]=='-')||(argv[1]=="/")))

{

if(_stricmp("install",argv[1]+1)==0)

{

installService();

}

else if(_stricmp("remove",argv[1]+1)==0)

{

removeService();

}

else if(_stricmp("debug",argv[1]+1)==0)

{

bDebugServer=true;

debugService(argc,argv);

}

else

{ //如果未能和上面的如何参数匹配,则可能是服务控制管理程序来启动该程序。立即调用

//StartServiceCtrlDispatcher 函数。

printf("%s - install to install the service \n",SZAPPNAME);

printf("%s - remove to remove the service \n",SZAPPNAME);

printf("%s - debug to debug the service \n",SZAPPNAME);

printf("\n StartServiceCtrlDispatcher being called.\n");

printf("This may take several seconds.Please wait.\n");

if(!StartServiceCtrlDispatcher(dispatchTable))

AddToMessageLog(TEXT("StartServiceCtrlDispatcher failed."));

else

AddToMessageLog(TEXT("StartServiceCtrlDispatcher OK."));

}

exit(0);

}

return 0;

}

16,548

社区成员

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

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

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