2011-07-06 89 views
3

有沒有人曾試圖在Windows Server 2008 64位下將delphi附加到他自己的Windows服務(32位應用程序)進程?在64位服務器2008上的德爾福7,問題

當我嘗試這樣做時,出現錯誤: 無法創建進程。該參數不正確。

如果你們中的任何一個人都知道如何做到這一點,那麼我們將非常感謝。

謝謝!

+0

您是否嘗試將Delphi 7調試器附加到64位services.exe?如果是這樣,它應該失敗! Delphi 7是一個32位的進程,它不能調試64位進程。 –

+0

@Cosmin Prund我想附加到我的Windows服務創建也德爾福7,這是32位應用程序,沒有運氣.. – John

+1

我沒有太多的經驗,在該領域;但我首先在*我的用戶帳戶*下運行服務,然後編輯問題以清楚說明我正在調試我自己的32位服務,因爲您稱之爲「Windows服務」! –

回答

10

雖然您可以調試德爾福服務,但您需要跳過一些環節才能使其工作。我從不打擾,只需確保我的服務既可以作爲服務運行,也可以作爲標準應用運行。當我想調試時,我將其作爲標準應用程序運行,因此避開了所有的煩惱。

爲了達到這個目的,我已經把所有的代碼都打包成了一個單一的文件,但是你希望它的結構有點不同。

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循環內運行。這對我的調試需求無關緊要。

+0

謝謝,我採用了您的代碼。非常感謝,以及能夠直接從我的腦海中讀取:) – John

+0

@John不客氣。我們的目標是在Stack Overflow提供全面的服務! ;-) –

+0

這樣,您就不會在真實環境中調試您的服務,並且服務將與正確的用戶一起運行。即使在64位操作系統下,我也從未遇到過附加和調試服務的問題。 – 2011-07-06 12:55:49

1

您是否嘗試以管理員身份運行IDE?

我已經在Win64下完成了這樣的進程連接,但是我必須以管理員權限運行IDE,據我所知。

+0

是的,錯誤是一樣的。我也試圖改變delphi ide的兼容級別,但仍彈出相同的錯誤 – John

+0

您是否在SYSTEM帳戶下運行服務? –

+0

@Warren服務在系統下進行了測試,也在我登錄的帳戶下進行了測試。這些工作都沒有奏效。 – John