【问题标题】:use Console Application with GUI Application?将控制台应用程序与 GUI 应用程序一起使用?
【发布时间】:2011-09-27 16:00:22
【问题描述】:

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

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

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

编辑

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

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

希望这是有道理的。

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

谢谢。

【问题讨论】:

  • 很难理解这是什么意思。 “它不起作用”部分很容易回答。事实上,它确实有效,我在下面的回答中谈到了它。
  • 是的,我认为我没有很清楚地解释我的问题,我正在考虑如何更好地改写它......
  • 您可能对这篇文章感兴趣:oldnewthing

标签: delphi console-application


【解决方案1】:

例如,假设我有一个控制台应用程序,如果我尝试从 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 中,选择 File/New/Console Application。然后写

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" 谢谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这样一些有用的功能甚至可以在不启动 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多