gpt4 book ai didi

64 位服务器 2008 上的 delphi 7,问题

转载 作者:行者123 更新时间:2023-12-03 15:41:14 25 4
gpt4 key购买 nike

有没有人尝试过在 Windows Server 2008 64 位下将 delphi 附加到他自己的 Windows 服务(32 位应用程序)进程?

当我尝试执行此操作时,出现错误:无法创建进程。参数错误。

如果你们中有人知道如何做到这一点,我们将非常感谢您的帮助。

谢谢!

最佳答案

虽然您可以调试 Delphi 服务,但您需要跳过许多环节才能使其正常工作。我从不打扰,只是确保我的服务可以作为服务或标准应用程序运行。当我想要调试时,我作为标准应用程序运行,这样就可以避免所有令人头痛的问题。

出于此答案的目的,我已将所有代码破解到一个文件中,但您可能希望以不同的方式构建它。

program MyService;

uses
SysUtils, Classes, Windows, Forms, SvcMgr;

type
TMyService = class(TService)
private
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceExecute(Sender: TService);
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
protected
FDescription: string;
FEventLogSourceName: string;
procedure Initialise; virtual; abstract;
class function CreateRunner: TObject; virtual; abstract;
public
constructor Create(AOwner: TComponent); override;
function GetServiceController: TServiceController; override;
end;
TMyServiceClass = class of TMyService;

{ TMyService }

constructor TMyService.Create(AOwner: TComponent);
begin
inherited;
Initialise;
OnStart := ServiceStart;
OnStop := ServiceStop;
OnPause := ServicePause;
OnExecute := ServiceExecute;
OnContinue := ServiceContinue;
end;

procedure TMyService.ServiceStart(Sender: TService; var Started: Boolean);
begin
Started := True;
end;

procedure TMyService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
Stopped := True;
end;

procedure TMyService.ServiceContinue(Sender: TService; var Continued: Boolean);
begin
ServiceStart(Sender, Continued);
end;

procedure TMyService.ServicePause(Sender: TService; var Paused: Boolean);
begin
ServiceStop(Sender, Paused);
end;

procedure TMyService.ServiceExecute(Sender: TService);
var
Runner: TObject;
begin
Runner := CreateRunner;
Try
while not Terminated do begin
ServiceThread.ProcessRequests(True);
end;
Finally
FreeAndNil(Runner);
End;
end;

var
Service: TMyService;

procedure ServiceController(CtrlCode: DWORD); stdcall;
begin
Service.Controller(CtrlCode);
end;

function TMyService.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;

procedure RunAsService(ServiceClass: TMyServiceClass; var Service);
var
Application: TServiceApplication;
begin
Application := SvcMgr.Application;
Application.Initialize;
Application.CreateForm(ServiceClass, Service);
Application.Run;
end;

procedure RunAsStandardExecutable(ServiceClass: TMyServiceClass);
var
Application: TApplication;
Runner: TObject;
begin
Application := Forms.Application;
Application.Initialize;
Runner := ServiceClass.CreateRunner;
Try
while True do begin
Try
Application.HandleMessage;
Except
Application.HandleException(Application);
End;
end;
Finally
FreeAndNil(Runner);
End;
end;

procedure ServiceMain(ServiceClass: TMyServiceClass);
begin
if FindCmdLineSwitch('RunAsApp', ['-', '/'], True) then begin
RunAsStandardExecutable(ServiceClass);
end else begin
RunAsService(ServiceClass, Service);
end;
end;

begin
ServiceMain(TMyService);
end.

要使用它,您需要创建一个继承自TMyService的新类,并实现InitialiseCreateRunnerCreateRunner 是关键。在我的服务中,这会创建一个对象,该对象又打开一个监听套接字,准备好供客户端进行通信。

标准应用程序代码非常基本。它甚至没有终止机制——它在 while True 循环内运行。这对于我的调试需求来说并不重要。

关于64 位服务器 2008 上的 delphi 7,问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6592324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com