小弟已经做了个以服务方式启动程序,但启动时出现“在本地无法启动XXXX服务,错误 1053:服务并示及时响应启动或控制请求。惨!!!请高手指教,谢谢!!!

解决方案 »

  1.   

    #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 objectCWinApp 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;
    }