有沒有人曾試圖在Windows Server 2008 64位下將delphi附加到他自己的Windows服務(32位應用程序)進程?在64位服務器2008上的德爾福7,問題
當我嘗試這樣做時,出現錯誤: 無法創建進程。該參數不正確。
如果你們中的任何一個人都知道如何做到這一點,那麼我們將非常感謝。
謝謝!
有沒有人曾試圖在Windows Server 2008 64位下將delphi附加到他自己的Windows服務(32位應用程序)進程?在64位服務器2008上的德爾福7,問題
當我嘗試這樣做時,出現錯誤: 無法創建進程。該參數不正確。
如果你們中的任何一個人都知道如何做到這一點,那麼我們將非常感謝。
謝謝!
雖然您可以調試德爾福服務,但您需要跳過一些環節才能使其工作。我從不打擾,只需確保我的服務既可以作爲服務運行,也可以作爲標準應用運行。當我想調試時,我將其作爲標準應用程序運行,因此避開了所有的煩惱。
爲了達到這個目的,我已經把所有的代碼都打包成了一個單一的文件,但是你希望它的結構有點不同。
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
@John不客氣。我們的目標是在Stack Overflow提供全面的服務! ;-) –
這樣,您就不會在真實環境中調試您的服務,並且服務將與正確的用戶一起運行。即使在64位操作系統下,我也從未遇到過附加和調試服務的問題。 – 2011-07-06 12:55:49
您是否嘗試將Delphi 7調試器附加到64位services.exe?如果是這樣,它應該失敗! Delphi 7是一個32位的進程,它不能調試64位進程。 –
@Cosmin Prund我想附加到我的Windows服務創建也德爾福7,這是32位應用程序,沒有運氣.. – John
我沒有太多的經驗,在該領域;但我首先在*我的用戶帳戶*下運行服務,然後編輯問題以清楚說明我正在調試我自己的32位服務,因爲您稱之爲「Windows服務」! –