VC++ 编写一个windows服务

大_爱 2011-12-05 01:34:41
就是开机自启动的那种服务,这个服务启动一个ServerSocket(服务器端的Socket),这个如何做呀,刚从java转过来,希望大家帮帮忙,有这种例子程序更好,有资源的地方也帮我说说啦,我在网上搜索到的东西有点看不懂写不出来代码的。希望大家能给一个示例代码,不甚感谢!只能给这么多分了,如果好的话,我在加了
...全文
746 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
大_爱 2011-12-06
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 gaomingok 的回复:]

用vc6向导

File主菜单中选择New,然后选Projects中的ATL COM AppWizard,输入一个项目名,选择了所在目录后,点OK按钮,在出现的对话框中选择Service[EXE],点Finish即可。
[/Quote]

这个貌似是创建一个服务了。不过向服务中添加其他应用程序呀?
gaomingok 2011-12-06
  • 打赏
  • 举报
回复
用vc6向导

  File主菜单中选择New,然后选Projects中的ATL COM AppWizard,输入一个项目名,选择了所在目录后,点OK按钮,在出现的对话框中选择Service[EXE],点Finish即可。
大_爱 2011-12-06
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 dahuaixiaohuai 的回复:]

如果要运行一个服务,不需要传入可执行文件的路径,只需要传入服务名,
比如:将D:\test\test.ext程序安装为一个服务,服务名为 “测试服务”
启动服务时只需执行StartupService("测试服务");就可以了。
[/Quote]

没有明白你的意思,你这个程序是将普通的可运行程序做成服务么?还是直接写一些逻辑代码在这个服务本身中啦。
还有,你用的什么开发工具呀,我把代码复制到VS 2010中有错的。

大_爱 2011-12-06
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 zhao4zhong1 的回复:]

进程假死时kill掉再重启即可
服务假死时有时kill不了,等好不容易kill掉了,又重启不了。

服务唯一的好处是切换用户时可以保持运行。
[/Quote]

写了关闭服务的程序了!
一叶之舟 2011-12-06
  • 打赏
  • 举报
回复
如果要运行一个服务,不需要传入可执行文件的路径,只需要传入服务名,
比如:将D:\test\test.ext程序安装为一个服务,服务名为 “测试服务”
启动服务时只需执行StartupService("测试服务");就可以了。
赵4老师 2011-12-06
  • 打赏
  • 举报
回复
进程假死时kill掉再重启即可
服务假死时有时kill不了,等好不容易kill掉了,又重启不了。

服务唯一的好处是切换用户时可以保持运行。
大_爱 2011-12-06
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 dahuaixiaohuai 的回复:]

/*****************************************************************
** 函数名称: BOOL InstatllService(char *szServiceName,char *szServiceParamName)
**
** 功能描述: 安装服务
**
** 入 参: szServiceName 服务名称 s……
[/Quote]

谢谢!先一直没明白的。
大_爱 2011-12-06
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 zhao4zhong1 的回复:]

再唠叨一句:
个人经验:编写一个服务不如编写一个隐藏窗口的普通程序好维护、好调试。
[/Quote]

项目需求而已,再说,这个服务也很简单的。
一叶之舟 2011-12-06
  • 打赏
  • 举报
回复
/*****************************************************************
** 函数名称: BOOL InstatllService(char *szServiceName,char *szServiceParamName)
**
** 功能描述: 安装服务
**
** 入 参: szServiceName 服务名称 szServiceParamName 服务程序名称
**
** 出 参: 无
**
** 返 回 值: BOOL TRUE成功 FALSE失败
*****************************************************************/
BOOL CServiceManage::InstatllService(char *szServiceName,char *szServiceParamName)
{
if (ServiceIsInstalled(szServiceName))
return TRUE;

TCHAR szFilePath[_MAX_PATH];
::GetModuleFileName(NULL, szFilePath, _MAX_PATH);

//(_tcsrchr(szFilePath, '\\'))[1] = 0;
_tcscat(szFilePath, szServiceParamName);

ShellExecute(NULL, "open", szFilePath, "/Service", NULL, SW_HIDE);
return TRUE;
}

/*****************************************************************
** 函数名称: BOOL UninstallService(char *szServiceName,char *szServiceParamName)
**
** 功能描述: 卸载服务
**
** 入 参: szServiceName 服务名称 szServiceParamName 服务程序名称
**
** 出 参: 无
**
** 返 回 值: BOOL TRUE成功 FALSE失败
*****************************************************************/
BOOL CServiceManage::UninstallService(char *szServiceName,char *szServiceParamName)
{
if (!ServiceIsInstalled(szServiceName))
return TRUE;

TCHAR szFilePath[_MAX_PATH];
//::GetModuleFileName(NULL, szFilePath, _MAX_PATH);

//(_tcsrchr(szFilePath, '\\'))[1] = 0;
_tcscat(szFilePath, szServiceParamName);

ShellExecute(NULL, "open", szFilePath, "/UnregServer", NULL, SW_HIDE);
return TRUE;
}
这两个函数中
//::GetModuleFileName(NULL, szFilePath, _MAX_PATH);
//(_tcsrchr(szFilePath, '\\'))[1] = 0;
这两行代码不要了,

例子代码:
#include "ServiceManage.h"
int main(int argc, char* argv[])
{
CServiceManage manager;
//安装服务
manager.InstatllService("D:\\GameAd.exe","服务1");

//启动服务
manager.StartupService("服务1");

//停止服务
manager.StopService("服务1");

//卸载服务
manager.UninstallService("D:\\GameAd.exe","服务1");
return 0;
}
赵4老师 2011-12-06
  • 打赏
  • 举报
回复
再唠叨一句:
个人经验:编写一个服务不如编写一个隐藏窗口的普通程序好维护、好调试。
大_爱 2011-12-06
  • 打赏
  • 举报
回复
没人来了
大_爱 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 beefcattlexiaoyang 的回复:]

引用 16 楼 dahuaixiaohuai 的回复:

BOOL CServiceManage::StartupService(char *szServiceName)
{
if (!ServiceIsInstalled(szServiceName))
return FALSE;

SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if (hSCM == NULL)
{
MessageBox(NULL,"Couldn't open service manager", szServiceName, MB_OK);
return FALSE;
}

SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_ALL_ACCESS);

if (hService == NULL)
{
::CloseServiceHandle(hSCM);
MessageBox(NULL,"Couldn't open service", szServiceName, MB_OK);
return FALSE;
}

SERVICE_STATUS status;
if (!::QueryServiceStatus(hService, &status))
{
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
MessageBox(NULL,"Couldn't Query Service Status", szServiceName, MB_OK);
return FALSE;
}

if (status.dwCurrentState == SERVICE_STOPPED)
{
if (!::StartService(hService, NULL, NULL))
{
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
MessageBox(NULL,"Couldn't Startup Service", szServiceName, MB_OK);
return FALSE;
}
}

::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
return TRUE;
}
[/Quote]

假设我要运行某个程序,是调用这个方法,传入可执行文件的路径就可以了么?
大_爱 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 dahuaixiaohuai 的回复:]

写了一个类,看能用的话就用C/C++ code

#include <windows.h>
#include "tchar.h"
class CServiceManage
{
typedef enum {NOINSTALL, RUNNING, STOPPED,OperateFail=-1};
public:
CServiceManage();
virtual ~CS……
[/Quote]

谢谢!我看看!
大_爱 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zhao4zhong1 的回复:]

个人经验:编写一个服务不如编写一个隐藏窗口的普通程序好维护、好调试。
[/Quote]

这个得看实际情况的!
cplusplux 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 dahuaixiaohuai 的回复:]
写了一个类,看能用的话就用

C/C++ code

#include <windows.h>
#include "tchar.h"
class CServiceManage
{
typedef enum {NOINSTALL, RUNNING, STOPPED,OperateFail=-1};
public:
CServiceManage();
……
[/Quote]
好代码
cplusplux 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 dahuaixiaohuai 的回复:]
写了一个类,看能用的话就用

C/C++ code

#include <windows.h>
#include "tchar.h"
class CServiceManage
{
typedef enum {NOINSTALL, RUNNING, STOPPED,OperateFail=-1};
public:
CServiceManage();
……
[/Quote]
好代码
一叶之舟 2011-12-05
  • 打赏
  • 举报
回复
写了一个类,看能用的话就用

#include <windows.h>
#include "tchar.h"
class CServiceManage
{
typedef enum {NOINSTALL, RUNNING, STOPPED,OperateFail=-1};
public:
CServiceManage();
virtual ~CServiceManage();
public:
//安装服务
BOOL InstatllService(char *szServiceName,char *szServiceParamName);

//卸载服务
BOOL UninstallService(char *szServiceName,char *szServiceParamName);

//启动服务
BOOL StartupService(char *szServiceName);

//停止服务
BOOL StopService(char *szServiceName);

//获取服务当前状态
DWORD GetServiceState(char *szServiceName);

//判断服务是否安装
BOOL ServiceIsInstalled(char *szServiceName);
};

//CPP文件
#include "stdafx.h"
#include "ServiceManage.h"

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

CServiceManage::CServiceManage()
{

}

CServiceManage::~CServiceManage()
{

}

/*****************************************************************
** 函数名称: BOOL InstatllService(char *szServiceName,char *szServiceParamName)
**
** 功能描述: 安装服务
**
** 入 参: szServiceName 服务名称 szServiceParamName 服务程序名称
**
** 出 参: 无
**
** 返 回 值: BOOL TRUE成功 FALSE失败
*****************************************************************/
BOOL CServiceManage::InstatllService(char *szServiceName,char *szServiceParamName)
{
if (ServiceIsInstalled(szServiceName))
return TRUE;

TCHAR szFilePath[_MAX_PATH];
::GetModuleFileName(NULL, szFilePath, _MAX_PATH);

(_tcsrchr(szFilePath, '\\'))[1] = 0;
_tcscat(szFilePath, szServiceParamName);

ShellExecute(NULL, "open", szFilePath, "/Service", NULL, SW_HIDE);
return TRUE;
}

/*****************************************************************
** 函数名称: BOOL UninstallService(char *szServiceName,char *szServiceParamName)
**
** 功能描述: 卸载服务
**
** 入 参: szServiceName 服务名称 szServiceParamName 服务程序名称
**
** 出 参: 无
**
** 返 回 值: BOOL TRUE成功 FALSE失败
*****************************************************************/
BOOL CServiceManage::UninstallService(char *szServiceName,char *szServiceParamName)
{
if (!ServiceIsInstalled(szServiceName))
return TRUE;

TCHAR szFilePath[_MAX_PATH];
::GetModuleFileName(NULL, szFilePath, _MAX_PATH);

(_tcsrchr(szFilePath, '\\'))[1] = 0;
_tcscat(szFilePath, szServiceParamName);

ShellExecute(NULL, "open", szFilePath, "/UnregServer", NULL, SW_HIDE);
return TRUE;
}

/*****************************************************************
** 函数名称: BOOL StartupService(char *szServiceName)
**
** 功能描述: 启动服务
**
** 入 参: szServiceName 服务名称
**
** 出 参: 无
**
** 返 回 值: BOOL TRUE成功 FALSE失败
*****************************************************************/
BOOL CServiceManage::StartupService(char *szServiceName)
{
if (!ServiceIsInstalled(szServiceName))
return FALSE;

SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if (hSCM == NULL)
{
MessageBox(NULL,"Couldn't open service manager", szServiceName, MB_OK);
return FALSE;
}

SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_ALL_ACCESS);

if (hService == NULL)
{
::CloseServiceHandle(hSCM);
MessageBox(NULL,"Couldn't open service", szServiceName, MB_OK);
return FALSE;
}

SERVICE_STATUS status;
if (!::QueryServiceStatus(hService, &status))
{
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
MessageBox(NULL,"Couldn't Query Service Status", szServiceName, MB_OK);
return FALSE;
}

if (status.dwCurrentState == SERVICE_STOPPED)
{
if (!::StartService(hService, NULL, NULL))
{
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
MessageBox(NULL,"Couldn't Startup Service", szServiceName, MB_OK);
return FALSE;
}
}

::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
return TRUE;
}

/*****************************************************************
** 函数名称: BOOL StopService(char *szServiceName)
**
** 功能描述: 停止服务
**
** 入 参: szServiceName 服务名称
**
** 出 参: 无
**
** 返 回 值: BOOL TRUE成功 FALSE失败
*****************************************************************/
BOOL CServiceManage::StopService(char *szServiceName)
{
if (!ServiceIsInstalled(szServiceName))
return FALSE;

SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if (hSCM == NULL)
{
MessageBox(NULL,"Couldn't open service manager", szServiceName, MB_OK);
return FALSE;
}

SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_ALL_ACCESS);

if (hService == NULL)
{
::CloseServiceHandle(hSCM);
MessageBox(NULL,"Couldn't open service", szServiceName, MB_OK);
return FALSE;
}

SERVICE_STATUS status;
if (!::QueryServiceStatus(hService, &status))
{
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
MessageBox(NULL,"Couldn't Query Service Status", szServiceName, MB_OK);
return FALSE;
}

if (status.dwCurrentState != SERVICE_STOPPED)
{
if (!::ControlService(hService, SERVICE_CONTROL_STOP, &status))
{
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
MessageBox(NULL,"Couldn't Stop Service", szServiceName, MB_OK);
return FALSE;
}
}

::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
return TRUE;
}

/*****************************************************************
** 函数名称: DWORD GetServiceState(char *szServiceName)
**
** 功能描述: 获取服务当前状态
**
** 入 参: szServiceName 服务名称
**
** 出 参: 无
**
** 返 回 值: DWORD 服务状态
*****************************************************************/
DWORD CServiceManage::GetServiceState(char *szServiceName)
{
if (!ServiceIsInstalled(szServiceName))
return NOINSTALL;

SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if (hSCM == NULL)
{
MessageBox(NULL,"Couldn't open service manager", szServiceName, MB_OK);
return OperateFail;
}

SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_ALL_ACCESS);

if (hService == NULL)
{
::CloseServiceHandle(hSCM);
MessageBox(NULL,"Couldn't open service", szServiceName, MB_OK);
return OperateFail;
}

SERVICE_STATUS status;
if (!::QueryServiceStatus(hService, &status))
{
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
MessageBox(NULL,"Couldn't Query Service Status", szServiceName, MB_OK);
return OperateFail;
}

::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);

switch(status.dwCurrentState)
{
case SERVICE_RUNNING:
return RUNNING;
case SERVICE_STOPPED:
return STOPPED;
default:
return OperateFail;
}
return RUNNING;
}


/*****************************************************************
** 函数名称: BOOL ServiceIsInstalled(char *szServiceName)
**
** 功能描述: 判断服务是否安装
**
** 入 参: szServiceName 服务名称
**
** 出 参: 无
**
** 返 回 值: BOOL TRUE成功 FALSE失败
*****************************************************************/
BOOL CServiceManage::ServiceIsInstalled(char *szServiceName)
{
BOOL bResult = FALSE;
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if (hSCM != NULL)
{
SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG);
if (hService != NULL)
{
bResult = TRUE;
::CloseServiceHandle(hService);
}
::CloseServiceHandle(hSCM);
}
return bResult;
}
一叶之舟 2011-12-05
  • 打赏
  • 举报
回复
各有各的好处吧。
赵4老师 2011-12-05
  • 打赏
  • 举报
回复
个人经验:编写一个服务不如编写一个隐藏窗口的普通程序好维护、好调试。
一叶之舟 2011-12-05
  • 打赏
  • 举报
回复
先判断一下是否安装了这个服务
加载更多回复(12)

65,210

社区成员

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

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