【问题标题】:delphi 7 on 64 bit server 2008, problem64位服务器2008上的delphi 7,问题
【发布时间】:2011-07-06 06:22:49
【问题描述】:

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

当我尝试这样做时,我得到了错误: 无法创建进程。参数不正确。

如果你们中的任何人知道如何做到这一点,我们将不胜感激。

谢谢!

【问题讨论】:

  • 您是否尝试将 Delphi 7 调试器附加到 64 位 services.exe?如果是这样,它应该是失败的! Delphi 7是32位进程,无法调试64位进程。
  • @Cosmin Prund 我想附加到我也在 delphi 7 中创建的 windows 服务,它是 32 位应用程序,没有运气..
  • 我在这方面没有太多经验;但我会首先在 我的用户帐户 下运行该服务,然后我会编辑问题以明确我正在调试自己的 32 位服务,因为您将其称为“Windows 服务” !
  • 虽然您可以调试 Delphi 服务,但您需要跳过许多环节才能使其正常工作。我从不打扰,只是确保我的服务可以作为服务或标准应用程序运行。当我想调试时,我作为标准应用程序运行,因此避开了所有令人头疼的问题。这种方法的主要好处之一是可以轻松调试启动代码。
  • @DavidHeffernan,您如何设法从 delphi ide 将服务作为标准应用程序运行?你不需要一些环境。伪造运行、停止、暂停 - 服务操作?

标签: delphi debugging delphi-7


【解决方案1】:

虽然您可以调试 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 循环中运行。这对我的调试需求无关紧要。

【讨论】:

  • 谢谢,我采用了你的代码。非常感谢,以及能够直接从我的脑海中阅读的能力:)
  • @John 不客气。我们的目标是在 Stack Overflow 提供全方位服务! ;-)
  • 这样您就不会在其真实环境中调试您的服务,而是使用正确的用户来运行该服务。我从来没有遇到过附加和调试服务的问题,即使在 64 位操作系统下也是如此。
  • @Idsandon 这是一个非常有效的观点。这完全取决于您使用调试器搜索的内容。我必须做的大部分服务调试都与服务的主要功能以及它如何与客户端交互有关。我的方法效果很好。如果您正在处理与权限、会话、桌面等相关的问题,那么我同意您想要的是原位调试。
【解决方案2】:

您是否尝试以管理员身份运行 IDE?

我已经在 Win64 下完成了这样的过程附加,但据我所知,我必须以管理员权限运行 IDE。

【讨论】:

  • 是的,错误是一样的。我也在尝试更改delphi ide的兼容性级别,但仍然弹出相同的错误
  • 您是否在SYSTEM帐户下运行服务?
  • @Warren 服务在系统下进行了测试,也在我登录的帐户下。这些都没有工作..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
相关资源
最近更新 更多