一个设计为service的COM,如何在这个service启动的时候,自动运行COM中的一个方法?
该方法定义在COM的接口中!!在线等待

解决方案 »

  1.   

    一个服务程序内可以包含一个服务或多个服务的执行代码,但是它们都拥有固定的三个部分:服务main函数,服务ServiceMain函数和服务Control Handler函数。 
    服务main函数:服务程序通常是以控制台的方式存在的,所以它们的入口点都是main函数。在服务控制管理器开始一个服务程序时,会等待StartServiceCtrlDispatcher函数的执行。如果服务类型是SERVICE_WIN32_OWN_PROCESS就会立即调用StartServiceCtrlDispatcher函数的执行;如果服务类型是SERVICE_WIN32_SHARE_PROCESS,通常在初始化所有服务之后再调用它。StartServiceCtrlDispatcher函数的参数就是一个SERVICE_TABLE_ENTRY结构,它包含了进程内所有服务的名称和服务入口点。
    服务ServiceMain函数:函数ServiceMain是服务的入口点。在服务控制程序请求一个新的服务启动时,服务控制管理器启动一个服务,并发送一个开始请求到控制调度程序,而后控制调度程序创建一个新线程来执行ServiceMain函数。ServiceMain须执行以下的任务:调用RegisterServiceCtrlHandler函数注册一个HandlerEx函数来向服务发送控制请求信息,返回值是服务状态句柄用来向服务控制管理器传送服务状态。初始化后调用SetServiceStatus函数设置服务状态为SERVICE_RUNNING。最后,就是执行服务所要完成的任务。
    服务Control Handler函数:每个服务都有一个控制句柄HandlerEx函数。它会在服务进程从服务控制程序接收到一个控制请求时被控制调度程序所调用。无论何时在HandlerEx函数被调用时,都要调用SetServiceStatus函数向服务控制管理器报告它当前的状态。在用户关闭系统时,所有的控制句柄都会调用带有SERVICE_ACCEPT_SHUTDOW控制代码的SetServiceStatus函数来接收NSERVICE_CONTROL_SHUTDOWN控制代码。
      

  2.   

    _Module.ServiceMain(dwArgc, lpszArgv);
    之前或者之后添加调用!
      

  3.   

    我知道是在这里调用,我想问的是;
    如何调用?
    难道在这里QueryInterface?
      

  4.   

    需求描述不清楚service中调用一个com对象,这个com对象是service提供的还是外部的?
    如果是外部的,创建一个实例,直接QueryInterface,调用方法就是了
    如果是内部的,那么这个对象需要向外部暴露接口吗?
    如果不需要,那么就简单,new一个c++对象就可以了如果需要,那么外部对此类(注意是类)的调用是在同一个实例上吗?
    如果不是,你在服务启动的时候就调用该com对象的接口方法就没有什么意义,随便你怎么弄都没有影响嘛如果是,那么你可以创建一个single类型的com对象,但这样麻烦,也不容易理解建议这样做:
    一个普通的com对象,提供各种操作接口方法,可以作为一个不可创建的com对象
    这个对象由服务一启动就实例化,在服务中一直保存
    再做一个维护管理性质的普通的com对象,接口提供一个方法,类似GetObject,
    返回给外部程序已经在服务启动时候创建的对象的实例的引用。
    这个对象在GetObject之后随时可以撤销
      

  5.   

    1.在构造函数中调用
    2.做一个全局函数,分别在servicemain那里和接口方法中调用(因为没试过在servicemain直接调用接口方法)
      

  6.   

    从新描述一下:
    我们在创建com的时候,有三种形式可以选择,(1)DLL(2)EXE(3)SERVICE,这个大家都可以明白吧!
    那么,我现在就是创建了一个作为SERVICE的COM,这个大家也可以理解吧!假如说我的COM中有一个对外的接口方法,名字叫作,INSTALLFILE()
    我现在想实现的事就是,在我这个被创建为SERVICE的COM一启动的时候(注意:是这个SERVICE START的时候)COM或者说SERVICE就自动调用上边说的方法INSTALLFILE().这下大家可以理解了吧
      

  7.   

    在ServiceMain函数中调用INSTALLFILE(),
      

  8.   

    如何调用呢?
    象在外边一样,调用queryinterface,然后调用方法吗?