一个小程序,想注册为标准WIN32服务在后台运行,不知道怎么弄,望高手指点,100分送上!!!

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc/?id=1095
      

  2.   

    这里有一段注册服务的代码,你看看
    BOOL InstallProService(LPSTR lpszPathName)
    {
    CString strMessage , strTitle;
    char szImagePath[MAX_PATH];
    memset(szImagePath, 0, MAX_PATH);
    strcpy(szImagePath, lpszPathName); SC_HANDLE   schService;
    SC_HANDLE   schSCManager;

    schSCManager = OpenSCManager(
    NULL,                   // machine (NULL == local)
    NULL,                   // database (NULL == default)
    SC_MANAGER_ALL_ACCESS   // access required
    );
    if ( schSCManager )
    {
    schService = CreateService(
    schSCManager,              // SCManager database
    REMON_SERVICENAME,  // name of service
    REMON_SERVICEDISPNAME, // name to display
    SERVICE_ALL_ACCESS,         // desired access
    SERVICE_WIN32_OWN_PROCESS,  // service type
    SERVICE_AUTO_START,
    SERVICE_ERROR_NORMAL,       // error control type
    szImagePath,              // service's binary
    NULL,                       // no load ordering group
    NULL,                       // no tag identifier
    _T(""), // dependencies
    NULL,                       // LocalSystem account
    NULL);                      // no password

    if ( schService )
    {
    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
    SetProcessParam(lpszInstallPath);
    }
    else
    {
    CloseServiceHandle(schSCManager);
    AfxMessageBox("Setup failed", MB_OK|MB_ICONERROR);
    return FALSE;
    }
    }
    else
    {
    AfxMessageBox("Setup failed", MB_OK|MB_ICONERROR);
    return FALSE;
    } return TRUE;
    }
      

  3.   


    to howtotell(从何谈起) :你的回帖对我帮助太大了,谢谢!!!!!能告诉我这个你给我看的那个关于服务的程序有所们功能吗?我运行了以后怎么知道它服务了?在Management Console里面看吗?菜鸟有太多的不明白.汗....
      

  4.   

    Creating a Windows NT/Windows 2000 Service http://www.codeguru.com/Cpp/W-P/system/ntservices/article.php/c5701/
      

  5.   

    如何安装一个服务??
    #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;
    }
      

  6.   

    可以从控制面板里面的管理中的服务(service)查看到现在的服务。例子中的服务历程名字是A,你可以选择启动和停止。这个例子什么服务都没有,只是个例子
      

  7.   

    运行了以后在控制面板里面的管理中的服务(service)看不到啊,是不是要重启机器啊?
      

  8.   

    在debug模式下,按F5可以直接启动服务。如果直接运行,需要加参数-install运行服务。关掉用-remove 如开始菜单,选择运行,找到文件,后面加参数 -install
      

  9.   

    我这里有一段简单的注册程序:
             SC_HANDLE scm;
    SC_HANDLE svc; scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

    if (scm!=NULL)
    {
    // Install the driver

    svc = CreateService(scm,
    SZSERVICENAME,//服务内部标示名
    SZAPPNAME,//服务名(即安装后在服务管理器里看到的名字)
                               //这两个可以自己定义
    SERVICE_ALL_ACCESS,
    SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
    SERVICE_AUTO_START,
    SERVICE_ERROR_NORMAL,
    SERVICEPATH,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL);

    if (svc!= NULL)
    CloseServiceHandle(svc);
    CloseServiceHandle(scm);
    另外就是服务程序只能是控制台的吧,进入主程序要首先调用
                       StartServiceCtrlDispatcher();函数
    具体的格式你看看MSDN。
      

  10.   

    需要那么复杂吗?。
    我刚做过一个程序,,也是对话框,,刚做完。。别人说要后台运行,同时在任务栏右下角显示个图标。于是我加了几个消息处理函数。搞定。
    BOOL AddIcon();
    void DisplayMenu();
    NOTIFYICONDATA m_nid;
             afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnIcon( UINT nID, LPARAM lParam );
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnClose();
      

  11.   

    To superhandsome(帅得要崩溃) ,搞错了吧
      

  12.   

    楼上的程序大都是安装和注册服务的,作为服务运行的程序必须符合服务程序的规范,只有bohut(伯虎)的代码是符合服务程序的,但这个代码没有窗口,可以修改其UINT jiankong(LPVOID lParam)的实现,在这个函数里面启动对话框。
      

  13.   

    要简单可以让VC的向导帮你做一个,选择建立新的工程,选择ATL,选择做一个Service就行了
    不过会在注册表里生成一堆“垃圾”(COM注册)Service里现在我还没有成功创建过窗口,所以我做过的Service还没有出过UI的!知道怎么做Service的UI发短消息给我啊!
      

  14.   

    我自己写的Windows后台服务程序,用来实现pcanywhere的监控功能,象一个木马:
    下面是服务程序的整体框架,有个叫CAgent的类我就不贴了,太大了。// Service.cpp : 定义控制台应用程序的入口点。
    //#include "stdafx.h"
    #include "Service.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif#include "Agent.h"
    // 唯一的应用程序对象
    using namespace std;
    SERVICE_STATUS_HANDLE ssh;
    HANDLE hStopEvent;
    HANDLE hThread=NULL;
    DWORD dwThread=0;
    LPCTSTR lpszDisplayName="TCP/IP Service";
    char szBinaryPathName[MAX_PATH];
    LPTSTR lpszServiceName;void  WINAPI  Service_Main(DWORD dwArgc, LPTSTR *lpszArgv);
    bool InstallService(SC_HANDLE& hSCM);
    bool UnInstallService(SC_HANDLE& hSCM);
    void WINAPI Service_Ctrl(DWORD dwCtrlCode);
    void  SetTheServiceStatus(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwCheckPoint,  DWORD dwWaitHint);
    DWORD WINAPI ThreadWork(LPVOID lpParameter);
    bool RemoteInstall(CString& strServer); //远程安装
    bool RemoteUnInstall(CString& strServer); //远程删除int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    byte b='f';
    byte c='F';  KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, memset(szBinaryPathName,0,MAX_PATH);
    ::GetModuleFileName(NULL,szBinaryPathName,MAX_PATH);
    lpszServiceName=argv[0]; if (argc==2)
    {
    SC_HANDLE schSCManager = OpenSCManager( 
    NULL,                    // local machine 
    NULL,                    // ServicesActive database 
    SC_MANAGER_ALL_ACCESS);  // full access rights 
    ::strupr(argv[1]);
    if (strcmp(argv[1],"-INSTALL")==0)
    InstallService(schSCManager);
    else if (strcmp(argv[1],"-UNINSTALL")==0)
    UnInstallService(schSCManager);
    CloseServiceHandle(schSCManager); return 1;
    }
    else if (argc==3)
    {
    ::strupr(argv[1]);
    CString strServer=argv[2];
    if (strcmp(argv[1],"-REMOTEINSTALL")==0)
    RemoteInstall(strServer);
    else if (strcmp(argv[1],"-REMOTEDELETE")==0)
    RemoteUnInstall(strServer);
    return 1;
    } // 初始化 MFC 并在失败时显示错误
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
    // TODO: 更改错误代码以符合您的需要
    _tprintf(_T("致命错误: MFC 初始化失败\n"));
    return 0;
    }

    SERVICE_TABLE_ENTRY ste[] ={{TEXT("FuckService"),(LPSERVICE_MAIN_FUNCTION)Service_Main}, {NULL, NULL}};
    StartServiceCtrlDispatcher(ste);
    return 1;
    }
    bool InstallService(SC_HANDLE& hSCM)
    { SC_HANDLE schService = CreateService( 
            hSCM,              // SCManager database 
            lpszServiceName,              // name of service 
            lpszDisplayName,           // service name to display 
            SERVICE_ALL_ACCESS,        // desired access 
            SERVICE_WIN32_OWN_PROCESS, // service type 
            SERVICE_AUTO_START,      // start type 
            SERVICE_ERROR_NORMAL,      // error control type 
            szBinaryPathName,         // service's binary 
            NULL,                      // no load ordering group 
            NULL,                      // no tag identifier 
            NULL,                      // no dependencies 
            NULL,                      // LocalSystem account 
            NULL);                     // no password 
     
        if (schService == NULL) 
            printf("InstallService ERROR.\n"); 
        else 
            printf("InstallService SUCCESS.\n");  CloseServiceHandle(schService); 
    return true;
    }bool UnInstallService(SC_HANDLE& hSCM)
    {
    SC_HANDLE schService=OpenService(
            hSCM,              // SCManager database 
    lpszServiceName,    // name of service 
    SC_MANAGER_ALL_ACCESS); if (schService==NULL)
    {
    printf("Open Service error.\n");
    return false;
    }
    if (DeleteService(schService)) 
            printf("UnInstallService SUCCESS.\n");
    else
    printf("UnInstallService ERROR.\n"); 
    CloseServiceHandle(schService); 
    return true;
    }// Called by the service control manager after the call to 
    // StartServiceCtrlDispatcher.
    void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv)
    {
    // Register the service ctrl handler.
    ssh = RegisterServiceCtrlHandler(lpszServiceName,(LPHANDLER_FUNCTION)Service_Ctrl);
    // Create the event to signal the service to stop.
    hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //Create Main Thread. AfxSocketInit(); hThread=CreateThread(NULL,0,ThreadWork,NULL,0,&dwThread);
    ::SetThreadPriority(hThread,THREAD_PRIORITY_HIGHEST);
    // The service has started.
    SetTheServiceStatus(SERVICE_RUNNING, 0, 0, 0); WaitForSingleObjectEx(hStopEvent,INFINITE,TRUE); //Kill Thread.
    PostThreadMessage(dwThread,WM_QUIT,0,0);
    if (WaitForSingleObject(hThread,5000)==WAIT_TIMEOUT)
    TerminateThread(hThread,EXIT_SUCCESS);
    CloseHandle(hThread);
    // Close the event handle and the thread handle.
    CloseHandle(hStopEvent);

    // Stop the service.
    SetTheServiceStatus(SERVICE_STOPPED, NO_ERROR, 0, 0);
    }// Handles control signals from the service control manager.
    void WINAPI Service_Ctrl(DWORD dwCtrlCode)
    {
       DWORD dwState = SERVICE_RUNNING;   switch(dwCtrlCode)
       {
          case SERVICE_CONTROL_STOP:
             dwState = SERVICE_STOP_PENDING;
             break;
          case SERVICE_CONTROL_SHUTDOWN:
             dwState = SERVICE_STOP_PENDING;
             break;
          case SERVICE_CONTROL_INTERROGATE:
             break;      default:
             break;
       }
       // Set the status of the service.
       SetTheServiceStatus(dwState, NO_ERROR, 0, 0);   // Tell service_main thread to stop.
       if ((dwCtrlCode == SERVICE_CONTROL_STOP)||(dwCtrlCode == SERVICE_CONTROL_SHUTDOWN))
         SetEvent(hStopEvent);
    }
      

  15.   


    //  Wraps SetServiceStatus.
    void SetTheServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
                             DWORD dwCheckPoint,   DWORD dwWaitHint)
    {
       SERVICE_STATUS ss;  // Current status of the service.   // Disable control requests until the service is started.
       if (dwCurrentState == SERVICE_START_PENDING)
          ss.dwControlsAccepted = 0;
       else
          ss.dwControlsAccepted =SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;
             // Other flags include SERVICE_ACCEPT_PAUSE_CONTINUE
             // and SERVICE_ACCEPT_SHUTDOWN.   // Initialize ss structure.
       ss.dwServiceType             = SERVICE_WIN32_OWN_PROCESS;
       ss.dwServiceSpecificExitCode = 0;
       ss.dwCurrentState            = dwCurrentState;
       ss.dwWin32ExitCode           = dwWin32ExitCode;
       ss.dwCheckPoint              = dwCheckPoint;
       ss.dwWaitHint                = dwWaitHint;   // Send status of the service to the Service Controller.
       SetServiceStatus(ssh, &ss);
    }
    DWORD WINAPI ThreadWork(LPVOID lpParameter)
    {
    CAgent agent;
    agent.Start();
    //FILE* pf=fopen("c:\\log.txt","w+");
    MSG msg;
    while (GetMessage(&msg,NULL,0,0))
    {
    if (msg.lParam==FD_ACCEPT)
    agent.ProcessAccept();
    if ((msg.lParam==FD_CLOSE)||(msg.lParam==658833440))
    agent.ProcessClose();
    if (msg.lParam==FD_READ)
    agent.ProcessRece();
    //char c[100];memset(c,0,100);
    //sprintf(c,"MESSAGE IS :%d\nWPARAM IS :%d\nLPARAM IS :%d\n",msg.hwnd,msg.wParam,msg.lParam);
    //fwrite(c,1,strlen(c),pf);
    }
    //fclose(pf);
    agent.Stop();
    return 1;
    }//远程安装
    bool RemoteInstall(CString& strServer)
    {
    LPTSTR lpszRemoteServiceName="Service.exe";
    LPTSTR lpszRemoteBinaryPathName="C:\\winnt\\system\\Service.exe"; SC_HANDLE hSCM = OpenSCManager( 
    strServer,                    // local machine 
    NULL,                    // ServicesActive database 
    SC_MANAGER_ALL_ACCESS);  // full access rights 
    SC_HANDLE schService = CreateService(
            hSCM,              // SCManager database 
            lpszRemoteServiceName,           // name of service 
            lpszDisplayName,           // service name to display 
            SERVICE_ALL_ACCESS,        // desired access 
            SERVICE_WIN32_OWN_PROCESS, // service type 
            SERVICE_AUTO_START,      // start type 
            SERVICE_ERROR_NORMAL,      // error control type 
            lpszRemoteBinaryPathName,         // service's binary 
            NULL,                      // no load ordering group 
            NULL,                      // no tag identifier 
            NULL,                      // no dependencies 
            NULL,                      // LocalSystem account 
            NULL);                     // no password 
     
        if (schService == NULL) 
            printf("InstallService ERROR.\n"); 
        else 
            printf("InstallService SUCCESS.\n");  CloseServiceHandle(schService);
    CloseServiceHandle(hSCM);
    return true;
    }//远程反安装
    bool RemoteUnInstall(CString& strServer)
    {
    LPTSTR lpszRemoteServiceName="Service.exe";
    LPTSTR lpszRemoteBinaryPathName="C:\\winnt\\system\\Service.exe"; SC_HANDLE hSCM = OpenSCManager( 
    strServer,                    // local machine 
    NULL,                    // ServicesActive database 
    SC_MANAGER_ALL_ACCESS);  // full access rights 
    SC_HANDLE schService=OpenService(
            hSCM,              // SCManager database 
    lpszRemoteServiceName,    // name of service 
    SC_MANAGER_ALL_ACCESS); if (schService==NULL)
    {
    printf("Open Service error.\n");
    return false;
    }
    if (DeleteService(schService)) 
            printf("UnInstallService SUCCESS.\n");
    else
    printf("UnInstallService ERROR.\n");  CloseServiceHandle(schService); 
    CloseServiceHandle(hSCM); return TRUE;
    }
      

  16.   

    做Service的UI:服务的框架代码大同小异,最后真正实现程序功能的代码都是在一个线程,就是楼上的ThreadWork,在这个线程里创建窗口就实现了UI。
    不过怎么用MFC实现我就不知道了,我只知道用WINAPIDWORD WINAPI ThreadWork(LPVOID lpParameter)
    {
    MSG msg;
    HACCEL hAccelTable; // Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_WINAPI, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance); // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow)) 
    {
    return FALSE;
    } hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_WINAPI); // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    } return msg.wParam;
    }用VC向导生成HELLO WORLD的WIN API程序,WinMain里的代码放到上面的线程里就行了。
    不过UI的服务也得遵守一些规则,这个规则不是必须的,但应该知道,因为服务的特性,用户未登陆情况下服务是运行着的,但即使登陆,这个UI界面也是出不来的,除非登陆后在服务里重启这个服务才会有界面出现。因此程序里应该加处理,只运行一个实例,运行时发现已有实例运行,给那个实例发个消息,让其把界面显示出来。因此有UI的服务一般把自己注册为服务后还要把自己设置成自启动,以便用户登陆后能自动显示界面。