【问题标题】:Firemonkey application - launch external app when running under OS XFiremonkey 应用程序 - 在 OS X 下运行时启动外部应用程序
【发布时间】:2017-04-28 06:10:08
【问题描述】:

我有一个 Firemonkey 应用程序(Delphi Berlin 10.1)并希望从中启动一个外部程序。 (外部程序是帮助文件查看器。)

当我为 Win32 编译时,我可以简单地这样做(当外部程序与主可执行文件位于同一文件夹中时):

path := ExtractFilePath(ParamStr(0));
path := path + 'MyViewer.exe';
ShellExecute(0, 'open', PWideChar(path), nil, nil, SW_SHOWNORMAL);

当我为 OS X 编译时,我有外部程序 MyViewer.app 的 Mac 版本。我应该把它放在哪里?如何将它放入 PAServer 创建的包中?启动它需要什么代码?

【问题讨论】:

  • 当心! ShellExecute 适用于 Windows 但不适用于 OS X,它们没有相同的系统调用集。 OS X 应该有“开放”
  • @AlbertoMiola 也许我的问题不清楚。我在两个问题上寻求帮助。 (1) 如何从我的 Firemonkey 应用程序启动 OS X 应用程序? (2) 如何使用我的 Firemonkey 应用部署 OS X 应用?

标签: macos delphi firemonkey


【解决方案1】:
  1. 这显示了 Windows 和 OSX 的等效项:

    uses
    {$IFDEF MSWINDOWS}
    winapi.shellapi
    {$ENDIF}
    {$IFDEF POSIX}
    Posix.Stdlib
    {$ENDIF POSIX}
    ;
    
    function ExecuteFile(const filename, Params, DefaultDir: string;
          ShowCmd: integer): THandle;
      begin
        {$IFDEF MSWINDOWS}
          result := ShellExecute(0, 'Open', PChar(filename), PChar(Params),
            PChar(DefaultDir), ShowCmd);
        {$ENDIF}
        {$IFDEF MACOS}
          _system(PAnsiChar('open ' + AnsiString(filename)));
        {$ENDIF}
      end;
    
  2. 我通过在制作第一个包后将另一个签名包放在第一个包内的任何位置来做到这一点。我认为您可以使用 Delphi 中的 Deploy 页面将其他应用程序放入捆绑包中,只需将其他可执行文件(不是捆绑包)放在 Delphi 放置主应用程序代码的相同位置即可。

【讨论】:

  • 感谢您的有用建议。使用您的代码,我能够通过手动将其捆绑包放置在“/Users/[username]/PAServer/scratch-dir/[profile]/MyViewer.app”来成功启动辅助应用程序(我们称之为 MyViewer.app)。您将辅助应用程序的可执行文件(而不是其捆绑包)放入 Delphi 的 OSX32/Debug 目录的建议对我不起作用,因为 Delphi 似乎没有将它部署到 Mac。
  • 实际上,我有两个 Mac OS 应用程序要部署 - 一个是我自己在 Firemonkey 中编写的,另一个是由其他人编写的,我将其作为单独的捆绑包。在通过 Paserver 进行测试时,我还没有弄清楚如何从 IDE 部署第二个。但是,如果我使用“Packages”软件s.sudre.free.fr/Software/Packages/about.html 将两个应用程序打包成一个 .pkg,那么一切正常
  • 当通过 Paserver 从 IDE 运行 FMX Mac 应用程序时,应将辅助应用程序(由主应用程序启动的应用程序)添加到部署管理器,并将其远程路径设置为“Contents\苹果系统”。然后辅助应用程序将位于主应用程序启动的正确位置。
  • 您好:我需要使用视频文件和字幕文件作为标志参数打开“VLC”。我已经在 app pah 之后连接了参数,文件和应用程序的路径,用单个“'”括起来。没用,应用程序没有启动,也没有消息显示。我还将命令字符串保存在文本文件中,以测试问题是否出在命令语法上,但文本文件的输出通过直接在命令窗口上运行来工作。是否有另一种可以在 Windows.ShellExecute 上调用的方法,具有“param”参数?这种方法合适吗?
猜你喜欢
  • 1970-01-01
  • 2012-04-27
  • 2011-08-03
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
相关资源
最近更新 更多