服务程序DEBUG

whvsyou 2013-03-05 09:20:59
#include "stdafx.h"
#include "resource.h"
#include "DataCenter_i.h"

#include <atlcomcli.h>

#include <stdio.h>

class CDataCenterModule : public ATL::CAtlServiceModuleT< CDataCenterModule, IDS_SERVICENAME >
{
public :
DECLARE_LIBID(LIBID_DataCenterLib)
DECLARE_REGISTRY_APPID_RESOURCEID(IDR_SENSORDATACENTER, "{8AD93DC2-BCBC-432F-B62B-D58B6FBF9D0C}")
HRESULT InitializeSecurity() throw()
{
// TODO : 调用 CoInitializeSecurity 并为服务提供适当的安全设置
// 建议 - PKT 级别的身份验证、
// RPC_C_IMP_LEVEL_IDENTIFY 的模拟级别
// 以及适当的非 null 安全说明符。

return S_OK;
}
HRESULT RegisterAppId(bool bService = false) throw ();
HRESULT PreMessageLoop(int nShowCmd) throw();
HRESULT PostMessageLoop() throw();
//停止服务器运行
void OnStop() throw();
//暂停服务器运行
void OnPause() throw();
//继续运行
void OnContinue() throw();

};
HRESULT CDataCenterModule::RegisterAppId(bool bService ) throw ()
{
HRESULT hr = S_OK;
BOOL res = __super ::RegisterAppId(bService);
if (bService)
{
if (IsInstalled())
{
SC_HANDLE hSCM = ::OpenSCManagerW(NULL, NULL, SERVICE_CHANGE_CONFIG);
SC_HANDLE hService = NULL;
if (hSCM == NULL)
{
hr = ATL::AtlHresultFromLastError();
}
else
{
hService = ::OpenService(hSCM, m_szServiceName, SERVICE_CHANGE_CONFIG);
if (hService != NULL)
{
::ChangeServiceConfig(hService, SERVICE_NO_CHANGE,
SERVICE_AUTO_START,// 修改服务为自动启动
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
m_szServiceName); // 通过修改资源IDS_SERVICENAME 修改服务的显示名字

SERVICE_DESCRIPTION Description;
TCHAR szDescription[1024];
ZeroMemory(szDescription, 1024);
ZeroMemory(&Description, sizeof (SERVICE_DESCRIPTION));
lstrcpy(szDescription, _T("数据中心服务程序" ));
Description.lpDescription = szDescription;
::ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &Description);
::CloseServiceHandle(hService);
}
else
{
hr = ATL::AtlHresultFromLastError();
}
::CloseServiceHandle(hSCM);
}
}
}
return hr;
}

HRESULT CDataCenterModule::PreMessageLoop(int nShowCmd) throw()
{
// 让暂停继续按钮可以使用
m_status.dwControlsAccepted = m_status.dwControlsAccepted | SERVICE_ACCEPT_PAUSE_CONTINUE;

HRESULT hr = __super::PreMessageLoop(nShowCmd);
// 微软Bug
if (hr == S_FALSE)
hr = S_OK;

// 这里添加自己的初始化代码...

if (SUCCEEDED(hr))
{
// 这个状态一定要修改,否则会出现1053错误,
// 这个错误我花了很多时间才搞定
SetServiceStatus(SERVICE_RUNNING);
}

return hr;
}

HRESULT CDataCenterModule::PostMessageLoop() throw()
{
HRESULT hr = __super ::PostMessageLoop();

if (FAILED(hr))
return hr;

// 这里添加自己的清除代码

return hr;
}

void CDataCenterModule::OnStop() throw()
{
__super::OnStop();
SetServiceStatus(SERVICE_STOPPED);
}

void CDataCenterModule::OnPause() throw()
{
__super::OnPause();
SetServiceStatus(SERVICE_PAUSED);
}

void CDataCenterModule::OnContinue() throw()
{
__super::OnContinue();
SetServiceStatus(SERVICE_RUNNING);
}


CDataCenterModule _AtlModule;



//
extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/,
LPTSTR /*lpCmdLine*/, int nShowCmd)
{
return _AtlModule.WinMain(nShowCmd);
}





求助:怎么调试debug才能进入void CDataCenterModule::OnStop() throw()
等函数
...全文
90 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
whvsyou 2013-03-05
  • 打赏
  • 举报
回复
引用 2 楼 ganpengjin1 的回复:
函数前断点,F5,debug call back就可以了
这是个服务程序。。。。怎么才能运行到暂停服务的函数那、、、、在DOS下打指令进不去 服务管理那也不行
漫步者、 2013-03-05
  • 打赏
  • 举报
回复
函数前断点,F5,debug call back就可以了

65,198

社区成员

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

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