你可以参见
expert.csdn.net/TopicView.asp?id=14803

解决方案 »

  1.   

    www.codeguru.com/system/有剧多的DEMO
    你也可以用ATL写
      

  2.   


    这是一个服务程序的例子。#include "windows.h"
    #include "winsvc.h"void WINAPI ServiceMain(DWORD dwArgc,LPTSTR * lpszArgv);
    void WINAPI Handler(DWORD Opcode);SERVICE_STATUS_HANDLE ssh;
    SERVICE_STATUS ss;int main(int argc,char * argv[])
    {
        SERVICE_TABLE_ENTRY ste[2];
        ste[0].lpServiceName="ServiceDemo";
        ste[0].lpServiceProc=ServiceMain;
        ste[1].lpServiceName=NULL;
        ste[1].lpServiceProc=NULL;
        StartServiceCtrlDispatcher(ste);
        return 0;
    }void WINAPI ServiceMain(DWORD dwArgc,LPTSTR * lpszArgv)
    {
        ssh=RegisterServiceCtrlHandler("ServiceDemo",Handler);
        
        ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
        ss.dwCurrentState=SERVICE_START_PENDING;
        ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
        ss.dwWin32ExitCode=NO_ERROR;
        ss.dwCheckPoint=0;
        ss.dwWaitHint=0;
        
        SetServiceStatus(ssh,&ss);
        //put your coed here
        ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
        ss.dwCurrentState=SERVICE_RUNNING;
        ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
        ss.dwWin32ExitCode=NO_ERROR;
        ss.dwCheckPoint=0;
        ss.dwWaitHint=0;
        
        SetServiceStatus(ssh,&ss);
        //put your coed here
    }void WINAPI Handler(DWORD Opcode)
    {
        switch(Opcode)
        {
        case SERVICE_CONTROL_STOP:
            //put your code here
            ss.dwCurrentState=SERVICE_STOPPED;
            ss.dwWin32ExitCode=0;
            ss.dwCheckPoint=0;
            ss.dwWaitHint=0;
            
            SetServiceStatus(ssh,&ss);
            break;
        case SERVICE_CONTROL_INTERROGATE:
            SetServiceStatus(ssh,&ss);
            break;
        }
    }
    以上是一个完整的服务程序。 
     
    服务程序还需要一个安装程序,将它安装(即OnCreate()函数的处理),启动等操作,下面分别是,服务安装一次后就可以了,就已经添加到注册表中,在控制面板的服务中可以看到的,不需要每次都安装的:OnStart() 
    {
        scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
        if(scm!=NULL)
        {
            scv=::OpenService(scm,"ServiceDemo",SERVICE_ALL_ACCESS);
            if (scv!=NULL)
            {
                ::StartService(scv,0,NULL);
                ::CloseServiceHandle(scv);
            }
            ::CloseServiceHandle(scm);
        }
    }OnCreate() 
    {
        scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
        if (scm!=NULL)
        {
            scv=::CreateService(scm,
            "ServiceDemo",
            "ServiceDemo",
            SERVICE_ALL_ACCESS,
            SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
            SERVICE_AUTO_START,
            SERVICE_ERROR_IGNORE,
            "E:\\VC_DEMO\\ServDemo\\Debug\\ServDemo.exe",
            NULL,NULL,NULL,NULL,NULL);
            if (scv!=NULL)
            {
                ::CloseServiceHandle(scv);
            }
            else
            {
                ::CloseServiceHandle(scm);
            }
        }
    }
    OnDelete() 
    {
        scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
        if (scm!=NULL)
        {
            scv=::OpenService(scm,"ServiceDemo",SERVICE_ALL_ACCESS);
            if (scv!=NULL)
            {
                ::QueryServiceStatus(scv,&ss);
                if (ss.dwCurrentState==SERVICE_RUNNING)
                {
                    ::ControlService(scv,SERVICE_CONTROL_STOP,&ss);
                }
                ::DeleteService(scv);
                ::CloseServiceHandle(scv);
            }
            ::CloseServiceHandle(scm);
        }
    }OnStop() 
    {
        scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
        if(scm!=NULL)
        {
            scv=::OpenService(scm,"ServiceDemo",SERVICE_STOP|SERVICE_QUERY_STATUS);
            if (scv!=NULL)
            {
                ::QueryServiceStatus(scv,&ss);
                if (ss.dwCurrentState==SERVICE_RUNNING)
                {
                    ::ControlService(scv,SERVICE_CONTROL_STOP,&ss);
                }
                ::CloseServiceHandle(scv);
            }
            ::CloseServiceHandle(scm);
        }
    }
     
      

  3.   

    1.服务:
        服务是一个可执行文件,注册在系统注册表中,WINNT启动时,如果服务设置为自动启动,则NT会自动启动该服务。2.安装程序
        但是服务写好后,第一次需要安装到系统中,即添加到注册表中,这样才会在控制面板的“服务”窗口中出现,当然不用直接写注册表,因为系统已经提供了API。所以这样就还需要一个安装程序,当然只需要安装一次就行了。在不再需要的时候也可以将服务卸除,这也需要通过API实现。反正就是需要实现上面两个功能,当然,也可以做在一起,在第一次运行改程序时将自己注册。但从概念是应该有两个程序。