对于一个自己编写的 windows 服务 ,是不是一个服务只能控制一个应用程序的运行?如果想通过一个服务来控制多个exe的运行是否可行?所谓的控制必须包含下面3点:
1.可以开始exe,可以结束exe
2.可以在服务运行时间内控制运行1.exe 同时停止运行2.exe
3.可以给服务发送类似索引的消息,以告诉服务当前想要操作的哪个exe以上3点可行吗?跪求达人告知!

解决方案 »

  1.   

    1,2没啥大问题,3需要进程间发消息,没做过喳喳MSDN把你又跪。。
      

  2.   

    to1.可以开始exe,可以结束exe
    2.可以在服务运行时间内控制运行1.exe 同时停止运行2.exe可以,通过Process.Start来运行和控制,
    如果是窗体程序,需要把服务的允许桌面交互选项打开。to 3.可以给服务发送类似索引的消息,以告诉服务当前想要操作的哪个exe可以通过MessageQueue来完成,你可以参看msdn提供的例子。
      

  3.   

    哦以前做过键盘钩子,好像是可以用sendmessage直接发消息给一个进程
      

  4.   

    to : Knight94(愚翁) 
    ================================
    2.可以在服务运行时间内控制运行1.exe 同时停止运行2.exe
    可以,通过Process.Start来运行和控制
    ================================
    是通过组件里面的 Process 控件吗?==================================================================
    to 3.可以给服务发送类似索引的消息,以告诉服务当前想要操作的哪个exe
    可以通过MessageQueue来完成,你可以参看msdn提供的例子。
    ==================================================================
    能给个链接吗?我没找到使用MessageQueue例子。
      

  5.   

    to 是通过组件里面的 Process 控件吗?不是组件,查看msdn中process这个类。to 能给个链接吗?我没找到使用MessageQueue例子。参看msdn的MessageQueue例子
    ms-help://MS.VSCC.2003/MS.MSDNQTR.2003APR.1033/cpref/html/frlrfSystemMessagingMessageQueueClassTopic.htm
      

  6.   

    奇怪:我在onstart事件里面写了      
       Dim myProcess As New Process
       myProcess.Start("E:\1.exe")
    启动服务后并没有运行起来1.exe然后在.NET IDE 里面的setup项目里面直接选“卸载” 然后重新安装的时候提示“指定的服务已标记为删除。” 打开服务管理器 看见里面我的服务程序“已禁用”,安装目录下的exe也没了。结果这个服务怎么卸载都卸载不了了。 晕
      

  7.   

    把exe copy到原来安装的目录,再installutil -u exefile
      

  8.   

    to 我在onstart事件里面写了
    Dim myProcess As New Process
    myProcess.Start("E:\1.exe")
    启动服务后并没有运行起来1.exe在任务管理器中查看,是否有1.exe进程。
      

  9.   

    卸载的问题解决了 。原来要重启下  倒死to:在任务管理器中查看,是否有1.exe进程。
    我当时启动服务后立即查看了 人物管理器 确实每发现1.exe 并且E:\1.exe确实是存在的一个可执行程序
      

  10.   

    极度 sorry to Knight94(愚翁) !!!!!再次查看了任务管理器,里面有1.exe。
     但是是个窗口程序,不知为啥没有显示出窗口来sorry 开头心急没找到
      

  11.   

    我现在把 myProcess 定义为 Class MyNewService 内的公共变量在onstart事件里面设置了:
            myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal
    然后        myProcess.Start("E:\1.exe")在onstop事件里面写了
           myProcess.Close()表现出的情况是 服务启动的时候 1.exe运行了 但是没有窗口 
    服务关闭的时候 1.exe 没有关闭掉 应该怎么做?
      

  12.   

    呃请问那个怎么打开还有,怎么关闭process 
      

  13.   

    to 呃请问那个怎么打开查看服务的属性,进行设置。to 还有,怎么关闭process Sample code as follows:
    Process prc = Process.Start( yourFile );
    prc.Kill();//Close process
      

  14.   

    to:查看服务的属性,进行设置。
    这一项可以在创建服务的时候直接在代码里面设置好么?to:prc.Kill();//Close process
    我尝试过用kill 。结果关闭速度很慢很慢,最后报超时。是不是因为我没有打开“允许桌面交互”这个选项的原因?
      

  15.   

    郁闷了 用prc.Kill 始终是没有响应 。然后就标记为已停止,而且无法再启动
      

  16.   

    允许桌面交互?2.0中有这选项吗。
    1.1中很痛苦,要调用API才能实现。
      

  17.   

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Service1]
    "Type"=dword:00000110
      

  18.   

    另外,很奇怪的。我用process.kill 方法 始终没有办法关闭process.start 打开的进程。始终都是30秒超时后服务被停止,并且不可再次启动。到底哪里错了?
      

  19.   

    大致例子如下:
    /// <summary>
    /// Set things in motion so your service can do its work.
    /// </summary>
    protected override void OnStart(string[] args)
    {
    // TODO: Add code here to start your service. //mySubThread.Start();

    Thread thd = new Thread( new ThreadStart( ThreadFun ) );
    thd.Start();
    }private void ThreadFun()
    {
    Process prc = Process.Start( "Notepad.exe" );
    Thread.Sleep( 2000 ); if( !prc.HasExited )
    prc.Kill();
    }ps:只要把服务的允许桌面交互打开即可。
      

  20.   

    十分感谢 Knight94(愚翁) !现在的问题是:
     Process prc = Process.Start( "Notepad.exe" );
    Thread.Sleep( 2000 ); if( !prc.HasExited )
    prc.Kill();
    这样是可以关闭打开的进程,但是我要求的关闭是“在想关闭的时候才关闭”。也就是说,不是靠几秒种的sleep能决定的进程生存时间。我试过在 service 代码里面定义了一个全局变量,用来保存Process prc 的ProcessID 。
    可是在 onstop 事件触发的时候GetProcessById(ProcessID)得不到正确的ProcessID 值。
    这是为什么?此外,就我说的目的,有解决方法吗?=============================================================================
    先把帖子加分
      

  21.   

    我的目的简单来说就是:通过开启一个服务来开启若干个exe 。
    通过控制该服务的暂停、停止等动作,来控制每个或者某几个exe的关闭、重新运行等动作。我的想法,是在服务代码中保存开启exe时系统产生的对应每个exe的process的唯一标志ID,以用作后继关闭。
    现在的问题是,似乎这些ID在 服务ONStart的时候产生了,但是在AfterStart后就消失了。无法保存下来。