【问题标题】:execute an application from DELPHI code, FMX framework issue从 DELPHI 代码执行应用程序,FMX 框架问题
【发布时间】:2021-10-07 10:39:21
【问题描述】:

如何运行应用程序被广泛描述,一个很好的来源code by Zarko Gajic 我们使用这样的修改版本,在 Windows 和 VCL 框架下完美运行

var
  ExitCode : DWORD;
  SEInfo : TShellExecuteInfo;
begin
  ///
  ///  Execute shell function from Delphi Code 
  ///
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);
  WITH SEInfo DO
  begin
    fMask := SEE_MASK_NOCLOSEPROCESS;
    Wnd := OurClass.Handle;
    lpFile := PWidechar(EXENAMESTR);
    lpParameters := PWidechar(ParameterFile);
    nShow := SW_SHOWNORMAL;
  end;
  ///
  ///  Follow up our process 
  /// 
  if ShellexecuteEx(@SEInfo) then
  begin
    repeat
      GetExitCodeProcess(SEInfo.hProcess, ExitCode);
    until (ExitCode <> STILL_ACTIVE) OR Application.Terminated;
  end;

问题:我们无法在 FMX 框架应用程序中将此代码编译为 Wnd := OurClass.Handle;失败,句柄没有定义,如何解决这个问题? 最佳解决方案是适用于两种框架 VCL&FMX 的代码。

【问题讨论】:

  • 请注意Wnd 是可选的。
  • 附带说明,您应该在循环中设置睡眠以避免占用所有 CPU(或者更好的是,使用 WaitForSingleObject())。
  • OurClass 到底是什么对象/类型?只有 FMX 表单有 Handle,子控件没有。即便如此,Handle 也不是 Win32 HWND,就像在 VCL 中一样,您可以使用 FMX.Platform.Win.FormToHWND() 来获取实际的 HWND

标签: delphi


【解决方案1】:

这仅适用于 Windows。你不需要指定一个 Windows 句柄来启动一个程序,所以你可以安全地传递 0(或 nil,如果它抱怨)。

我记得这是用来确保新程序的主窗口在 z 顺序中位于调用程序的主窗口上方(因此它是可见的)。

您也可以改用 Windows SDK CreateProcess 调用。

【讨论】:

    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多