Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


Delphi アプリケーションパスの取得(Windows)

DelphiアプリケーションからiniファイルやExcelファイルなどを参照する場合には、
プログラム上でファイルパスを指定する必要があります。

EXEアプリケーションはPC上の自由な場所に配置することができますが、
iniファイルやExcelファイルを一緒に場所移動してしまうと、
参照するファイルパスが変わってしまいます。

そうした場合には、アプリケーション自身のファイルパスを利用することで
動的に参照先を指定することができます。

アプリケーションが実行されているファイルパスを取得する場合
Application.Exename』または『ParamStr(0)
で取得することができます。
※「ParamStr(0)」は「EXEの実行時引数の0番目」という意味ですが、詳細は別記事で解説します。

 

// 例) C:\Temp\Test.exe を実行した場合
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  // EXEファイルパスを表示・・・ "C:\Temp\Test.exe"
  ShowMessage(Application.Exename);
end; 

またフォルダのパスだけを取得したい場合は、
ExtractFilePath関数を組み合わせることで簡単に取得できます。
この関数は、引数のファイルが所属するフォルダパスを末尾「\」付きで返します。

// 例)EXEが配置されているフォルダの取得
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  //EXEフォルダパスを表示・・・ "C:\Temp\"
  ShowMessage(ExtractFilePath(Application.Exename));
end; 

EXEファイルと同じフォルダにあるiniファイルやExcelファイルであれば、

  • ExtractFilePath(Application.Exename) + iniファイル名
  • ExtractFilePath(Application.Exename) + Excelファイル名
  • ExtractFilePath(Application.Exename) + ‘..\..\’ + textファイル名(※相対パスも指定可能)

といった書式を指定することで、配置場所が変わっても動的に参照することができます。


また、以下のように共通関数を作成しておくと変数のように呼び出すことも可能です。

// 例)共通関数化
{*******************************************************************************
 目的: EXEの階層を返す
 引数:
 戻値: EXEの階層(後ろに「\」付き)
*******************************************************************************}
function AppFolder: string;
begin
  Result := ExtractFilePath(Application.Exename);
end;

共通関数(今回の例では「AppFolder」)を通す場合、
先ほどのロジックを以下のように簡略化できます。

  • AppFolder + iniファイル名
  • AppFolder + Excelファイル名
  • AppFolder + ‘..\..\’ + textファイル名(※相対パスも指定可能)

 


 

なお、IntraWeb(VCL for the Web)の場合は以下のように結果が少々異なります。

  • スタンドアローン(EXEファイル作成モード)の場合:
    上記と同様に「Application.Exename」を実行するとEXEのパスが返ります。
  • ISAPI(DLLを作成してIIS上で動作させる)の場合:
    Application.Exenameを実行すると、IISのワーカープロセスのパスが返ります。
    (32bit DLLの場合、C:\Windows\SysWOW64\inetsrv\w3wp.exe )
    (64bit DLLの場合、C:\Windows\System32\inetsrv\w3wp.exe )

DLLファイルの場所をIntraWeb内から取得するためには、
IntraWebの別関数が必要となります。

関数によって、以下のような値が取得できます。
(下記は IntraWeb 15 で、例としてWindows ServerのIISで動作中の
 「C:\inetpub\support\Project15.dll」に対して関数を実行した場合となります。)

  • IncludeTrailingPathDelimiter(WebApplication.ApplicationPath)
    • サーバー内のDLLのパスが取得できます。
      取得値の例:「C:\inetpub\support\」
  • IncludeTrailingPathDelimiter(TIWAppInfo.GetAppPath)
    • こちらでも、サーバー内のDLLのパスが取得できます。
      取得値の例:「C:\inetpub\support\」
      • ※ IntraWeb 11以前で使用できていた「IWServerController.AppPath」は、14以降ではこの形式に変更となっています。uses節に「IW.Common.AppInfo」が必要です。
  • IncludeTrailingPathDelimiter(IWServerController.ContentPath) + ‘..\’
    • サーバー内のDLLのパスに「wwwroot」が付いた値が取得されます。
      「..\」を付加することでWebApplication.ApplicationPathと同様の値を参照できます。
      別階層のINIファイルや画像の場所を指定する際はこの方法が一般的です。
      取得値の例:「C:\inetpub\support\wwwroot\..\」
  • WebApplication.ApplicationURL
    • ブラウザ上のURLを取得します。相対パスでリンクを作成する際に有効です。
      取得値の例:「http://localhost:80/support/Project15.dll」

※ IntraWeb 11以前で使用できていた「IWServerController.InternalFilesDir」は、14以降ではコンパイルエラーになります。

 

 

(ミガロ.情報マガジン「MIGARO News!!」Vol.154 2013年9月号の内容にIntraWebの内容を追記)