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