我们有一个服务(用C#编写)运行来检查每10分钟的事情,如果发生了新的事情,那么就发送电子邮件给特别的人。
我们还有其他Delphi程序,并希望将一个参数传递给服务以立即行动并发送电子邮件(我的意思是不管间隔10分钟)。
如何在服务运行时执行此操作?
注意:无法迁移到C#,我们必须在Delphi中这样做。
答案 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服务托管),从而公开所需的功能。