誰もがWindows Server 2008 64ビット版で独自のWindowsサービス(32ビットアプリケーション)プロセスにデルファイを添付しようとしましたか?delphi 7 for 64 bit server 2008、問題
これを実行しようとすると、エラーが発生します。 プロセスを作成できません。パラメータが正しくありません。
あなたの誰かがこれを行う方法を知っているなら、その助けは本当に感謝します。
ありがとうございます!
誰もがWindows Server 2008 64ビット版で独自のWindowsサービス(32ビットアプリケーション)プロセスにデルファイを添付しようとしましたか?delphi 7 for 64 bit server 2008、問題
これを実行しようとすると、エラーが発生します。 プロセスを作成できません。パラメータが正しくありません。
あなたの誰かがこれを行う方法を知っているなら、その助けは本当に感謝します。
ありがとうございます!
Delphiサービスをデバッグすることはできますが、機能させるにはジャンプする必要があります。私は心配することはありませんし、私のサービスがサービスとして、または標準のアプリケーションとして実行できることを単に保証します。私がデバッグしたいとき、私は標準的なアプリケーションとして実行し、すべての頭痛を回避します。
私はこの答えの目的ですべてのコードを1つのファイルにハックしましたが、少し異なって構造化したいと思います。
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
から継承された新しいクラスを作成し、Initialise
とCreateRunner
を実装する必要があり、これを使用するには。 CreateRunner
が鍵です。私のサービスでは、オブジェクトが作成され、クライアントが通信する準備が整った待機ソケットが開きます。
標準のアプリケーションコードはかなり基本的です。終了するメカニズムもありません。ループはwhile True
ループ内で実行されます。それは私のデバッグニーズには関係ありません。
ありがとう、私はあなたのコードを採用しました。おかげさまで、私の心から直接読むことができるようになりました。 – John
@ジョンあなたは大歓迎です。私たちはスタックオーバーフローで完全なサービスを提供することを目指しています! ;-) –
このようにして、実際の環境でサービスをデバッグするのではなく、サービスを実行する正しいユーザーをデバッグします。私は64ビットOSであってもサービスに付随してデバッグすることはなかった。 –
64ビットservices.exeにDelphi 7デバッガを接続しようとしましたか?もしそうなら、それは失敗するはずです! Delphi 7は32ビットプロセスであり、64ビットプロセスをデバッグすることはできません。 –
@Cosmin Prund私はデルファイ7で作成された私のWindowsサービスにアタッチしたかったのですが、これは32ビットアプリケーションで、運が無かったのです。 – John
私はその領域で多くの経験がありません。しかし、私は*私のユーザーアカウント*の下でサービスを実行することから始めたいと思います。私は自分の32ビットサービスをデバッグしていることを明確にするために質問を編集します。 –