2011-07-06 25 views
3

誰もがWindows Server 2008 64ビット版で独自のWindowsサービス(32ビットアプリケーション)プロセスにデルファイを添付しようとしましたか?delphi 7 for 64 bit server 2008、問題

これを実行しようとすると、エラーが発生します。 プロセスを作成できません。パラメータが正しくありません。

あなたの誰かがこれを行う方法を知っているなら、その助けは本当に感謝します。

ありがとうございます!

+0

64ビットservices.exeにDelphi 7デバッガを接続しようとしましたか?もしそうなら、それは失敗するはずです! Delphi 7は32ビットプロセスであり、64ビットプロセスをデバッグすることはできません。 –

+0

@Cosmin Prund私はデルファイ7で作成された私のWindowsサービスにアタッチしたかったのですが、これは32ビットアプリケーションで、運が無かったのです。 – John

+1

私はその領域で多くの経験がありません。しかし、私は*私のユーザーアカウント*の下でサービスを実行することから始めたいと思います。私は自分の32ビットサービスをデバッグしていることを明確にするために質問を編集します。 –

答えて

10

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から継承された新しいクラスを作成し、InitialiseCreateRunnerを実装する必要があり、これを使用するには。 CreateRunnerが鍵です。私のサービスでは、オブジェクトが作成され、クライアントが通信する準備が整った待機ソケットが開きます。

標準のアプリケーションコードはかなり基本的です。終了するメカニズムもありません。ループはwhile Trueループ内で実行されます。それは私のデバッグニーズには関係ありません。

+0

ありがとう、私はあなたのコードを採用しました。おかげさまで、私の心から直接読むことができるようになりました。 – John

+0

@ジョンあなたは大歓迎です。私たちはスタックオーバーフローで完全なサービスを提供することを目指しています! ;-) –

+0

このようにして、実際の環境でサービスをデバッグするのではなく、サービスを実行する正しいユーザーをデバッグします。私は64ビットOSであってもサービスに付随してデバッグすることはなかった。 –

1

管理者としてIDEを実行しようとしましたか?

私は既にWin64でこのようなプロセスをアタッチしていますが、覚えている限り、私は管理者権限でIDEを実行しなければなりませんでした。

+0

はい、エラーは同じです。私もdelphi ideの互換性レベルを変更しようとしていましたが、同じエラーがポップアップします – John

+0

SYSTEMアカウントでサービスを実行しますか? –

+0

@Warrenサービスは、私がログインしたアカウントの下でもシステムの下でテストされました。これらのどれも働いていませんでした.. – John

関連する問題