求问windows后台服务程序的问题!

yds3300376yd 2012-05-19 02:00:15
我先说下我的编写思路,各位看看哪有问题。首先分2个工程,一个注册,一个启动。注册的工程是这样的,先是main函数,填充DispTable[],然后startServiceCtrlDispatcher,然后return结束main。接着写ServiceMain函数,先填充SERVICE_STATUS,然后RegisterServiceCtrlHandlerEx注册,里面的ControlHandler在后面写好。然后SetServiceStatus。接着就调用想放在服务里面的代码函数,我命名成ServiceSpecific,里面放只放了一个printf打印一个字符串。
接着是启动的工程,main函数里写把注册工程的服务名字和KEY值写好,用OpenSCManager得到系统SCM句柄,接着createservice创建一个SC_HANDLE,然后startService。 注册的工程编译完成,生成的exe文件,我把绝对路径放在启动工程的一个数组里,在createservice的lpBinaryPathName放进去。在编译启动工程的时候出现内存禁止访问,然后编译就停止了。我调试了以后发现createservice返回的空句柄。不知道是不是因为路径的问题。对服务程序的内部过程还是不太了解,网上的资料也不多,看了几遍也不是很清楚,求各位解答下~~~~
...全文
89 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yds3300376yd 2012-05-20
  • 打赏
  • 举报
回复
哦~~~~~~那我第一次的时候是注册成功了的,在注册表里可以找到,但是为什么在本地服务里面没有呢?
「已注销」 2012-05-20
  • 打赏
  • 举报
回复
而且,你题目里也说错了。你的第一个工程不是用来注册的,而是服务的入口。
「已注销」 2012-05-20
  • 打赏
  • 举报
回复
其实在一个工程里就可以,根据commandline判断,比如,你接受参数install就注册这个服务,参数uninstall就卸载服务。start则启动服务,stop则停止服务。

你看,你要把步骤分清楚,一步步来,不要注册后立刻又启动。因为你再次启动的时候就不需要再注册了。

yds3300376yd 2012-05-19
  • 打赏
  • 举报
回复
这个~~~~又报线程拒绝访问了。貌似注册好了的服务再用CreateService就要出错吧?哪怎么调服务程序呢?
Eleven 2012-05-19
  • 打赏
  • 举报
回复
你调试看看StartService()调用成功?返回TRUE?
yds3300376yd 2012-05-19
  • 打赏
  • 举报
回复
嗯,我刚才调了一下,CreateService已经可以返回有效的句柄了,在注册表里也已经有我的服务了。但是还有个问题,我在本地服务里找不到我的服务,不知道是个什么情况,难道是startservice没有弄好?
Eleven 2012-05-19
  • 打赏
  • 举报
回复
CreateService返回NULL,你调用GetLastError()看看返回值是什么?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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