如何创建不终止的控制台应用程序?

Iva*_*nov 2 delphi console multithreading console-application delphi-2009

在C++中,控制台应用程序可以在其Winmain过程中使用消息处理程序.如下所示:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hwnd;
    MSG msg;

    #ifdef _DEBUG
    CreateConsole("Title");
    #endif

    hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
    PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
    while(msg.message != WM_QUIT)
    {
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if(IsDialogMessage(hwnd, &msg))
                continue;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这使得进程在控制台窗口收到WM_QUIT消息之前不会关闭.我不知道如何在delphi中做类似的事情.

我的需求不仅仅是消息处理程序,而是一个轻量级的"技巧",使控制台应用程序像使用线程的GUI应用程序一样工作.因此,例如,可以在没有控制台应用程序终止进程的情况下处理两个Indy TCP服务器.

我的问题:如何实现这一目标?

mgh*_*hie 8

我不确定我理解你需要做什么,但也许是这样的

program Project1;

{$APPTYPE CONSOLE}

uses
  Forms,
  Unit1 in 'Unit1.pas' {DataModule1: TDataModule};

begin
  Application.Initialize;
  Application.CreateForm(TDataModule1, DataModule1);
  while not Application.Terminated do
    Application.ProcessMessages;
end.
Run Code Online (Sandbox Code Playgroud)

让你开始?它是一个控制台应用程序,将在控制台关闭时终止.您可以在数据模块中使用Indy组件.

编辑:

没有Forms单位的替代方案是:

program Project1;

{$APPTYPE CONSOLE}

uses
  Windows;

var
  Msg: TMsg;
begin
  while integer(GetMessage(Msg, 0, 0, 0)) <> 0 do begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end.
Run Code Online (Sandbox Code Playgroud)

但是我认为这对大多数Delphi组件都不起作用 - 我不知道Indy,但是如果其中一个单元带来了Forms单元,那么第一个版本是IMO的首选.