使用控制台应用程序与GUI应用程序?

6
我该如何创建一个控制台应用程序,使其可以带或不带图形用户界面(GUI)运行?
例如,如果我有一个控制台应用程序,如果我尝试从Windows资源管理器启动此控制台应用程序,它将无法工作并立即关闭,但我可以从我的GUI应用程序或Windows命令控制台(cmd.exe)中调用它并传递一些开关(参数?)给它。
这样,一些有用的功能可以在不启动GUI应用程序的情况下使用,它们可以从命令行调用。
编辑
我不确定如何创建接受标志(开关、参数?)的控制台应用程序。
我见过一些做类似事情的应用程序。例如,它们可能有一个控制台应用程序,用于将bmp转换为png,GUI调用此控制台应用程序并传递参数等。
希望这有意义。
那么我该如何实现类似的功能呢?
谢谢。

1
很难理解它的意思。"它不会工作"这部分很容易回答。事实上,它确实可以工作,并且我在下面的答案中谈到了它。 - Andreas Rejbrand
是的,我觉得我没有很清楚地解释我的问题,我正在考虑如何更好地重新措辞... - user741875
1
你可能会对这篇文章感兴趣:oldnewthing - Uwe Raabe
3个回答

8
例如,假设我有一个控制台应用程序。如果我尝试从Windows资源管理器启动此控制台应用程序,则它将不起作用,只会关闭。但是,我可以从我的GUI应用程序或Windows命令控制台(cmd.exe)调用它,并传递一些开关(参数?)给它。

它确实能够正常工作。但是,控制台窗口会在程序退出后立即消失。如果您想让用户在关闭窗口之前有机会阅读您的控制台应用程序的输出,请在结束程序时使用"exit code 0"命令。
Readln;

或者

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

如果您想在GUI应用程序中使用控制台窗口进行输出(或输入),可以尝试使用AllocConsoleFreeConsole函数。
命令行参数(例如myapp.exe /OPEN "C:\some dir\file.txt" /THENEXIT)可以在所有类型的Windows应用程序中使用,包括GUI应用程序和控制台应用程序。只需要使用ParamCountParamStr函数即可。
创建一个接受命令行参数的控制台应用程序的步骤: 1. 在Delphi IDE中选择文件/新建/控制台应用程序。 2. 然后编写相应的代码。
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;

Andreas,请问你能帮我将两个文件名作为参数传递吗?例如,从cmd.exe中输入类似于:/convert "file1.bmp" "file2.jpg",谢谢。 - user741875

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.

0

我不确定如何在Delphi中实现这一点,但在C#中,我只是在Main方法中检查是否传递了任何命令行参数,如果有,则使用控制台运行应用程序,如果没有则运行GUI。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接