おはよう!fOpenでパラメータが正しく動作しない
私は現在、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
機能を使ってみましたが、どちらも問題を解決していません。
私はここで紛失していると非常に簡単なことだと確信しています。私はPChar
またはPWideChar
をVCLのこのような種類のものに使用することに慣れています。
アイデア?
Firemonkeyは、Windowsで実行してShellExecuteを呼び出しているので、ここでは関係ありません。右? 'Edit1.Text'に完全修飾パスを入れていますか?私にとって唯一のことは、 'Edit1.Text'でファイルへの完全なパスがないことです。編集コントロールに 'C:\ Windows \ Notepad.exe 'と入力するとうまくいくと思います。 –
@DavidHeffernanそれは変です。今私はそれを入力し、 "ブラウズ"ボタンとTOpenDialogをバイパスして、それは正常に動作します。 –
ファイルダイアログを使用してブラウズすると、作業ディレクトリが変更されます(その機能を無効にしない限り)。おもう。多分それは起こっていることです。あなたの抽出プログラムは現在のディレクトリに敏感ですか? ShellExecuteへの呼び出しの作業ディレクトリパラメータに 'ExtractFilePath(Application.ExeName)'を渡すことができます。これは、新しいプロセスの作業ディレクトリを、ファイルダイアログを使用していない場合と同じように強制します。おもう。とにかく、答えはどこかにある! –