2012-11-28 64 views
1

我已經使用這個框架編寫了許多服務在過去的德爾福。我現在想用一些類似功能的控制檯來擴展服務。與控制檯應用程序stdout流進行德爾福Windows服務包括

我可以提供最簡單的例子是,我想的東西,如從命令提示符下運行該服務的可執行文件。

> myservice.exe /version 

MyService Version 1.0 

在項目文件中,我會處理參數並在服務初始化之前退出並完成。

If ParamStr(1) = '/version' then 
begin 
    writeln ('MyService Version 1.0'); 
    exit; 
end; 

// Other standard service launch code is after this for proper initialization 
// when run as a service, i.e. 
if not Application.DelayInitialize or Application Installing then 
... 

但是得到writeln聲明的工作,通常我需要在項目文件中,然後打破了服務應用程序Destroy事件的指令{$APPTYPE CONSOLE}

有另一種方式要連接標準輸出到控制檯而不使用{$APPTYPE CONSOLE}指令的德爾福Windows服務應用程序?

+1

你需要一個控制檯應用程序。找到一種方法來修復作爲控制檯應用程序運行的服務,或使用兩個可執行文件。 –

+0

APPTYPE CONSOLE以哪種方式破壞服務Destroy事件? – mjn

回答

1

新建自己的控制檯

begin 

    if paramstr(1)='/?' then 
    begin 
     if Windows.AllocConsole then 
     try 
     WriteLn; 
     // irgendeine sinnvolle Information, z.B.: 
     WriteLn('Your Info'); 
     readln; 
     finally 
     FreeConsole; 
     end; 
    end 

    else 
    begin 
    //Your Appcode 

或連接到控制檯,而無需創建自己的控制檯

begin 

    if paramstr(1) = '/?' then 
    begin 

    if AttachConsole($FFFFFFFF) then 
    begin 
     WriteLn('Your Info'); 
     Readln; 
     FreeConsole; 
    end; 
    end 

    else 
    begin 
    // Your Appcode 
+0

當我使用Windows.AllocConsole技術,它創建一個控制檯會話,但打開一個新的控制檯窗口,然後關閉應用程序退出時。理想情況下,我寧願將輸出顯示在運行應用程序的當前控制檯窗口中。謝謝你的想法。 –

+1

增加了一個版本,而不附加到控制檯新的控制檯 – bummi

+4

也是錯誤的。當命令解釋程序啓動非控制檯程序時,它不會等待程序在繼續運行之前完成運行。在這種情況下,命令解釋程序將打印另一個提示,以及可能或可能無法獲得非控制檯程序打印自己的文字相同的控制檯前打印。如果你想使用你的父進程的控制檯,你必須從一開始就是一個控制檯程序。 –