c++写的服务,能安装、卸载,但是启动的时候出现错误1067,进程意外终止

gq198718 2012-08-17 10:24:42
#include "StdAfx.h"
//#include "Resource.h"
#include ".\ntservice.h"


DWORD CNTService::dwThreadId;
LPTSTR CNTService::m_lpServiceName; //服务程序内部名称,名字不能有空格
LPTSTR CNTService::m_lpServiceDisplayName; //SERVICE程序在管理器中的显示名称,任意字符
LPTSTR CNTService::m_lpServiceDescription; //服务在管理器中的描述
LPTSTR CNTService::m_lpDependencies; //服务依赖
DWORD CNTService::m_dwServiceType; //服务类别
TCHAR CNTService::m_lpServicePathName[512]; //SERVICE程序的EXE文件路径
CNTService * CNTService::m_pService;
SERVICE_STATUS CNTService::m_ssServiceStatus; //SERVICE程序的状态struct
SERVICE_STATUS_HANDLE CNTService::m_sshServiceStatusHandle; //SERVICE程序状态的HANDLE

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CNTService::CNTService()
{
GetModuleFileName(NULL, m_lpServicePathName, 512); //取当前执行文件路径
m_lpServiceName = _T("HWService"); //服务名称
m_lpServiceDisplayName = _T("HWService"); //显示的名称
m_lpServiceDescription = _T(""); //服务描述
m_lpDependencies = NULL; //服务依赖
m_dwServiceType = SERVICE_WIN32_OWN_PROCESS; //服务类别
m_pService = this;
m_ssServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
m_ssServiceStatus.dwServiceSpecificExitCode = 0;
}

CNTService::~CNTService()
{
}

BOOL CNTService::InstallService()
{
SC_HANDLE schSCManager; //打开SCM用的句柄
SC_HANDLE schService; //建立SERVICE用的句柄

schSCManager = OpenSCManager( //调用打开SERVICE管理器API
NULL, //机器名称,设置NULL为本地机器
NULL, //数据库名称,NULL为缺省数据库
SC_MANAGER_CREATE_SERVICE //或 SC_MANAGER_ALL_ACCESS
);//希望打开的操作权限,详见MSDN

if(schSCManager) // 如果打开SERVICE管理器成功
{
schService = CreateService( //调用建立SERVICE的API
schSCManager, //SERVICE管理器数据库的句柄
m_lpServiceName, //服务名称
m_lpServiceDisplayName, //显示的名称
SERVICE_ALL_ACCESS, //希望得到的运行权限
m_dwServiceType, //SERVICE的类型
SERVICE_AUTO_START, //启动的方式
SERVICE_ERROR_NORMAL, //错误控制类型
m_lpServicePathName, //可执行文件的路径名
NULL, //一组服务装入时的顺序
NULL, //检查人标记
m_lpDependencies, //从属
NULL, //本地USER名
NULL); //密码

if(schService) //如果建立SERVICE成功
{
SERVICE_DESCRIPTION description;
description.lpDescription = m_lpServiceDescription;
ChangeServiceConfig2(schService,SERVICE_CONFIG_DESCRIPTION,&description); //修改描述
CloseServiceHandle(schService); //释放SERVICE句柄,准备退出
}
else
{
CloseServiceHandle(schSCManager); //释放SERVICE管理器句柄
return FALSE; //建立SERVICE失败返回
}
CloseServiceHandle(schSCManager); //释放SERVICE管理器句柄
}
else
{
return FALSE; //打开管理器失败返回
}
return TRUE; //一切正常返回
}

...全文
426 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangshi061 2012-08-17
  • 打赏
  • 举报
回复
那就证明你的运行程序本身有问题,或者是参数没有传对,
你先把那段的命令运行成功再来看,
并不是启动服务代码的问题,
服务的启动就是调用那段命令,
连那段命令都无法运行成功, 更不用说服务调用了。
gq198718 2012-08-17
  • 打赏
  • 举报
回复
执行那个路径的话,提示服务启动失败
gq198718 2012-08-17
  • 打赏
  • 举报
回复
晕,下面没有了啊
jiangshi061 2012-08-17
  • 打赏
  • 举报
回复
可执行文件路径,path to executable,下面的那句话
gq198718 2012-08-17
  • 打赏
  • 举报
回复
你指的是那段文本哦
gq198718 2012-08-17
  • 打赏
  • 举报
回复
我去试试
jiangshi061 2012-08-17
  • 打赏
  • 举报
回复
创建好服务以后,在 services.msc 的服务管理界面,
找到对应服务,右键->属性, 将属性的那段文本拷贝出来,
在 命令行 下面运行, 看能否成功?
gq198718 2012-08-17
  • 打赏
  • 举报
回复
你指的是?
jiangshi061 2012-08-17
  • 打赏
  • 举报
回复
服务属性里面的语句能不能在 cmd 下单独运行成功?
gq198718 2012-08-17
  • 打赏
  • 举报
回复
求指教
gq198718 2012-08-17
  • 打赏
  • 举报
回复
BOOL CNTService::RemoveService(int nWaitSecond)
{
SC_HANDLE schSCManager; //打开SCM用的句柄
SC_HANDLE schService; //建立SERVICE用的句柄
schSCManager = OpenSCManager( //调用打开SERVICE管理器API
NULL, //机器名称,设置NULL为本地机器
NULL, //数据库名称,NULL为缺省数据库
SC_MANAGER_ALL_ACCESS //希望打开的操作权限,详见MSDN
);

if(schSCManager) //如果打开SERVICE管理器成功
{
schService = OpenService( //获取SERVICE控制句柄的API
schSCManager, //SCM管理器句柄
m_lpServiceName, //SERVICE内部名称,控制名称
SERVICE_ALL_ACCESS); //打开的权限,删除就要全部权限
if(schService) //如果获取SERVICE句柄成功
{
if(ControlService(schService, SERVICE_CONTROL_STOP, &m_ssServiceStatus))
{
//直接向SERVICE发STOP命令,如果能够执行到这里,说明SERVICE正运行
//那就需要停止程序执行后才能删除
Sleep(3000); //等3秒使系统有时间执行STOP命令
while(QueryServiceStatus(schService,&m_ssServiceStatus))
{
//循环检查SERVICE状态
if(m_ssServiceStatus.dwCurrentState == SERVICE_STOP_PENDING)
{
if(nWaitSecond == 0)
break;
nWaitSecond--;
//如果SERVICE还正在执行(PENDING)停止任务
Sleep(1000); //那就等1秒钟后再检查SERVICE是否停止OK
}
else
break; //STOP命令处理完毕,跳出循环
}//循环检查SERVICE状态结束
if(m_ssServiceStatus.dwCurrentState != SERVICE_STOPPED)
{
//如果SERVICE接受STOP命令后还没有STOPPED
CloseServiceHandle(schService); //释放SERVICE控制句柄
CloseServiceHandle(schSCManager); //释放SCM管理器句柄
return FALSE; //那就返回FALSE报错,用GetLastError取错误代码
}
}
//删除指令在这里
if(!DeleteService(schService)) //删除这个SERVICE
{
CloseServiceHandle(schService); //释放SERVICE控制句柄
CloseServiceHandle(schSCManager); //释放SCM管理器句柄
return FALSE; //如果删除失败返回
}
else
CloseServiceHandle(schService); //释放SERVICE控制句柄
}
else
{
//取SERVICE句柄不成功
CloseServiceHandle(schSCManager); //释放SCM管理器句柄
return FALSE; //获取SERVICE句柄失败,或没有找到SERVICE名字返回
}
CloseServiceHandle(schSCManager); //释放SCM管理器句柄
}
else
{
//打开管理器不成功
return FALSE; //打开管理器失败返回
}
return TRUE; //正常删除返回
}

LPTSTR CNTService::GetLastErrorText(LPTSTR lpszBuf, DWORD dwSize)
{
DWORD dwRet;
LPTSTR lpszTemp = NULL;
dwRet = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ARGUMENT_ARRAY,
NULL,
GetLastError(),
LANG_NEUTRAL,
(LPTSTR)&lpszTemp,
0,
NULL);
//supplied buffer is not long enough
if(!dwRet||((long)dwSize<(long)dwRet+14))
lpszBuf[0] = TEXT('\0');
else
{
lpszTemp[lstrlen(lpszTemp)-2] = TEXT('\0'); //remove cr and newline character
_stprintf(lpszBuf, TEXT("%s (%ld)"), lpszTemp, GetLastError());
}
if(lpszTemp)
LocalFree((HLOCAL)lpszTemp);
return lpszBuf;
}

BOOL CNTService::StartDispatch()
{
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{m_lpServiceName,ServiceMain},
{NULL, NULL}
};//如果只有一个SERVICE就定义成2,如果有
//二个以上的SERVICE在一个文件里,这个
//表就要定义成3维或更多
m_bService = TRUE;
if(!StartServiceCtrlDispatcher(DispatchTable))
{
DWORD vat = GetLastError();
return FALSE;
}
return TRUE;
}

void WINAPI CNTService::ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
_asm
{
INT 3
}
m_sshServiceStatusHandle =
RegisterServiceCtrlHandler(m_lpServiceName, ServiceHandle);
if(!m_sshServiceStatusHandle)
{
AddToMessageLog(_T("RegisterServiceCtrlHandler Error!"));
return;
}
if(SetSCMStatus(SERVICE_START_PENDING, NO_ERROR,3000))
{
m_pService->dwThreadId = GetCurrentThreadId();
if(m_pService->Initialize())
{
m_pService->Run();
m_pService->UnInitialize();
}
}
SetSCMStatus(SERVICE_STOPPED, NO_ERROR, 0);
}

void WINAPI CNTService::ServiceHandle(DWORD dwControl)
{
switch(dwControl)
{
case SERVICE_CONTROL_STOP:
m_pService->Stop();
SetSCMStatus(SERVICE_STOP_PENDING, NO_ERROR, 3000);
PostThreadMessage(m_pService->dwThreadId, WM_QUIT, 0, 0);
break;
case SERVICE_CONTROL_PAUSE:
m_pService->Pause();
break;
case SERVICE_CONTROL_CONTINUE:
m_pService->Continue();
break;
case SERVICE_CONTROL_INTERROGATE:
break;
default:
break;
}
}

void CNTService::AddToMessageLog(LPCTSTR lpszMsg)
{
TCHAR szMsg[256];
HANDLE hEventSource;
LPCTSTR lpszStrings[2];

if(!m_pService->m_bService)
{
printf("%s",lpszMsg);
return;
}
//Use event logging to log the error.
hEventSource = RegisterEventSource(0, m_lpServiceName);
_stprintf(szMsg, TEXT("\n%s 提示信息: %d"), m_lpServiceDisplayName, GetLastError());
lpszStrings[0] = szMsg;
lpszStrings[1] = lpszMsg;
if(hEventSource != NULL)
{
ReportEvent(hEventSource, // handle of event source
EVENTLOG_INFORMATION_TYPE, //EVENTLOG_SUCCESS, // event type
0, // event category
0, // event ID
NULL, // current user's SID
2, // number of strings in lpszStrings
0, // no bytes of raw data
lpszStrings, // array of error strings
NULL); // no raw data
(VOID)DeregisterEventSource(hEventSource);
}
}

void CNTService::AddToErrorMessageLog(LPCTSTR lpszMsg)
{
TCHAR szMsg[256];
HANDLE hEventSource;
LPCTSTR lpszStrings[2];
if(!m_pService->m_bService)
{
printf("%s",lpszMsg);
return;
}
// Use event logging to log the error.
hEventSource = RegisterEventSource(0, m_lpServiceName);
_stprintf(szMsg, TEXT("\n%s 提示信息: %d"),m_lpServiceDisplayName,GetLastError());
lpszStrings[0] = szMsg;
lpszStrings[1] = lpszMsg;
if(hEventSource != NULL)
{
ReportEvent(hEventSource, // handle of event source
EVENTLOG_ERROR_TYPE, // event type
0, // event category
0, // event ID
NULL, // current user's SID
2, // number of strings in lpszStrings
0, // no bytes of raw data
lpszStrings, // array of error strings
NULL); // no raw data
(VOID)DeregisterEventSource(hEventSource);
}
}

void CNTService::AddToWarningMessageLog(LPCTSTR lpszMsg)
{
TCHAR szMsg[256];
HANDLE hEventSource;
LPCTSTR lpszStrings[2];
if(!m_pService->m_bService)
{
printf("%s",lpszMsg);
return;
}
// Use event logging to log the error.
hEventSource = RegisterEventSource(0, m_lpServiceName);
_stprintf(szMsg, TEXT("\n%s 提示信息: %d"), m_lpServiceDisplayName, GetLastError());
lpszStrings[0] = szMsg;
lpszStrings[1] = lpszMsg;
if(hEventSource != NULL)
{
ReportEvent(hEventSource, // handle of event source
EVENTLOG_WARNING_TYPE, // event type
0, // event category
0, // event ID
NULL, // current user's SID
2, // number of strings in lpszStrings
0, // no bytes of raw data
lpszStrings, // array of error strings
NULL); // no raw data
(VOID)DeregisterEventSource(hEventSource);
}
}


BOOL CNTService::SetSCMStatus(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwWaitHint)
{
static DWORD dwCheckPoint = 1;
BOOL fResult = TRUE;

if(dwCurrentState == SERVICE_START_PENDING)
m_ssServiceStatus.dwControlsAccepted = 0;
else
m_ssServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;

m_ssServiceStatus.dwCurrentState = dwCurrentState;
m_ssServiceStatus.dwWin32ExitCode = dwWin32ExitCode;
m_ssServiceStatus.dwWaitHint = dwWaitHint;

if((dwCurrentState == SERVICE_RUNNING) || (dwCurrentState == SERVICE_STOPPED))
m_ssServiceStatus.dwCheckPoint = 0;
else
m_ssServiceStatus.dwCheckPoint = dwCheckPoint++;
// Report the status of the service to the service control manager.
//
fResult = SetServiceStatus(m_sshServiceStatusHandle, &m_ssServiceStatus);
if(!fResult)
{
AddToMessageLog(TEXT("SetServiceStatus"));
}
return fResult;
}

BOOL CNTService::Initialize()
{
if(!SetSCMStatus(SERVICE_RUNNING, NO_ERROR, 0))
return FALSE;
return TRUE;
}

void CNTService::UnInitialize()
{
}
void CNTService::Stop()
{
}
void CNTService::Pause()
{
}

void CNTService::Continue()
{
}


void CNTService::Run()
{
//在此调用服务的实际程序
//进入消息循环;
MSG msg;
while(GetMessage(&msg,0,0,0))
{
AddToMessageLog(_T("收到消息"));
DispatchMessage(&msg);
}
}
zhangzhengmin 2012-08-17
  • 打赏
  • 举报
回复
没封装的时候 全都可以 一封装就出问题~!
zhangzhengmin 2012-08-17
  • 打赏
  • 举报
回复
我的主程序里是空的~!完全就是个框架~!
gq198718 2012-08-17
  • 打赏
  • 举报
回复
if(!StartServiceCtrlDispatcher(DispatchTable)) 到这里就不行了
RLib 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

启动到一半的时候就会出现提示框 提示框中就是1067错误提示
[/Quote]

所以需要调试服务,在入口下断,单步执行
gq198718 2012-08-17
  • 打赏
  • 举报
回复
是的啊
zhangzhengmin 2012-08-17
  • 打赏
  • 举报
回复
启动到一半的时候就会出现提示框 提示框中就是1067错误提示
RLib 2012-08-17
  • 打赏
  • 举报
回复
你怎么知道起不来?根据你的回复很明显是起来了又死翘翘了
zhangzhengmin 2012-08-17
  • 打赏
  • 举报
回复
我用路径执行是正确的 但就是启动不了~!启动就是1067错误~!
gq198718 2012-08-17
  • 打赏
  • 举报
回复
没有解决啊
加载更多回复(7)

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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