在GUI应用程序中使用控制台应用

时间:2011-07-03 15:15:29

标签: delphi console-application

如何创建可以使用或不使用GUI的控制台应用程序?

例如,假设我有一个控制台应用程序,如果我尝试从Windows资源管理器启动此控制台应用程序它将无法正常关闭,但我可以从我的GUI应用程序或Windows命令控制台(cmd。 exe)并将一些开关(参数?)传递给它。

这样可以在不启动GUI应用程序的情况下使用一些有用的函数,可以从命令行调用它们。

修改

我不确定如何创建控制台应用程序,尤其是接受标记(开关,参数?)。

我见过一些类似的应用程序。例如,他们可能有一个控制台应用程序,它将bmp转换为png,GUI调用此控制台应用程序并将参数等传递给它。

希望这是有道理的。

那么我怎么能雇用这样的东西呢?

感谢。

3 个答案:

答案 0 :(得分:4)

  

例如,假设我有一个控制台应用程序,如果我尝试从Windows资源管理器启动此控制台应用程序它将无法正常关闭,但我可以从我的GUI应用程序或Windows命令控制台(cmd。 exe)并将一些开关(参数?)传递给它。

工作。但是,一旦程序退出,控制台窗口就会消失。如果您希望在窗口关闭之前让用户有机会阅读控制台应用程序的输出,只需使用一个

结束程序即可
Readln;

Writeln('Press Enter to exit.');
Readln;

如果要在GUI应用程序中使用控制台窗口输出(或输入),可以试试AllocConsoleFreeConsole函数。

命令行参数(例如myapp.exe /OPEN "C:\some dir\file.txt" /THENEXIT)可用于所有类型的Windows应用程序,包括GUI应用程序和控制台应用程序。只需使用ParamCountParamStr函数。

如何创建接受命令行参数的控制台应用程序

在Delphi IDE中,选择“文件/新建/控制台应用程序”。然后写

program Project1;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

var
  freq: integer;

begin

  if ParamCount = 0 then
    Writeln('No arguments passed.')

  else if ParamCount >= 1 then

    if SameText(ParamStr(1), '/msg') then
    begin

        if ParamCount = 1 then
          Writeln('No message to display!')
        else
          MessageBox(0, PChar(ParamStr(2)), 'My Console Application',
            MB_ICONINFORMATION);

    end

    else if SameText(ParamStr(1), '/beep') then
    begin

      freq := 400;

      if ParamCount >= 2 then
        if not TryStrToInt(ParamStr(2), freq) then
          Writeln('Invalid frequency: ', ParamStr(2));

      Windows.Beep(freq, 2000);

    end;


end.

编译程序。然后打开命令处理器(CMD.EXE)并转到Project1.exe所在的目录。

然后尝试

C:\Users\Andreas Rejbrand\Documents\RAD Studio\Projects>project1
No arguments passed.

C:\Users\Andreas Rejbrand\Documents\RAD Studio\Projects>project1 /msg
No message to display!

C:\Users\Andreas Rejbrand\Documents\RAD Studio\Projects>project1 /msg "This is a test."

C:\Users\Andreas Rejbrand\Documents\RAD Studio\Projects>project1 /beep

C:\Users\Andreas Rejbrand\Documents\RAD Studio\Projects>project1 /beep 600

C:\Users\Andreas Rejbrand\Documents\RAD Studio\Projects>

如何传递三个参数

if ParamCount >= 1 then
begin

  if SameText(ParamStr(1), '/CONVERT') then
  begin

    // The user wants to convert

    if ParamCount <= 2 then
    begin
      Writeln('Too few arguments!');
      Exit;
    end;

    FileName1 := ParamStr(2);
    FileName2 := ParamStr(3);

    DoConvert(FileName1, FileName2);

  end;

end;

答案 1 :(得分:1)

  

这样可以在不启动GUI应用程序的情况下使用一些有用的函数,可以从命令行调用它们。

如果您希望应用程序成为GUI应用程序,但您希望通过传递命令行参数来覆盖GUI,那么请尝试这样的方式:

program Project1;

uses
  Forms,
  SysUtils,
  Windows,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  if ParamCount > 0 then
    Windows.MessageBox(GetDesktopWindow, PChar(ParamStr(1)), PChar('Test'), 0)
  else
  begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
end.

答案 2 :(得分:0)

我不知道如何在delphi中实现这一点但是在C#中我只是在传入任何命令行参数的情况下检查了Main方法,如果有则在没有运行GUI的情况下运行带有控制台的应用程序