mfc编写windows服务程序StartServiceCtrlDispatcher时1063错误

nicotine86 2011-03-31 10:43:58
之前用控制台写了一个服务程序,然后调用sc注册启动就可以了,现在想集成到一个mfc应用程序里。

就是设置一个按钮,点一个按钮就按照createservice--〉StartServiceCtrlDispatcher——〉startservice的顺序来调用自身这个exe程序!(我感觉就是这里出了错误。。。但是不会解决。。)

问题1:win7系统,debug下运行到createservice之前的openscm就出错了,应该是权限的问题,release之后,右键管理员运行可以通过createservice建立服务成功,在注册表项,控制面板中都有这个服务,手动启动的话会出现错误。所以每次都要这么调试么?这样就没办法下断点了。。。。。

问题2:如之前说的,release之后管理员运行时可以打开scm的,并且创建服务成功,然后再StartServiceCtrlDispatcher这里出错返回,得到错误代码1063,网上查 是连接不上的问题。


如果有叙述不清楚的地方,大侠们请发问,代码太多,实在不行在贴吧。。。。

麻烦各位大侠帮帮忙,谢谢!
...全文
1303 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
citybay 2011-11-15
  • 打赏
  • 举报
回复
我也1063了求救啊!服务倒是可以安装运行了,但是通过双击启动不行
SERVICE_TABLE_ENTRY DispatchTable[]={{TEXT("CityBay"),(LPSERVICE_MAIN_FUNCTION)ServiceMain},{NULL,NULL}};
if(!StartServiceCtrlDispatcher(DispatchTable))
{
printf(" [函数] StartServiceCtrlDispatcher 错误代码 = %d\n",GetLastError());
}
岁月小龙 2011-09-09
  • 打赏
  • 举报
回复
我也碰到1063的错误了,怎么解决啊??
Lactoferrin 2011-04-03
  • 打赏
  • 举报
回复
mfc有个InitInstance,那里可以放启动代码
nicotine86 2011-04-03
  • 打赏
  • 举报
回复
能怎么调整。。。。没说一样
Lactoferrin 2011-04-01
  • 打赏
  • 举报
回复
看我上面的代码,main什么的你可以自己调整
Lactoferrin 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nicotine86 的回复:]

谢谢楼上的解答,创建服务启动服务这些我都做到了,就是之前放在了两个exe中,如你所说的一个包含StartServiceCtrlDispatcher的服务程序,然后另一个用createservice和startservice来启动它,这样做是没问题的。
但是觉得一个小程序要用两个exe很山寨。。。所以想集成到一个exe中,既是说这个程序既要本身来StartServiceCtrlDispatche……
[/Quote]
看我上面的代码,main什么的你可以自己调整
Lactoferrin 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nicotine86 的回复:]

谢谢楼上的解答,创建服务启动服务这些我都做到了,就是之前放在了两个exe中,如你所说的一个包含StartServiceCtrlDispatcher的服务程序,然后另一个用createservice和startservice来启动它,这样做是没问题的。
但是觉得一个小程序要用两个exe很山寨。。。所以想集成到一个exe中,既是说这个程序既要本身来StartServiceCtrlDispatche……
[/Quote]
看我上面的代码,main什么的你可以自己调整
nicotine86 2011-04-01
  • 打赏
  • 举报
回复
谢谢楼上的解答,创建服务启动服务这些我都做到了,就是之前放在了两个exe中,如你所说的一个包含StartServiceCtrlDispatcher的服务程序,然后另一个用createservice和startservice来启动它,这样做是没问题的。
但是觉得一个小程序要用两个exe很山寨。。。所以想集成到一个exe中,既是说这个程序既要本身来StartServiceCtrlDispatcher,也要create和start它,可以吗?如果可以的话需要把服务程序的代码放到什么位置呢?尤其mfc还看不到main函数。。。。
Lactoferrin 2011-04-01
  • 打赏
  • 举报
回复
createservice--〉StartServiceCtrlDispatcher——〉startservice
这显然不对,createservice和startservice是安装服务的程序用的,StartServiceCtrlDispatcher是服务程序用的,尽管你的这两个程序在同一个exe,也不能混在一起

这是个例子

#include<tchar.h>
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include <dos.h>
#include<windows.h>
using namespace std;

HANDLE StopEvent;
DWORD WINAPI HandlerEx(
__in DWORD dwControl,
__in DWORD dwEventType,
__in LPVOID lpEventData,
__in LPVOID lpContext
)
{
switch(dwControl)
{
case SERVICE_CONTROL_STOP:
SetEvent(StopEvent);
case SERVICE_CONTROL_INTERROGATE:
case SERVICE_CONTROL_SHUTDOWN:
return NO_ERROR;
default:return ERROR_CALL_NOT_IMPLEMENTED;
}
}

VOID WINAPI ServiceMain(
__in DWORD dwArgc,
__in LPTSTR *lpszArgv
)
{
SERVICE_STATUS_HANDLE hServiceStatus;static SERVICE_STATUS Status={SERVICE_WIN32_OWN_PROCESS,SERVICE_RUNNING,SERVICE_ACCEPT_STOP,NO_ERROR,0,500};
StopEvent=CreateEventW(0,0,0,0);
hServiceStatus=RegisterServiceCtrlHandlerExW(L"serviceABCDEFG",HandlerEx,0);
SetServiceStatus(hServiceStatus,&Status);
WaitForSingleObject(StopEvent,INFINITE);
Status.dwCheckPoint+=1;
Status.dwCurrentState=SERVICE_STOPPED;
SetServiceStatus(hServiceStatus,&Status);
}

int wmain(int argc, _TCHAR* argv[])
{
int a,b;static wchar_t FileName[1024];SC_HANDLE scm,srv=0;SERVICE_STATUS Status;
SERVICE_TABLE_ENTRYW table={L"serviceABCDEFG",ServiceMain};
if(argc-1)
{
if(!wcscmp(argv[1],L"service"))
{
StartServiceCtrlDispatcherW(&table);

}else if(!wcscmp(argv[1],L"start"))
{
scm=OpenSCManagerW(0,0,5);
if(scm)
{
srv=OpenServiceW(scm,L"serviceABCDEFG",SERVICE_START);
CloseServiceHandle(scm);
}
if(srv)
{
if(StartServiceW(srv,0,0))cout<<"ok"<<endl;else cout<<"failed"<<endl;
CloseServiceHandle(srv);
}else cout<<"failed"<<endl;
}else if(!wcscmp(argv[1],L"stop"))
{
scm=OpenSCManagerW(0,0,5);
if(scm)
{
srv=OpenServiceW(scm,L"serviceABCDEFG",SERVICE_STOP);
CloseServiceHandle(scm);
}
if(srv)
{
ControlService(srv,SERVICE_CONTROL_STOP,&Status);
CloseServiceHandle(srv);
cout<<"ok"<<endl;
}else cout<<"failed"<<endl;
}
}else
{
cout<<"Press any key to install."<<endl;
getch();
*FileName=L'\"';
GetModuleFileNameW(0,FileName+1,768);
wcscat(FileName,L"\" service");
scm=OpenSCManagerW(0,0,3);
if(scm)
{
srv=CreateServiceW(scm,L"serviceABCDEFG",0,SERVICE_START,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,0,FileName,0,0,0,0,0);
CloseServiceHandle(scm);
}
if(srv)
{
CloseServiceHandle(srv);
cout<<"ok"<<endl;
}else cout<<"failed"<<endl;
}
return 0;
}

16,471

社区成员

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

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

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