Delphi Programming / Object Pascal
[掲載 2007年04月01日] [更新 2016年05月05日] Delphi サンプルプログラム集 |
827_デバッグ中の実行か EXE 実行かを判定 |
動作確認等 |
Windows 7 U64(SP1) + Delphi XE(UP1) Pro |
|
827_IDEorEXE.zip [2,215 KB] 2016年05月05日版 (EXE 同梱) |
- 2010年11月27日
- ページの URL を [820_XXX] から [827_XXX] に変更.ダウンロードファイル名も変更
- 2013年06月11日
- コードの整備.Delphi XE Pro で動作確認
- 環境変数を実パスに変換するサンプルを追加
|
01_デバッグ中の実行か,作成した EXE ファイルの実行かを知る |
例えばデータベースのアプリケーションの開発などで,開発中はログインダイアログを表示せず,作成した EXE ファイルを直接実行した時は表示したい場合があります.そのような時にデバッグ (開発) 中での実行かを判定できると便利です.
このサンプルプログラムのコードは,その方法の一つです. |
本サンプルで使用しているログインダイアログは,Delphi XE(UP1) Pro の場合,デフォルトでは英語表記になるようです.ライブラリパスに以下を追加すると日本語表記になります.
|
|
図1
設計時画面 |
|
図2
実行結果
- 作成した EXE ファイルを起動した場合
- IDE でコンパイルして実行した場合は,このダイアログは表示されない
|
リスト1
開発中と単独 EXE 実行で実行内容を変える |
unit IDEorEXEUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses
DBLogDlg;
{$R *.dfm}
//=============================================================================
// DebugHook関数を使用してデバッグ時とEXE実行時を判定
// LoginDilaogEx関数の使用にはusesにDBLogDlgが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LUser : String;
LPass : String;
begin
if DebugHook <> 0 then begin
//デバッグ中はログインダイアログ表示なし
end else begin
LoginDialogEx('接続テスト', LUser, LPass, False);
end;
end;
end.
IsDebuggerPresent 関数も,IDE での実行か,EXE を実行したかの判定に利用できます. |
//=============================================================================
// IsDebuggerPresent関数を使用してIDEでの実行時とEXE実行時を判定
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
if IsDebuggerPresent then begin
MessageBox(Handle, 'デバッグ中です', '結果', MB_ICONINFORMATION);
end else begin
MessageBox(Handle, 'EXE 実行です', '結果', MB_ICONINFORMATION);
end;
end;
デバッグ時ということは,Delphi の IDE から実行していることになります.
つまり,本項のサンプルは,デバック環境での実行か,そうでない環境での実行なのかの判定方法ということになります.
Delphi の IDE は管理者権限で実行しなけれぱ,正常に機能しません.以下のコードは,自分自身が管理者権限で実行しているかを調べる 1 つの方法です.
実際には,上のコードと組み合せて使用することになるでしょう.この関数は,IDE 自身が管理者権限で起動しているかの判定には利用できませ.
|
//IsUserAnAdminの使用には,usesにShlObjが必要
if IsUserAnAdmin then begin
//管理者権限で実行中
end else begin
//管理者権限以外で実行中
end;
前項のサンプルは,デバッグ時と EXE の直接実行時の判定でした.
以下のサンプルは,Debug 版か Release 版かの判定用のコード例です.デバッグ版とリリース版の切り換えは,プロジェクトマネージャのビルド構成で行いますが,切り換えたら,プロジェクトの再構築あるいはビルドをしないと,正しく判定できないことがあります.
Delphi で新規にプロジェクトを作成した場合は,Debug 版がデフォルトのビルド構成です.
|
|
図3
デバッグ版 |
|
図4
リリース版 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//=============================================================================
// デバッグ版かリリース版かの判定の方法
// ビルド構成(デバッグかリリース版)を変更したらプロジェクトを再構築(ビルド)する
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
{$IFDEF DEBUG}
MessageBox(Handle, 'デバッグ版です', '結果', MB_ICONINFORMATION);
{$ENDIF}
{$IFDEF RELEASE}
MessageBox(Handle, 'リリース版です', '結果', MB_ICONINFORMATION);
{$ENDIF}
end;
end.
03_環境変数 $(DELPHI) または $(BDS) を取得 - デバッグ時のみ有効 |
デバッグ時と EXE の直接実行時の違いと言えば.例えば Delphi の環境変数,$(DELPHI) とか $(BDS) があります.これらの値は Delphi のインストール先のディレクトリを意味していますが,デバッグ時にのみに取得可能な値です.デバッグ時というのは IDE からの実行という意味です.
下のリストはその取得例です. |
|
図5
デバッグ時の実行画面 |
|
図6
作成した EXE を直接実行した結果 |
リスト3
環境変数 $(DELPHI) または $(BDS) を取得
- デバッグ時のみ有効 |
unit GetDelphiPathUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button2: TButton;
procedure Button2Click(Sender: TObject);
private
{ Private 宣言 }
function GetDelphiPath(APath : string): string;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//=============================================================================
// Delphiの環境変数($(DELPHI)または$(BDS)のフルパスを取得
// デバッグ時のみ有効
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LText : string;
begin
//IDE実行時のみ実行
if DebugHook <> 0 then begin
LText := GetDelphiPath('$(DELPHI)\Lib');
Application.MessageBox(PChar(LText), 'デバッグ');
end else begin
Application.MessageBox('EXE を直接実行しても取得できません', 'EXE 実行');
end;
end;
//-----------------------------------------------------------------------------
// Delphiの環境変数($(DELPHI)または$(BDS))のフルパスを取得する関数
// ただしこの関数は,どのDelphiで実行しているかという情報なのでデバッグ時(IDE
// で操作時)のみ有効(EXEの直接実行ではDelphiのバージョンは無関係)
//-----------------------------------------------------------------------------
function TForm1.GetDelphiPath(APath: string): string;
var
LText : string;
begin
Result := APath;
if Pos('DELPHI', APath) > 0 then begin
LText := SysUtils.GetEnvironmentVariable('DELPHI');
if Trim(LText) <> '' then
Result := StringReplace(APath, '$(DELPHI)', LText, [rfIgnoreCase,rfReplaceAll]);
end else
if Pos('BDS', APath) > 0 then begin
LText := SysUtils.GetEnvironmentVariable('BDS');
if Trim(LText) <> '' then
Result := StringReplace(APath, '$(BDS)', LText, [rfIgnoreCase,rfReplaceAll]);
end;
end;
end.
04_環境変数のパスを実パス名に変換 - デバッグ時のみ有効 |
上のサンプルでは,1 つの環境変数の実パスを取得しました.
このサンプルは,複数の環境変数を含む文字列を,実際のフルパスに変換します.デバッグ時というのは IDE からの実行という意味です. |
|
図7
設計時画面 |
|
図8
Edit1 の値を変換する |
|
図9
実行結果例 |
リスト4
環境変数のパスを実パス名に変換 - デバッグ時のみ有効 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
function GetDelphiPath(APath : string): string;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses
HTTPApp;
{$R *.dfm}
//=============================================================================
// テスト用の値をセット
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text := '$(BDSLIB)\$(Platform)\debug';
end;
//=============================================================================
// Delphiの環境変数を含むフルパスを取得
// デバッグ時のみ有効
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
//IDE実行時のみ実行
if DebugHook <> 0 then begin
Application.MessageBox(PChar(GetDelphiPath(Edit1.Text)), '結果');
end else begin
Application.MessageBox('EXE を直接実行しても取得できません', '結果');
end;
end;
//-----------------------------------------------------------------------------
// Delphiの環境変数のパスをフルパスに変換
// どのDelphiで実行しているかという情報なのでデバッグ時のみ有効
//-----------------------------------------------------------------------------
function TForm1.GetDelphiPath(APath: String): string;
const
LDelimiters : TSysCharSet = [')'];
LWhiteSape : TSysCharSet = ['$', '(', '\', '/'];
var
LStrList : TStringList;
LText : string;
i : Integer;
begin
Result := '';
LStrList := TStringList.Create;
try
HTTPApp.ExtractHTTPFields(LDelimiters, LWhiteSape, PChar(Trim(APath)), LStrList);
for i := 0 to LStrList.Count - 1 do begin
if Trim(LStrList[i]) <> '' then begin
LText := SysUtils.GetEnvironmentVariable(LStrList[i]);
if LText <> '' then begin
if i = 0 then begin
Result := Result + LText;
end else begin
Result := IncludeTrailingPathDelimiter(Result) + LText;
end;
end else begin
if Result <> '' then begin
Result := IncludeTrailingPathDelimiter(Result) + LStrList[i];
end else begin
Result := Result + LStrList[i];
end;
end;
end;
end;
finally
FreeAndNil(LStrList);
end;
end;
end.
|