在vc里,又摸版直接生成Service,new一个atl项目,第三个类型就是Service,
在Vc下调试Service,可以直接用F5运行,它可以以一个console程序运行起来
或者先把Service起来,用msdev -p 进程id,来调试

解决方案 »

  1.   

    我是要在一个已经完成的普通MFC项目中添加代码,以实现Service的功能。你那直接new一个alt项目的方法行不通。
      

  2.   

    unkill(不死鸟) 谢谢你告诉我DEBUG的方法。
      

  3.   

    就我所知,Service其实是一个注册在本地的一个Dcom服务,系统是这个Dcom接口以后,实例化com,
    然后执行其中的代码.你可以debug看看,程序是否能够正确调用这个com接口?
      

  4.   

    服务程序一般都是控制台的很少有界面,其实有界面也可以,关键中的关键是一定要有一个ServiceMain函数,可以先写好程序调式完成后再把程序改造成服务程序,只需要在程序中添加一些代码就可以啦,然后可以使用服务的API把程序添加到服务管理器里。
    下面的是一个简单的RPC服务程序的代码以供参考
    #include "iostream.h"
    #include "stdio.h"
    #include "rpc.h"
    #include "windows.h"
    #include "mathe.h"
    #include "winsvc.h"SERVICE_STATUS servicestatus;
    SERVICE_STATUS_HANDLE servicestatushandle;
    void WINAPI ServiceCtrlHandler(DWORD dwControl);
    void WINAPI ServiceMain(DWORD argc, LPTSTR * argv);void _CRTAPI1 main()
    {

    RPC_STATUS status;
    RPC_BINDING_VECTOR *pBindingVector=NULL;
    UCHAR * pszProtocolSequence=(UCHAR *)"ncacn_ip_tcp";
    WORD wMinCalls=1;
    WORD wMaxCalls=30;
    UCHAR *pszEndPoint=(UCHAR *)"8080";
        WORD fWaitFlag=FALSE;
    // UCHAR * pszEntryName=(UCHAR *)
    SERVICE_TABLE_ENTRY servicetableentry[] =
      {
        { "MyBigService", ServiceMain },
        { NULL, NULL }
      };
      StartServiceCtrlDispatcher(servicetableentry);
    status=RpcServerUseProtseqEp(
                            pszProtocolSequence,
    wMaxCalls,
    pszEndPoint,
    NULL);
    if(status==RPC_S_OK)
    {
    printf("succes create !\n");

    }
      //来注册接口,第一个参数是midl编译器定义的接口id.第二个参数指定使用指针类型的管理器UUID.
    //他和值为null的第三个参数设置服务器,使用默认的管理器和由midl编译的代理残根所产生的入口点矢量。
        status = RpcServerRegisterIf(mathematic_v1_0_s_ifspec,  // interface to register
                                     NULL,   // MgrTypeUuid
                                     NULL);  // MgrEpv; null means use default
        printf("RpcServerRegisterIf returned 0x%x\n", status);
        if (status==RPC_S_OK) 
    {
    printf("register interface success\n");
        }
        status = RpcServerListen(wMinCalls,
                                 wMaxCalls,
                                 fWaitFlag);//最后一个参数是false表示do wait
        printf("RpcServerListen returned: 0x%x\n", status);
        if (status) {
            exit(status);
        }
        //阻止这个服务器在rpc调用到达之前退出
        if (fWaitFlag) {
            printf("Calling RpcMgmtWaitServerListen\n");
            status = RpcMgmtWaitServerListen();  // wait operation
            printf("RpcMgmtWaitServerListen returned: 0x%x\n", status);
            if (status) {
                exit(status);
            }
        }
    }
    /*********************************************************************/
    /*                MIDL allocate and free                             */
    /*********************************************************************/void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
    {
        return(malloc(len));
    }void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
    {
        free(ptr);
    }long add( 
        /* [in] */ long lNum1,
        /* [in] */ long lNum2,
        /* [retval][out] */ long *rNum)
    {
    *rNum=lNum1+lNum2;
    return *rNum;
    }
    double fAdd( 
        /* [in] */ double dNum1,
        /* [in] */ long dNum2,
        /* [retval][out] */ double * dRetNum)
    {
    * dRetNum=dNum1+dNum2;
    return *dRetNum;
    }double minus( 
        /* [in] */ double minus1,
        /* [in] */ double minus2,
        /* [retval][out] */ double  *dRetMinus)
    {
    *dRetMinus=minus1-minus2;
        return *dRetMinus;
    }double mul( 
        /* [in] */ double mul1,
        /* [in] */ double mul2,
        /* [retval][out] */ double  *dRetMul)
    {
    *dRetMul=mul1*mul2;
    return *dRetMul;
    }boolean divide( 
        /* [in] */ double div1,
        /* [in] */ double div2,
        /* [retval][out] */ double  *dRetDiv)
    {
    if(div2==0)
    return FALSE;
    else
    *dRetDiv=div1/div2;
    return TRUE;
    }
    void WINAPI ServiceMain(DWORD argc, LPTSTR * argv)
    {
      int bInitialized = 0;
      servicestatus.dwServiceType = SERVICE_WIN32;
      servicestatus.dwCurrentState = SERVICE_START_PENDING;
      servicestatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
      servicestatus.dwWin32ExitCode = 0;
      servicestatus.dwServiceSpecificExitCode = 0;
      servicestatus.dwCheckPoint = 0;
      servicestatus.dwWaitHint = 0;  servicestatushandle =RegisterServiceCtrlHandler("MyBigService", ServiceCtrlHandler);
      if (servicestatushandle == (SERVICE_STATUS_HANDLE)0)
      {
        return;
      }  
      // Initialize the service
      // ...
      bInitialized = 1;  servicestatus.dwCheckPoint = 0;
      servicestatus.dwWaitHint = 0;
      if (!bInitialized)
      {
        servicestatus.dwCurrentState = SERVICE_STOPPED;
        servicestatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
        servicestatus.dwServiceSpecificExitCode = 1;
      }
      else
      {
        servicestatus.dwCurrentState = SERVICE_RUNNING;
      }
      SetServiceStatus(servicestatushandle, &servicestatus);
      return;
    }
    void WINAPI ServiceCtrlHandler(DWORD dwControl)
    {
      switch (dwControl)
      {
        case SERVICE_CONTROL_PAUSE:
          servicestatus.dwCurrentState = SERVICE_PAUSE_PENDING;
          SetServiceStatus(servicestatushandle, &servicestatus);
          // TODO: add code to pause the service
          // not called in this service
          // ...
          servicestatus.dwCurrentState = SERVICE_PAUSED;
        break;    case SERVICE_CONTROL_CONTINUE:
          servicestatus.dwCurrentState = SERVICE_CONTINUE_PENDING;
          SetServiceStatus(servicestatushandle, &servicestatus);
          // TODO: add code to unpause the service
          // not called in this service
          // ...
          servicestatus.dwCurrentState = SERVICE_RUNNING;
        break;    case SERVICE_CONTROL_STOP:
          servicestatus.dwCurrentState = SERVICE_STOP_PENDING;
          SetServiceStatus(servicestatushandle, &servicestatus);
          // TODO: add code to stop the service
          // ...
          servicestatus.dwCurrentState = SERVICE_STOPPED;
        break;    case SERVICE_CONTROL_SHUTDOWN:
          // TODO: add code for system shutdown
          // ...
        break;    case SERVICE_CONTROL_INTERROGATE:
          // TODO: add code to set the service status
          // ...
          servicestatus.dwCurrentState = SERVICE_RUNNING;
        break;
      }
      SetServiceStatus(servicestatushandle, &servicestatus);
    }
      

  5.   

    TO wyzegg:
    请教你的rpc.h如何写?
      

  6.   

    To: wyzegg(蛋)
     能留下你的Email吗?希望和你交流一下。
    我的[email protected]