收录日期:2021/01/17 14:47:41 时间:2016/05/30 03:26:34 标签:基础类
我有一个console程序,我想让它后台运行,最好类似于windows的服务所管理的那些程序一样,可以设置成自动、手动、禁止。如果有难度,我的程序启动后,能后台运行也可以,最好没有类似于dos的终端界面。
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=194346
#include "stdafx.h"
#include "jiankong.h"
#include "winsvc.h"
#include <atlbase.h> //CRegKey类需要的头文件
#include <Afxtempl.h> //CArray类需要的头文件
#include <tlhelp32.h> //ToolHelp函数需要的头文件
#include "pop3.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;
SERVICE_STATUS_HANDLE ssh;
SC_HANDLE scm,svc;
SERVICE_STATUS ss;
CArray<PROCESSENTRY32,PROCESSENTRY32 &> m_PEArray;
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
void WINAPI Handler(DWORD Opcode);
void InstallService();
UINT jiankong(LPVOID lpvoid);

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
SERVICE_TABLE_ENTRY ste[2];
//线程入口表
ste[0].lpServiceName="jiankong"; //线程名字
ste[0].lpServiceProc=ServiceMain; //线程入口地址
//可以有多个线程,最后一个必须为NULL
ste[1].lpServiceName=NULL;
ste[1].lpServiceProc=NULL;
StartServiceCtrlDispatcher(ste);
InstallService();
}

return nRetCode;
}

//安装并启动服务
void InstallService()
{
LPTSTR lpSysPath=new char[MAX_PATH];
::GetSystemDirectory(lpSysPath,MAX_PATH);
LPCTSTR lpsysfilename;
lpsysfilename=(LPCTSTR)lstrcat(lpSysPath,"\\jiankong.exe");
scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm!=NULL)
svc=CreateService(scm,"jiankong","jiankong",SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,lpsysfilename,NULL,NULL,NULL,NULL,NULL);
if(svc!=NULL)
svc=OpenService(scm,"jiankong",SERVICE_START);
if (svc!=NULL)
{
StartService(svc,0,NULL);
CloseServiceHandle(svc);
}
CloseServiceHandle(scm);
}
//服务的真正入口点函数
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
ss.dwServiceType = SERVICE_WIN32;
ss.dwCurrentState = SERVICE_START_PENDING;
ss.dwControlsAccepted = SERVICE_ACCEPT_STOP| SERVICE_ACCEPT_PAUSE_CONTINUE;
ss.dwServiceSpecificExitCode = 0;
ss.dwWin32ExitCode = 0;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
ssh=RegisterServiceCtrlHandler("jiankong",Handler);
ss.dwCurrentState = SERVICE_RUNNING;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
SetServiceStatus(ssh,&ss);
AfxBeginThread(jiankong,NULL,NULL); //开始一个工作线程实现程序功能
ss.dwCurrentState = SERVICE_RUNNING;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
SetServiceStatus(ssh,&ss);
}
//处理服务要求
void WINAPI Handler(DWORD Opcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_STOP:
ss.dwCurrentState =SERVICE_STOPPED;
SetServiceStatus (ssh,&ss);
break;
case SERVICE_CONTROL_CONTINUE:
ss.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (ssh,&ss);
break;
case SERVICE_CONTROL_PAUSE:
ss.dwCurrentState = SERVICE_PAUSED;
SetServiceStatus (ssh,&ss);
break;
case SERVICE_CONTROL_INTERROGATE:
break;
}
SetServiceStatus (ssh,&ss);
}
//在进程列表中监控邮箱进程的线程函数
UINT jiankong(LPVOID lParam)
{
::Sleep(600000);
if (!AfxSocketInit())
{
AfxMessageBox("error");
return 0;
}
CPop3 m_pop;//用来进行连接的pop3类对象
while(1)
{

if(!m_pop.Connect("10.231.235.244","kaifabu","88888",110))
{
// AfxMessageBox(_T("无法与服务器建立连接!"));
HANDLE hToken; 
TOKEN_PRIVILEGES tkp; 
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1;  // 设置一个权限
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
}
m_pop.Disconnect();
}
return 0;
}
http://www.codeguru.com/Cpp/W-P/system/index.php

====>NT SERVICES
可以把它做成服务放在NT SERVICES里即可
这样就可得到你想要的结果。
你好,你可以参考一下资料:

利用C++编写Windows服务程序的一般框架
http://dev.csdn.net/develop/article/31/31578.shtm
怎样写一个 NT 服务程序
http://dev.csdn.net/develop/article/19/19477.shtm
看看MSDN中的Creating a Simple Win32 Service in C++
一个封装好的C++类,你需要重载相应的函数即个,还讲了如何编写控制面板小程序控制服务,如果用GUI程序与服务通信。

在命令行输入时隐藏输入内容或以*号显示===================急。。。。。 在命令行输入时隐藏输入内容或以*号显示===================非常急 [已处理] 如何删除自己上传的资源? 请教各位大侠一个JAVASCRIPT定义方式 oracle 请教如何把一个数据库里的OLE对象导入到另一个数据库? 大家能介绍下用JAVA开发B/S构架的软件吗? 我模拟singleton的写法初始化的时候怎么传参数啊? 新手求助:这个过程里面的select..能用一个存储过程代替吗 帮忙看看这个MYSQL中文的问题 Struts2 有没有办法直接从数组中获取数据? 菜鸟问题 特地给水哥散分的 ^_^! 如何用BV设计一个以不同颜色表达数据的分布图 .NET就业要求掌握哪些东西啊 关于 成都赛龙 我给人力回复的邮件 限制VC编辑框的输入 三个dropdownlist的问题 用tinyxml读取一个xml的一个element的attribute出现点问题 求助:DirectDraw 贴图 闪烁 用户控件实例化 如何解决“XXX cannot be resolved”这个问题呢? java 公交查询问题询问 请问g.ha99y.com/R.asp?P=IP_Address:Port这个是啥东东? 关于只更新字段中不相同的记录的问题 tplink 无法电信宽带上使用 Struts2的OGNL表达式出问题了。没有被解析啊??谁帮我看看。 单表内的数据行转列的问题 css定位问题,图片没有按照意思定位