在delphi中怎样将一个可执行文件添加到windows服务中!

解决方案 »

  1.   

    参考一下主键:
    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
      

  2.   

    1.产生一个Win32服务应用
    产生一个Win32服务应用,选择File|New菜单,在New Items页中选择Service Application。这样在你的工程里加入一个全局变量命名的应用,它是 TserviceApplication类型。每个服务工程自动的声明一个TServiceApplication 实例,并不需要直接的对它编程。另外自动产生一个TService对象。当你产生一个服务应用,你会在设计环境中看到一个窗口,它对应了一个服务 (Tservice)。在Object Inspector中设置它的属性和事件以实现它。在你的服务应用中可以加入其他的服务。不要将Service加入在一个非Service Application中。当加入一个TService对象时,因为服务,应用将不产生事件请求和使用合适的窗口调用。
    2.TServiceApplication
    TServiceApplication封装了windows NT Service Application。它提供服务应用的基本行为框架。它包含TService对象,每个Tservice封装了一个NT服务。 服务应用提供服务产生、安装、注册、分发和卸载的方法。
    注意,不要在工程的uses列表中加入Forms或HtppApp,因为这些单元有些
    Aplication变量有冲突。
    3.TService
    每个Tservice都有一个线程。
    特性
    AllowPause
    AllowStop
    Dependencies
    DisplayName
    ErrCode
    ErrorSeverity
    Interactive
    LoadGroup
    Param
    ParamCount
    Password
    ServiceStartName
    ServiceThread
    ServiceType
    StartType
    Status
    TagID
    Terminated
    WaitHint
    Win32ErrCode
    方法:
    Create
    Destroy
    GetServiceController
    LogMessage
    ReportStatus
    事件
    AfterInstall
    AfterUninstall
    BeforeInstall
    BeforeUninstall
    OnContinue
    OnExecute
    OnPause
    OnShutdown
    OnStart
    OnStop
    4.样例例子使用一个TserverSocket,端口设为80,这个例子将在c:\temp目录下产生一个文本文件,名字为WebLogxxx.log(xxx是线程IDThreadID)。看运行结果:启动程序,打开一个Web浏览器,键入localhost,等待浏览器将超时,然后在c:\temp中将有一个Weblogxxx.log文件。
    interface
    uses
    WindowsMessagesSysUtilsClassesGraphicsControlsSvcMgrDialogsScktComp;
    type
    TService1 = class(TService)
    ServerSocket1: TServerSocket;
    procedure ServerSocket1ClientRead(Sender: TObject;
    Socket: TCustomWinSocket);
    procedure Service1Execute(Sender: TService);
    private
    { Private declarations }
    Stream: TMemoryStream;
    public
    function GetServiceController: PServiceController; override;
    { Public declarations }
    end;
    var
    Service1: TService1;
    implementation
    {$R *.DFM}
    procedure ServiceController(CtrlCode: DWord); stdcall;
    begin
    Service1.Controller(CtrlCode);
    end;
    function TService1.GetServiceController: PServiceController;
    begin
    Result := @ServiceController;
    end;
    procedure TService1.ServerSocket1ClientRead(Sender: TObject;
    Socket: TCustomWinSocket);
    var
    Buffer: PChar;
    begin
    Buffer := nil;
    while Socket.ReceiveLength > 0 do begin
    try
    Buffer := AllocMem(Socket.ReceiveLength);
    Socket.ReceiveBuf(Buffer^Socket.ReceiveLength);
    Stream.Write(Buffer^StrLen(Buffer));
    finally
    FreeMem(Buffer);
    end;
    Stream.Seek(0soFromBeginning);
    Stream.SaveToFile('c:\Temp\Weblog' + IntToStr(ServiceThread.ThreadID) + '.lo
    ');
    end;
    end;
    procedure TService1.Service1Execute(Sender: TService);
    begin
    Stream := TMemoryStream.Create;
    try
    ServerSocket1.Port := 80; // WWW port
    ServerSocket1.Active := True;
    while not Terminated do begin
    ServiceThread.ProcessRequests(False);
    end;
    ServerSocket1.Active := False;
    finally
    Stream.Free;
    end;
    end;
    end.
      

  3.   

    我现在可以生成一个winnt服务,但是我想在这个服务启动时调用一个可执行文件执行,不知这种情况该如何实现。
      

  4.   

    好像是
    在里而调用这个吧winexec('文件路径',sw_show);
      

  5.   

    调用一个可执行文件执行:用shellexecute  or shellexecuteex