`
jiaochar
  • 浏览: 21522 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

系统服务和普通FORMS程序共存一体的实现 转

阅读更多
要求:一个EXE,如何将它做成这样的效果:
1、双击它时,像一个FORMS程序那样正常显示窗体运行。
2、注册成系统服务,每次都可以从service.msc中启动它。

也就是说,没注册之前,它可以当作普通FORMS程序运行,注册之后,它就可以当系统服务运行。

做法:

参考Delphi 里面scktsrvr的源代码,Program Files\Borland\Delphi7\Bin 搜索scktsrvr 就会看到有个scktsrvr.dpr,查看它的工程源程序,原理:在启动程序时,通过启动的方式来决定如何加载程序。

必须的地方使用红色标记:

program RODBLayer;

{#ROGEN:RODBLayerServices.rodl} // RemObjects: Careful, do not remove!

uses
  uROComInit,

//增加引用
  SvcMgr,  Forms,    SysUtils,  WinSvc,

  RODBLayerService in 'RODBLayerService.pas' {RODBServices: TService},
  RODBLayerServices_Intf in 'RODBLayerServices_Intf.pas',
  RODBLayerServices_Invk in 'RODBLayerServices_Invk.pas',
  uADOConnectionPool in 'uADOConnectionPool.pas',
  uConnectionPool in 'uConnectionPool.pas',
  Comm in 'Comm.pas',
  Config in 'Config.pas' {ConfigFrm},
  RODBLayerServices_Impl in 'RODBLayerServices_Impl.pas';

{$R *.RES}
{$R RODLFile.res}

//步骤一、查找是否通过命令行来注册或注消 ,如是则表明是系统服务
function Installing: Boolean;

begin
  Result := FindCmdLineSwitch('INSTALL',['-','\','/'], True) or
            FindCmdLineSwitch('UNINSTALL',['-','\','/'], True);
end;

//步骤二、检测是否是系统服务中启动服务;
function StartService: Boolean;

var
  Mgr, Svc: Integer;
  UserName, ServiceStartName: string;
  Config: Pointer;
  Size: DWord;
begin
  Result := False;
  Mgr := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if Mgr <> 0 then
  begin

   //'RODBServices'代表服务名(services name),不是指服务显示名(services display name)

   //它根据你的服务而定。
    Svc := OpenService(Mgr, PChar('RODBServices'), SERVICE_ALL_ACCESS);
    Result := Svc <> 0;
    if Result then
    begin
      QueryServiceConfig(Svc, nil, 0, Size);
      Config := AllocMem(Size);
      try
        QueryServiceConfig(Svc, Config, Size, Size);
        ServiceStartName := PQueryServiceConfig(Config)^.lpServiceStartName;
        if CompareText(ServiceStartName, 'LocalSystem') = 0 then
          ServiceStartName := 'SYSTEM';
      finally
        Dispose(Config);
      end;
      CloseServiceHandle(Svc);
    end;
    CloseServiceHandle(Mgr);
  end;
  if Result then
  begin
    Size := 256;
    SetLength(UserName, Size);
    GetUserName(PChar(UserName), Size);
    SetLength(UserName, StrLen(PChar(UserName)));
    Result := CompareText(UserName, ServiceStartName) = 0;
  end;
end;

//步骤三、判断

begin
  if not Installing then
  begin
    CreateMutex(nil, True, 'RODBServices');  //创建一个互斥体;
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      MessageBox(0, PChar('The RODBServices is already running'), '提示', MB_ICONERROR);
      Halt;
    end;
  end;
  if Installing or StartService then  //两者之一为真,表明是系统服务。否则为Forms程序;
  begin
     SvcMgr.Application.Initialize;
     SvcMgr.Application.CreateForm(TRODBServices, RODBServices);
  SvcMgr.Application.CreateForm(TConfigFrm, ConfigFrm);
     ConfigAppName:='SvcMgr'; //使用它来标识出Application属于哪种,从而为关闭TConfigFrm窗体提供依据;这一行只跟你的实际应用有关。不过程序要退出时,要根据是系统服务还是普通FORMS做出不同的退出动作。如下:
     SvcMgr.Application.Run;
  end else
  begin
     Forms.Application.Initialize;
     Forms.Application.CreateForm(TRODBServices, RODBServices);
     Forms.Application.CreateForm(TConfigFrm,ConfigFrm);
     ConfigAppName:='Forms';
     Forms.Application.Run;
  end;
end.

{接上,用来说明不同的退出动作如何做的。

procedure TConfigFrm.BtnCloseClick(Sender: TObject);
begin
  if MessageDlgPos('您确定要退出服务端吗?',mtConfirmation,[mbOK, mbCancel],0,
  Mouse.CursorPos.X-160,Mouse.CursorPos.Y-130)<>mrOk then Exit;
  RODBServices.ServiceStop(RODBServices,IsConsole) ;
  if ConfigAppName='SvcMgr' then   //前面代码都相同,仅这里要变一下。
    RODBServices.Status:=csStopped
  else
    Close;
end;}
分享到:
评论

相关推荐

    C Sharp Windows Forms 程序设计.pdf

    通过这些内容的学习,读者可以在Windows Forms程序设计中实现更丰富的功能,增强软件的可用性和用户体验。 总之,《C Sharp Windows Forms 程序设计》不仅是一本面向初学者的入门书籍,也是一本能够帮助中级和高级...

    Windows Forms 2.0 程序设计.PDF

    《Windows Forms 2.0 程序设计》是一本专为Windows Forms 2.0开发者量身定制的权威指南,旨在帮助读者深入理解和高效利用这一强大的开发平台。Windows Forms是.NET Framework的一部分,用于构建桌面应用程序,而2.0...

    Windows Forms程序设计

    本书是Microsoft.NET Forms程序库的最佳使用指南。, 全书包括15章和4个附录,对WinForms进行了全面而深入的讲解。前半部分讨论了窗体、对话框、GDI+以及打印等相对常见的技术;后半部分则专注于高级主题,内容涵盖...

    Windows Forms 2.0程序设计

    Windows Forms是基于Windows Presentation Foundation(WPF)之前的一个技术,虽然现代开发更多倾向于WPF和UWP,但Windows Forms在许多现有应用中仍占有重要地位,尤其是对于需要兼容旧系统的企业级应用。...

    WindowsForms程序设计 源码.zip

    本资料“WindowsForms程序设计 源码.zip”包含的是基于Windows Forms的程序源代码,为学习和理解Windows Forms编程提供了实践基础。 一、Windows Forms概述 Windows Forms是.NET Framework的一部分,它提供了创建...

    C# Windows Forms程序设计

    《C# Windows Forms程序设计》是一本专注于C#语言与Windows Forms应用开发的教程,适合初学者和有一定基础的开发者。Windows Forms是.NET Framework中用于构建桌面应用程序的主要工具集,它提供了一系列丰富的控件和...

    C Sharp Windows Forms 程序设计(pdf版本)(压缩卷4)

    C Sharp Windows Forms 程序设计(pdf版本)(压缩卷4)

    C Sharp Windows Forms 程序设计

    C Sharp(C#)是一种由微软开发的面向对象的编程语言,主要应用于构建Windows桌面应用程序、Web应用程序以及移动应用程序等领域。Windows Forms是.NET Framework的一部分,它提供了一个丰富的用户界面(UI)开发平台...

    C# Windows Forms 程序设计

    《C# Windows Forms程序设计》是一本专注于C#编程环境下创建桌面应用程序的指南,尤其针对Windows Forms技术进行了深入探讨。Windows Forms是.NET Framework中的一个关键组件,它为开发者提供了丰富的用户界面(UI)...

    C Sharp Windows Forms 程序设计(pdf版本)(压缩卷2)

    C Sharp Windows Forms 程序设计(pdf版本)(压缩卷2)

    Xamarin.Forms应用程序导航系统的帮助程序:传递参数、恢复_C#_下载.zip

    总之,这个压缩包提供的“Xamarin.Forms应用程序导航系统的帮助程序”是为了解决C#开发者在处理页面导航、参数传递和数据恢复时遇到的问题,通过优化和封装导航服务,提高了开发效率和应用的用户体验。对于Xamarin....

    RFID图书管理系统程序源代码

    RFID图书管理系统程序源代码是基于Windows Forms开发的图书管理系统的登录模块的源代码。本系统使用C#语言编写,实现了用户登录验证、密码验证、用户信息管理等功能。下面是对该系统的分析和知识点总结: 概述 ...

    C#WindowsForm程序设计.pdf

    《C# WindowsForm程序设计》是一本专注于C#语言在创建桌面应用程序领域的专著。Windows Forms是.NET Framework中...这本书《C# WindowsForm程序设计》将系统地引导读者掌握这些技能,成为专业的Windows Forms开发者。

    基于Silverlight2+C#实现的Forms窗体间的参数传递程序例子代码

    - **通信机制**:Silverlight 2中,与服务器通信主要通过WCF服务,实现数据的获取和更新。 2. **C#**: - **对象和类**:C#是一种面向对象的编程语言,它支持类的定义和实例化,是进行参数传递的基础。 - **数据...

    Windows forms程序设计 pdf

    学习Windows不错的一本书喔,不用多说

    Windows Forms 2.0 程序设计.pdf

    《Windows Forms 2.0程序设计》就是你书架上必不可少的参考书,它也是Windows Forms 2.0的最佳使用指南。全书包括19章和6个附录,全面地讲解了Windows Forms 2.0的各项技术,还深入地探讨了各种类型应用程序的解决...

    c sharp windows forms 程序设计 PDG中文版

    C# Windows Forms程序设计是微软.NET Framework框架下开发桌面应用程序的一种常见方式。Windows Forms提供了一组丰富的控件和API,使得开发者能够构建功能强大的交互式用户界面。在本PDG中文版中,我们将深入探讨这...

    C# Winform实现的系统程序管理器

    【C# Winform实现的系统程序管理器】是一种利用C#编程语言和Windows Forms(Winform)技术构建的桌面应用程序,旨在提供一个简洁且高效的工具来管理计算机上的程序。Winform是.NET Framework的一部分,用于创建具有...

Global site tag (gtag.js) - Google Analytics