代码之家  ›  专栏  ›  技术社区  ›  HeartWare

作为控制台和gui的程序[复制]

  •  24
  • HeartWare  · 技术社区  · 16 年前

    有没有可能(如果有,我怎么做)使用Delphi2007使一个程序同时作为控制台应用程序和图形用户界面版本工作?

    我所追求的是,如果程序使用适当的命令行选项运行,它应该作为控制台程序运行,使用writeln将输出打印到控制台,但是如果没有命令行参数,它应该作为普通的delphi gui应用程序运行?

    问题是,当作为控制台应用程序运行时,命令行解释器在允许您输入新命令之前等待应用程序终止,而从命令行启动的gui应用程序会立即返回到命令行,并且gui应用程序是在分离的进程中启动的。我要保留这种行为。

    我不介意这样的事:

    如果是gui,则启动应用程序gui(paramstr(0))

    也就是说,如果需要的话,我不介意使用某种形式的execute调用重新启动应用程序,以gui模式启动它,只要在gui版本启动时命令行界面返回到命令行输入。

    我想要一个大致如下的解决方案/建议:

    <分析命令行>
    如果控制台模式,则
    运行控制台(参数)
    否则开始
    应用程序初始化;
    application.createForm(…)
    应用程序。运行;
    结束

    (反之亦然,即在gui模式下以特殊方式执行任务)

    这样我仍然可以使用Delphi的IDE和VCL来制作GUI界面…

    5 回复  |  直到 13 年前
        2
  •  13
  •   Joey Gumbo    16 年前

    在windows上这有点棘手。实际上,控制台应用程序和gui应用程序之间的区别是pe报头中的单个标志。你可以很容易地编写控制台应用程序创建窗口,但这样你总是有控制台窗口周围(你可以隐藏它),但是,这将是不好的,当人们运行你的程序从 cmd )

    你 可以, 但是,如果需要,可以编写一个创建控制台的gui应用程序,使用 AllocConsole 功能:

    进程只能与一个控制台相关联,因此 分配控制台 如果调用进程已具有控制台,则函数将失败。一个过程可以使用 FreeConsole 函数将自己从当前控制台中分离,然后它可以调用 分配控制台 创建新控制台或 AttachConsole 连接到另一个控制台。

    如果调用进程创建子进程,则子进程将继承新控制台。

    分配控制台 初始化新控制台的标准输入、标准输出和标准错误句柄。标准输入句柄是控制台输入缓冲区的句柄,标准输出和标准错误句柄是控制台屏幕缓冲区的句柄。要检索这些句柄,请使用 GetStdHandle 功能。

    此功能主要由图形用户界面(gui)应用程序用于创建控制台窗口。在没有控制台的情况下初始化gui应用程序。控制台应用程序是用控制台初始化的,除非它们被创建为分离的进程(通过调用 CreateProcess 具有分离的进程标志的函数)。

    但是,当从 CMD 这可能会导致出现另一个控制台窗口,而不是重新使用现有的控制台窗口。我不知道那里是否有好的解决办法。

        3
  •  12
  •   JosephStyons    16 年前

    imo,这里最好的方法是使用非可视类来实际执行程序的工作。然后可以从gui程序调用它,也可以从单独的命令行程序调用它。两个程序都只是类功能的包装器。

    这也迫使设计变得干净-您的类必须与应用程序的gui层分离。

        4
  •  4
  •   Community Mohan Dere    9 年前

    windows在控制台和ui应用程序的可执行文件头中有不同的值(请参阅更多详细信息 here )因此,似乎不可能使同一个可执行文件在两种模式下都工作。

    作为替代,您可以在UI应用程序中打开控制台,但它将是新控制台,而不是您启动应用程序的控制台。

        5
  •  3
  •   JensG    13 年前

    attachconsole()可用于获取父控制台。 例如,如果应用程序从CMDLayShell启动,则可以避免AlCONCONSOLSORE():

    if not AttachConsole(ATTACH_PARENT_PROCESS)
    then AllocConsole;
    

    更多信息请点击此处: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681952(v=vs.85).aspx

    推荐文章