zoukankan      html  css  js  c++  java
  • delphi 启动停止windows服务 转

    http://blog.csdn.net/haiou327/article/details/6106233

    不用cmd用delphi如何实现启动停止windows服务
    建议参考一下Delphi的ScktSrvr原码,   
      $(DELPHI)/Source/Vcl/ScktSrvr.dpr  


    --------------------------------------------------------------------------------
    windows 系统服务
    --------------------------------------------------------------------------------

    function StartService(AServName: string): Boolean; //use WinSvc
    var
      SCManager, hService: SC_HANDLE;
      lpServiceArgVectors: PChar;
    begin
      SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
      Result := SCManager <> 0;
      if Result then
      try
        hService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS);
        Result := hService <> 0;
        if (hService = 0) and (GetLastError = ERROR_SERVICE_DOES_NOT_EXIST) then
          Exception.Create('The specified service does not exist');
        if hService <> 0 then
        try
          lpServiceArgVectors := nil;
          Result := WinSvc.StartService(hService, 0, PChar(lpServiceArgVectors));
          if not Result and (GetLastError = ERROR_SERVICE_ALREADY_RUNNING) then
            Result := True;
        finally
          CloseServiceHandle(hService);
        end;
      finally
        CloseServiceHandle(SCManager);
      end;
    end;
    
    
    function StopService(AServName: string): Boolean;
    var
      SCManager, hService: SC_HANDLE;
      SvcStatus: TServiceStatus;
    begin
      SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
      Result := SCManager <> 0;
      if Result then
      try
        hService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS);
        Result := hService <> 0;
        if Result then
        try  //停止并卸载服务;
          Result := ControlService(hService, SERVICE_CONTROL_STOP, SvcStatus);
          //删除服务,这一句可以不要;
    //      DeleteService(hService);
        finally
          CloseServiceHandle(hService);
        end;
      finally
        CloseServiceHandle(SCManager);
      end;
    end;

    ///////////////////////////////////////////////////////////////////////////////////
    总不能让用户自己启动scktsrvr.exe吧?将其安装为NT服务似乎也不是很好的办法,我想最好就是将它绑定到应用服务器了,请问各位,我该如何做呢?一定送分! 
    ---------------------------------------------------------------

    ---------------------------------------------------------------

    可以将你的App Server加到ScktSrvr那个程序中,或ScktSrvr加到你的程序中,那个程序在VCL目录下,不管怎么,第一次还是得安装成NT服务,不然它自动会加? 
    ---------------------------------------------------------------

    ---------------------------------------------------------------

    把Scktsrvr加到启动程序中(我就是这样做的);

    ---------------------------------------------------------------

    ---------------------------------------------------------------

    把Scktsrvr加到启动程序中 
    ---------------------------------------------------------------

    把它加启动程序中?不好吧。 
    该程序是NT服务型的,只要运行一次,以后就自动运行了。所以没有必要让它加到启动组中每次再运行一次。 
    可以试试以下两种方法: 
    1.在发布应用服务器时,把Scktsrvr一同发布,在应用服务器执行的开始,先执行Scktsrvr,第一次执行后,在注册表中写一个标志,表示Scktsrvr已经运行。以后再运行时首先检查这个标志,如已运行就不再执行了。 
    2.在安装盘中做呀。制作安装盘的工具大多都有执行外壳命令的功能。安装应用服务器后让安装程序执行一下Scktsrvr就可以了!

    ---------------------------------------------------------------

    ---------------------------------------------------------------

    Scktsrvr.exe加到启动程序中


    ---------------------------------------------------------------

    在Delphi的安装目录下的/Source/Vcl目录下有ScktSrvr.dpr整个项目,你可以将的应用程序服务器加在这个项目里,就不用ScktSrvr.Exe了。 
    ---------------------------------------------------------------

    Scktsrvr是个服务 
    Scktsrvr.exe -install  
    注册这个服务,并在服务管理器把它设为自动就OK了。

    ---------------------------------------------------------------

    把Scktsrvr加到启动程序中 
    ---------------------------------------------------------------


    我就是这样做的,在ScktSrvr.dqr项目里,加入远程数据模块,将服务器要用的控件都放到远程数据模块中,编译执行。 
    然后打开客户端程序,连接,成功!!没什么问题也!!!! 
    ---------------------------------------------------------------

    先启动你的Scktsrvr; 
    可以再应用程序启动后,调用外部程序; 
    --------------------------------------------------------------- 
     
    ---------------------------------------------------------------

    那就只执行一次喽 
    将Scktsrvr放入: 
    HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnce 
    --------------------------------------------------------------- 
    ---------------------------------------------------------------

    在dpr中 
    procedure RunSckt; 
    var 
      handle: hwnd; 
    begin 
      if FindWindow(nil, 'scktsrvr') = 0 then 
        ShellExecute(handle, 'open', pchar(extractFilepath(application.exename) + 'scktsrvr.exe'), '', '', SW_SHOWNA); 
    end; 
    在主form中 
    procedure TfrmMain.FormDestroy(Sender: TObject); 
    var 
      HandleSocket: Hwnd; 
    begin 
      HandleSocket := FindWindow(nil, 'scktsrvr'); 
      if HandleSocket <> 0 then 
        SendMessage(handlesocket, wm_close, 0, 0); 
    end;


    ---------------------------------------------------------------

    第一 scktsrvr /install 安装到服务器中最好,因为在98下面启动是不行的,只有在2k下面或者NT下面才行; 
    第二 scktsrvr整个工程源代码在VCL下面,可以改变名称,和里面的数据模块,可以改个名称; 
    第三 通讯端口可以改变,最好改变,这个端口写在注册表里面,看看源代码就可以拉,最好改变不要使用注册表来放置,这样便于保密。

    ---------------------------------------------------------------

    ---------------------------------------------------------------

    我倒,早就有过这种讨论了,scktsrvr demo 中 TSocketDispatcher 可以独立成一个控件,那样你爱放哪就哪了? 
    现在的问题是 TSocketDispatcher 不能检测到非法网络中断,比方客户机掉电/拔号断开连接/线路不稳定 
    ---------------------------------------------------------------

    -------------------------------------------

    让它随server自动启动。(放到启动菜单)

  • 相关阅读:
    音标,口型,舌位对照表:适合已有一定英语基础的人重新回顾音标发音,在不断的练习中让自己的发音更准确,口型更标准。
    c++友元函数和友元类
    经典MFC界面和Ribbon界面框架对比(单文档为例)
    QEM三维模型简化算法
    VC6和VS2008中C++编译器差异
    VS操作技巧
    msvcrt.lib和LIBCD.lib链接冲突
    二叉树遍历算法
    IE/QQ使用代理上网
    Google Map街景(红蓝立体)
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/6599257.html
Copyright © 2011-2022 走看看