fОткрыть с параметрами, не работает правильно - PullRequest
1 голос
/ 04 февраля 2012

Добрый вечер!

В настоящее время я нахожусь на первых этапах разработки нового приложения в 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" в isdef MSWINDOWS.

В моей форме с 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, но ни одна из них не устранила проблему.

Я уверен, что это что-то чрезвычайно простое, что мне здесь не хватает. Я так привык использовать PChar или PWideChar для такого рода вещей в VCL, что это отбросило меня.

Есть идеи?

1 Ответ

2 голосов
/ 04 февраля 2012

Как мы выяснили в комментариях, проблема в том, что диалоговое окно файла меняет рабочий каталог за вашей спиной.Вы можете и должны установить параметр ofNoChangeDir.

Однако я рекомендую не полагаться на относительные пути при запуске процессов.Когда вы запускаете процессы, вам действительно следует строго контролировать местоположение процесса.Я бы сделал это так:

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