LoginSignup
3

More than 5 years have passed since last update.

Application.ExeName 作ったよ

Posted at

TApplication.ExeName

これは Delphi Advent Calendar 補欠の記事です。

VCL でおなじみの Application.ExeName は FMX には存在しません。
同じ効果を持つものとして ParamStr(0) を使うと、言われてきました。
これで、確かに Windows や OS X では正しく動作するのです。

しかし!!

Android では、正しく動作しません。
でも、そもそも Android では、何を返すべきなのでしょうか…?
apk のパス? classes.dex のパス??
…何が正解か判らないから ParamStr(0) は値を返さないのかもしれません。

今回はアプリの全てが含まれる apk が一番近いかなあと思い「ExeName は apk のパスを返す」と規定しました。

apk のパスは Context.getPackageCodePath で取得できます。
ApplicationInfo などからも取得できます)。

// Application(apk) のパスが返る
TAndroidHelper.Context.getPackageCodePath;

TApplicationHelper

これをラッピングした TApplication のヘルパクラスを作りました。

ソースはこちら
※コードの使用や改変はご自由にどうぞ

これを uses すれば、こんな風に ExeName が使えるようになります。

implementation

{$R *.fmx}

uses
  FMX.ApplicationHelper;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Application.ExeName);
end;

取れる値の例

  • Windows

    C:\Source\Delphi\ExeName\Win32\Debug\Project1.exe

  • OSX

    /Users/UserName/PAServer/scratch-dir/SDKVersion/Project1.app/Contents/MacOS/Project1

  • iOS

    /var/mobile/Containers/Bundle/Application/AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA/Project1.app/Project1

  • Android

    /data/app/com.embarcadero.Project1.apk

まとめ

Android の ExeName って結局何を返すのが正解なんでしょうね!?
あと、TApplicationHelper と言いながら1個しか機能が追加されないし、TApplication に依拠してるわけでもないので、普通の関数にしたほうが良いかもしれませんね!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3