【问题标题】:fOpen with Parameters not working correctlyfOpen with Parameters 无法正常工作
【发布时间】:2012-02-26 10:33:23
【问题描述】:

晚上好!

我目前正处于 Firemonkey 中的新应用程序开发的第一阶段。这是我第一次使用 Firemonkey,但我在 Delphi 有几年的经验。

到目前为止,我有一个外部应用程序,它从 exe 中提取图标,然后将其作为 BMP 保存到文件中。我已经编写了将参数传递给此应用程序的能力(它提供了一个字符串值来告诉它要从中提取的 .exe 的位置)。它是在 VCL 中构建的,因为我想将 firemonkey 框架主要用于 3D 功能,但如果我愿意,也允许我在未来的日期扩展到 Mac。外部应用程序工作正常,因此无需调整代码。

我遇到的问题是从我的 firemonkey 应用程序传递参数。我正在使用允许传递参数的自定义“fOpen”单元;

unit fOpen;

interface

uses
{$IFDEF MSWINDOWS}
Winapi.ShellAPI, Winapi.Windows;
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
  Posix.Stdlib;
{$ENDIF POSIX}

type
  TMisc = class
class procedure Open(sCommand, Params: string);
end;
implementation

class procedure TMisc.Open(sCommand, Params: string);
begin
{$IFDEF MSWINDOWS}
  ShellExecute(0, 'OPEN', PChar(sCommand), PChar(Params), '', SW_SHOWNORMAL);
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
  _system(PAnsiChar('open ' + AnsiString(sCommand)));
{$ENDIF POSIX}
end;
end.

如您所见,我已将“Params”变量添加到 MSWINDOWS isdef。

在我的 firemonkey 表单上,有 2 个按钮。其中 1 个执行 TOpenDialog 并将所选文件名输出到 TEdit。另一个按钮执行外部应用程序(提取图标的应用程序),然后加载保存到 TImageControl 中的位图图像。

这是我尝试使用的代码;

fOpen.TMisc.Open('HypExIcon.exe', '"' + edit1.Text +'"');

问题在于,应该使用参数执行文件的第一行实际上并没有按预期工作。它甚至根本不执行文件(即没有迹象表明应用程序应该启动)。但是,如果我将其更改为此...

fOpen.TMisc.Open('HypExIcon.exe', 'C:\Windows\Notepad.exe');

...它按预期运行,执行外部应用程序并创建包含在参数字段中的图标。我尝试过使用PChar('"' + Edit1.text + '"'),以及类似的PWideChar 函数,但它们都没有解决问题。

我相信我在这里缺少的东西非常简单。我已经习惯于在 VCL 中使用 PCharPWideChar 来处理这类事情,这让我很反感。

有什么想法吗?

【问题讨论】:

  • Firemonkey 在这里似乎不相关,因为您在 Windows 上运行并调用 ShellExecute。正确的?您是否将完全限定的路径放入Edit1.Text?对我来说唯一有意义的是您没有Edit1.Text 中文件的完整路径。我敢打赌,如果你在编辑控件中输入C:\Windows\Notepad.exe,它就会起作用。
  • @DavidHeffernan 这很奇怪。现在我输入它并绕过“浏览”按钮和 TOpenDialog,它工作正常。
  • 当您使用文件对话框浏览时,工作目录会发生变化(除非您禁用该功能)。我想。也许这就是正在发生的事情。您的提取程序是否对当前目录敏感?您可以在调用 ShellExecute 的工作目录参数中传递 ExtractFilePath(Application.ExeName)。如果您没有使用文件对话框,这将强制新进程的工作目录成为它的样子。我想。无论如何,答案就在某处!!
  • 啊,原来是这样!由于我将外部应用程序作为相对路径调用,因此更改工作目录会导致它尝试执行不存在的内容。将 ofNoChangeDir 更改为 true 解决了这个问题。非常感谢大卫!

标签: delphi delphi-xe2 firemonkey


【解决方案1】:

正如我们在 cmets 中解决的那样,问题在于文件对话框正在更改您背后的工作目录。您可以而且应该设置 ofNoChangeDir 选项。

但是,我建议您在启动进程时不要依赖相对路径。在启动进程时,您确实应该严格控制进程的位置。我会这样做:

AppPath := ExtractFilePath(Application.ExeName);
fOpen.TMisc.Open(AppPath+'HypExIcon.exe', ...

【讨论】:

    猜你喜欢
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多