Delphi:将参数传递给正在运行的服务以进行操作

时间:2013-12-16 06:16:01

标签: delphi service

我们有一个服务(用C#编写)运行来检查每10分钟的事情,如果发生了新的事情,那么就发送电子邮件给特别的人。

我们还有其他Delphi程序,并希望将一个参数传递给服务以立即行动并发送电子邮件(我的意思是不管间隔10分钟)。

如何在服务运行时执行此操作?

注意:无法迁移到C#,我们必须在Delphi中这样做。

5 个答案:

答案 0 :(得分:7)

还可以使用ControlService API向服务发送用户定义的控制代码。 (必须编写该服务以响应该特定控制代码。)

答案 1 :(得分:4)

您需要使用某种形式的进程间通信(IPC)。有很多种可能性。最常用于这种情况的是命名管道和TCP /套接字。

答案 2 :(得分:2)

这里有一些好的答案......这是我的: 您可以使用文本文件或Windows注册表来标记操作。这样,如果在服务未运行时触发器发生,您的Delphi服务可以在启动时做出反应。您希望传达的任何信息/参数都可以包含在注册表项值或文件数据中。

Win注册表方法: 如果使用注册表项,请确保两个应用程序都可以读取和写入相同的密钥。 在您的Delphi服务中实现RegNotifyChangeKeyValue WinAPI,它将在添加/更改密钥时通知。以下是如何在Delphi中实现listner的想法:Monitoring Registry Changes

文件方法: 要收到有关文件更改的通知,您无需轮询更改。以下是基于FindFirstChangeNotification WinAPI的解决方案的代码。您的Delphi服务可以实现TFileWatch类。您还需要Angus Johnson的班级TDirectoryWatch class

unit FileWatch;

interface

uses Classes,
     SysUtils,
     DirWatch; //by Angus Johnson: http://www.angusj.com/delphi/dirwatch.html

type TFileNotifyEventType = (feCreated, feModified, feDeleted);
     TFileNotifyEvent = procedure(Sender: TObject; FileEventType : TFileNotifyEventType) of object;

     TFileWatch = class(TComponent)
     private
       FDirWatch : TDirectoryWatch;
       FFileToWatch : string;
       FFileAge : integer;           //if -1 then file does not exist
       FFileExists : boolean;
       procedure OnFolderChangeEvent(Sender: TObject);
     protected

     public
        OnFileNotifyEvent : TFileNotifyEvent;
        property Filename : string read FFileToWatch;
        constructor Create(aOwner: TComponent; FileToWatch : string);
        destructor Destroy();
     end;
implementation

{ TFileWatch }

constructor TFileWatch.Create(aOwner: TComponent; FileToWatch: string);
begin
  inherited Create(aOwner);

  FDirWatch := TDirectoryWatch.Create(Self);
  FDirWatch.Directory := ExtractFilePath(FileToWatch);
  FDirWatch.OnChange := OnFolderChangeEvent;
  FDirWatch.NotifyFilters := [nfFilename, nfLastWrite];
  FDirWatch.Active := true;

  FFileToWatch := FileToWatch;
  FFileAge := FileAge(FFileToWatch);
  FFileExists := FFileAge > -1;
end;

destructor TFileWatch.Destroy;
begin
  FDirWatch.Free;
  inherited Destroy;
end;

procedure TFileWatch.OnFolderChangeEvent(Sender: TObject);
var MyFileAge : integer;
    MyFileExists : boolean;

    FileEventType : TFileNotifyEventType;
begin
  //Check to see if the event has been fired by our file in question
  MyFileAge := FileAge(FFileToWatch);
  if MyFileAge = FFileAge then
    exit;  //Nothing has happened, exit.

  //Figure out if the file has been created, modified or deleted
  MyFileExists := MyFileAge > -1;
  if MyFileExists and not FFileExists then
    FileEventType := feCreated
  else if not MyFileExists and FFileExists then
    FileEventType := feDeleted
  else
    FileEventType := feModified;

  FFileAge := MyFileAge;
  FFileExists := MyFileExists;

  if Assigned(OnFileNotifyEvent) then
    OnFileNotifyEvent(Self, FileEventType);
end;

end.

答案 3 :(得分:1)

我经常通过数据库进行交流。我用进程X存储一个值,进程Y读取它。

这个设计的好处是两个应用程序不需要彼此了解。它们可以轻松地在不同的机器上运行,并且您可以拥有多个读取器和编写器,因此您可以轻松扩展。如果需要,您还可以免费获得加密和压缩连接,并且可以处理各种复杂的多用户内容。

答案 4 :(得分:0)

我建议将WCF服务添加到(由您的Windows服务托管),从而公开所需的功能。