知识大全 用Delphi创建服务程序

Posted

篇首语:大鹏一日同风起,扶摇直上九万里。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用Delphi创建服务程序相关的知识,希望对你有一定的参考价值。

小技巧:用Delphi创建服务程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

Windows /XP和 等支持一种叫做 服务程序 的东西 程序作为服务启动有以下几个好处:    ( )不用登陆进系统即可运行   ( )具有SYSTEM特权 所以你在进程管理器里面是无法结束它的     笔者在 年为一公司开发机顶盒项目的时候 曾经写过课件上传和媒体服务 下面就介绍一下如何用Delphi 创建一个Service程序   运行Delphi 选择菜单File >New >Other >Service Application 将生成一个服务程序的框架 将工程保存为ServiceDemo dpr和Unit_Main pas 然后回到主框架 我们注意到 Service有几个属性 其中以下几个是我们比较常用的:    ( )DisplayName:服务的显示名称  ( )Name:服务名称     我们在这里将DisplayName的值改为 Delphi服务演示程序 Name改为 DelphiService 编译这个项目 将得到ServiceDemo exe 这已经是一个服务程序了!进入CMD模式 切换致工程所在目录 运行命令 ServiceDemo exe /install 将提示服务安装成功!然后 net start DelphiService 将启动这个服务 进入控制面版 >管理工具 >服务 将显示这个服务和当前状态 不过这个服务现在什么也干不了 因为我们还没有写代码:)先 net stop DelphiService 停止再 ServiceDemo exe /uninstall 删除这个服务 回到Delphi 的IDE     我们的计划是为这个服务添加一个主窗口 运行后任务栏显示程序的图标 双击图标将显示主窗口 上面有一个按钮 点击该按钮将实现Ctrl+Alt+Del功能     实际上 服务程序莫认是工作于Winlogon桌面的 可以打开控制面板 查看我们刚才那个服务的属性 >登陆 其中 允许服务与桌面交互 是不打钩的 怎么办?呵呵 回到IDE 注意那个布尔属性:Interactive 当这个属性为True的时候 该服务程序就可以与桌面交互了     File >New >Form为服务添加窗口FrmMain 单元保存为Unit_FrmMain 并且把这个窗口设置为手工创建 完成后的代码如下:    unit Unit_Main;    interface    uses  Windows Messages SysUtils Classes Graphics Controls SvcMgr Dialogs Unit_FrmMain;    type  TDelphiService = class(TService)  procedure ServiceContinue(Sender: TService; var Continued: Boolean);  procedure ServiceExecute(Sender: TService);  procedure ServicePause(Sender: TService; var Paused: Boolean);  procedure ServiceShutdown(Sender: TService);  procedure ServiceStart(Sender: TService; var Started: Boolean);  procedure ServiceStop(Sender: TService; var Stopped: Boolean);  private   Private declarations   public  function GetServiceController: TServiceController; override;   Public declarations   end;    var  DelphiService: TDelphiService;  FrmMain: TFrmMain;  implementation    $R * DFM    procedure ServiceController(CtrlCode: DWord); stdcall;  begin  DelphiService Controller(CtrlCode);  end;    function TDelphiService GetServiceController: TServiceController;  begin  Result := ServiceController;  end;    procedure TDelphiService ServiceContinue(Sender: TService;  var Continued: Boolean);  begin  while not Terminated do  begin  Sleep( );  ServiceThread ProcessRequests(False);  end;  end;    procedure TDelphiService ServiceExecute(Sender: TService);  begin  while not Terminated do  begin  Sleep( );  ServiceThread ProcessRequests(False);  end;  end;    procedure TDelphiService ServicePause(Sender: TService;  var Paused: Boolean);  begin  Paused := True;  end;    procedure TDelphiService ServiceShutdown(Sender: TService);  begin  gbCanClose := true;  FrmMain Free;  Status := csStopped;  ReportStatus();  end;    procedure TDelphiService ServiceStart(Sender: TService;  var Started: Boolean);  begin  Started := True;  Svcmgr Application CreateForm(TFrmMain FrmMain);  gbCanClose := False;  FrmMain Hide;  end;    procedure TDelphiService ServiceStop(Sender: TService;  var Stopped: Boolean);  begin  Stopped := True;  gbCanClose := True;  FrmMain Free;  end;    end     主窗口单元如下:    unit Unit_FrmMain;    interface    uses  Windows Messages SysUtils Variants Classes ShellApi Graphics Controls Forms   Dialogs ExtCtrls StdCtrls;    const  WM_TrayIcon = WM_USER + ;  type  TFrmMain = class(TForm)  Timer : TTimer;  Button : TButton;  procedure FormCreate(Sender: TObject);  procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);  procedure FormDestroy(Sender: TObject);  procedure Timer Timer(Sender: TObject);  procedure Button Click(Sender: TObject);  private   Private declarations   IconData: TNotifyIconData;  procedure AddIconToTray;  procedure DelIconFromTray;  procedure TrayIconMessage(var Msg: TMessage); message WM_TrayIcon;  procedure SysButtonMsg(var Msg: TMessage); message WM_SYSMAND;  public   Public declarations   end;    var  FrmMain: TFrmMain;  gbCanClose: Boolean;  implementation    $R * dfm    procedure TFrmMain FormCreate(Sender: TObject);  begin  FormStyle := fsStayOnTop; 窗口最前  SetWindowLong(Application Handle GWL_EXSTYLE WS_EX_TOOLWINDOW); 不在任务栏显示  gbCanClose := False;  Timer Interval := ;  Timer Enabled := True;  end;    procedure TFrmMain FormCloseQuery(Sender: TObject; var CanClose: Boolean);  begin  CanClose := gbCanClose;  if not CanClose then  begin  Hide;  end;  end;    procedure TFrmMain FormDestroy(Sender: TObject);  begin  Timer Enabled := False;  DelIconFromTray;  end;    procedure TFrmMain AddIconToTray;  begin  ZeroMemory(@IconData SizeOf(TNotifyIconData));  IconData cbSize := SizeOf(TNotifyIconData);  IconData Wnd := Handle;  IconData uID := ;  IconData uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;  IconData uCallbackMessage := WM_TrayIcon;  IconData hIcon := Application Icon Handle;  IconData szTip := Delphi服务演示程序 ;  Shell_NotifyIcon(NIM_ADD @IconData);  end;    procedure TFrmMain DelIconFromTray;  begin  Shell_NotifyIcon(NIM_DELETE @IconData);  end;    procedure TFrmMain SysButtonMsg(var Msg: TMessage);  begin  if (Msg wParam = SC_CLOSE) or  (Msg wParam = SC_MINIMIZE) then Hide  else inherited; // 执行默认动作  end;    procedure TFrmMain TrayIconMessage(var Msg: TMessage);  begin  if (Msg LParam = WM_LBUTTONDBLCLK) then Show();  end;    procedure TFrmMain Timer Timer(Sender: TObject);  begin  AddIconToTray;  end;    procedure SendHokKey;stdcall;  var  HDesk_WL: HDESK;  begin  HDesk_WL := OpenDesktop ( Winlogon False DESKTOP_JOURNALPLAYBACK);  if (HDesk_WL <> ) then  if (SetThreadDesktop (HDesk_WL) = True) then  PostMessage(HWND_BROADCAST WM_HOTKEY MAKELONG (MOD_ALT or MOD_CONTROL VK_DELETE));  end;    procedure TFrmMain Button Click(Sender: TObject);  var  dwThreadID : DWORD;  begin  CreateThread(nil @SendHokKey nil dwThreadID);  end;    end     补充:  ( )关于更多服务程序的演示程序 请访问以下Url:?id= 上面包含了多个演示如何控制和管理系统服务的代码     ( )请切记:Windows实际上存在多个桌面 例如屏幕传输会出现白屏 可能有两个原因:一是系统处于锁定或未登陆桌面 二是处于屏幕保护桌面 这时候要将当前桌面切换到该桌面才能抓屏     ( )关于服务程序与桌面交互 还有种动态切换方法 大概单元如下:  unit ServiceDesktop;   cha138/Article/program/Delphi/201311/8444

相关参考

知识大全 用Delphi进行NT、2000、2003服务程序的调试

用Delphi进行NT、2000、2003服务程序的调试  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 Delphi插件创建、调试与使用应用程序扩展

Delphi插件创建、调试与使用应用程序扩展  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  有没

知识大全 Delphi开发Windows服务程序

Delphi开发Windows服务程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  开发步骤:

知识大全 delphi编程实现动态创建别名

  对于BDE会话期对象来说BDE别名特别重要许多方法都需要传递一个数据库的别名作为参数TSession提供了管理BDE别名的功能  但是作者往往等到要发布程序时才发现你的程序由于找不到别名而无法运行

知识大全 如何使用Delphi设计强大的服务器程序

如何使用Delphi设计强大的服务器程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!现在网络的流

知识大全 如何使用Delphi设计强大的服务器程序[1]

如何使用Delphi设计强大的服务器程序[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  现

知识大全 如何使用Delphi设计强大的服务器程序[2]

如何使用Delphi设计强大的服务器程序[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  大

知识大全 用Delphi制作录音程序

用Delphi制作录音程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Delphi是Inpr

知识大全 用Delphi编码实现程序自启动

用Delphi编码实现程序自启动  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一程序自启动的原

知识大全 用Delphi编写打印程序的窍门

用Delphi编写打印程序的窍门  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如果你想自己用D