fOpen with Parameters无法正常工作

时间:2012-02-03 20:13:41

标签: delphi delphi-xe2 firemonkey

晚上好!

我目前处于开发的第一阶段,在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来处理这些事情了,它让我失望了。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

正如我们在评论中所做的那样,问题是文件对话框正在改变你背后的工作目录。您可以而且应该设置ofNoChangeDir选项。

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

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