本帖最后由 djfemg 于 2011-04-15 15:06:17 编辑

解决方案 »

  1.   

    根据你的描述,在Service中,默认以System权限运行,如果改成本地系统账户,则默认会启动,但是不会以Process进程显示交互程序界面,因为图形界面需要explorer.exe系统进程,交互界面程序需要用户登陆后才会启动,所以如果你的Service是以Process进程打开的话,那么很可能Service被阻塞在Process Start这一步操作上;
    对于windows服务,建议分开处理,更改如下:
    1.windows服务不要设置”本地系统账户”,默认System最高权限即可,不需要在服务里做Process服务启动交互界面
    2.在开始-启动菜单里添加交互界面启动,用户登陆即可启动程序
      

  2.   


    你说的先后问题,我也没有考虑进去,
    因为我测试的时候,正常启动系统后,通过net start 和net stop 调用服务的,
    这个时候explorer.exe已经存在了。目前情况是
    如果不以System权限运行,无论服务停不停止都不会正常使用。
    我觉得关键应该在于释放不释放的问题,怎么解释存在那么多个cmd进程呢
      

  3.   

    1.用日志记录Process调用CMD执行次数,看看是否多次调用了
    2.这个Process和Disponse没有关系,一旦Process启动CMD后,Process则会自动由GC处理回收,不会长期驻留内存,我觉得这个地方可能是你系统出现多个CMD进程的原因,如果你在P.Start后立刻判断交互界面是否启动,这样就会出现重复操作,CMD是一个进程指令,添加一个等待指令我觉得可以解决
    Process p;
                    p.Start();
                    p.WaitForExit();
    WaitForExit将会阻塞服务,直到CMD退出后才会继续执行
      

  4.   


    我代码是:Process p = new Process();
    p.StandardInput.WriteLine(“c:\123.exe”);
    StreamReader reader = p.StandardOutput;//CMD窗口返回的信息
    p.StandardOutput.Close();
    p.StandardError.Close();
    p.Close();
    reader.Close();应该不存在WaitForExit将会阻塞服务吧?已经直接close掉了
      

  5.   


    你提了一下我,我优化了
    Process的调用代码
    之前担心cmd出问题,所以没有添加以下代码
    p.StandardInput.WriteLine("exit");现在添加了,就顺利结束了cmd进程,问题就顺利解决了 谢谢
      

  6.   

    晕,难怪会出现多个CMD了
    Process p = new Process();
                p.StartInfo.FileName = "cmd.exe";
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.CreateNoWindow = true;
                p.Start();
                p.StandardInput.Write("c:\\aaa.exe\r\n");
                p.StandardInput.Write("exit\r\n");
                p.WaitForExit(1000);//等待1秒,让cmd有时间去执行execute指令
      

  7.   

    因为后台执行CMD,很多情况会出现CMD交互的情况,
    例如 copy命令  很多时候要输入 /Y  之类的,
    后台又不知道,目前还没有想到好办法处理。
    究竟强制退出还是等待CMD结束呢
    矛盾。