現在、2重起動防止のため下記のようなコードにしています。 Delphiではデバッグ実行時のフォームも2重起動の対象となるため、開発環境があるときは、2重起動のチェックをしないようにしてあります。
これでうまく行くのですが、何だか野暮ったい気がします。 こう少しスマートな解決策はないでしょうか?
program Sample;
uses
Forms,
Windows, Dialogs,
uFrmSample in 'uFrmSample.pas' {frmSample};
{$R *.res}
var
MainWnd: THandle;
begin
{Delphi開発環境の存在をチェックする}
MainWnd := FindWindow(nil, 'delphi 6');
if MainWnd = 0 then begin
{間発環境が実行中でなければ2重起動をチェックする}
MainWnd := FindWindow('TFrmSample', nil);
if MainWnd <> 0 then begin
ShowMessage('既に起動しています');
SetForegroundWindow(MainWnd);
Exit;
end;
end;
Application.Initialize;
Application.CreateForm(TfrmSample, frmSample);
Application.Run;
end.
以上、よろしくおねがいします。
No.3ベストアンサー
- 回答日時:
実現したいことは(FindWindowではIDE使用時に誤動作してしまうので)FindWindow以外での二重起動の防止ではありませんか。
もしそうでしたらMutexを使ってみてはどうでしょう。「delphi 二重起動防止」などで検索するとたくさん現れます。
的確な回答ありがとうございます。
ミューテックスを使った方法は知っていましたが、何だか難しそうなので敬遠していました。 でも、今回の質問を機に"くろねこ研究所"を参考にして、下記のコードで動作確認をしてみました。
program Sample;
uses
Forms,
Windows,
Dialogs,
uFrmSample in 'uFrmSample.pas' {frmSample};
{$R *.res}
var
hMutex: THandle;
MainWnd: THandle;
begin
//Mutexを作成する
hMutex := CreateMutex(nil, true, 'Sample');
//Mutexが既に存在しているか判断する
if (hMutex <> 0) and
(GetLastError() = ERROR_ALREADY_EXISTS) then begin
//存在していた場合、そのインスタンスを再前面にする
MainWnd := FindWindow('TFrmSample', nil);
ShowMessage('既に起動しています');
SetForegroundWindow(MainWnd);
Exit; //起動中止
end;
Application.Initialize;
Application.CreateForm(TfrmSample, frmSample);
Application.Run;
//ミューテックスの開放
if (hMutex <> 0) then ReleaseMutex(hMutex);
if (hMutex <> 0) then CloseHandle(hMutex);
end.
結果、非常にうまくいっています。 デバッグ実行でもEXEからの実行でも期待どおりの動作をしました。 これからは、ミューテックスを使った方法に切り替えることにします。
(以前からの方法でも同じですが、ユニークな名前を作成するとき注意が必要ですね。)
No.2
- 回答日時:
コンパイルスイッチを参照するようにしてみてはいかがでしょう
{$IFOPT D+}
// デバッグ情報の生成オプションがついている場合
{$ENDIF}
といった具合です
ご親切な回答ありがとうございます。
動作を確認しました。 しかしこの方法では、リリースするときデバッグオプションを外し忘れると、先の状況と同じになります。
(別にサイズやリバースエンジニアリングに気を使っていないので、通常はデバッグオプションをチェックしたままリリースしています。)
No.1
- 回答日時:
プロジェクトのオプション > ディレクトリ/条件タブの『条件定義(C)』にDEBUGなどを定義しておきます
デバッグ時に実行させたいコードを
{$IFDEF DEBUG}
// ここにデバッグ時のコードを記述
{$ENDIF}
といった具合にしましょう
Delphiのヘルプで『条件コンパイル』などを検索してみてください
すばやい回答ありがとうございます。
私の質問のポイントが曖昧だったようです。ソースコードや環境設定を変えずにデバッグ実行なのかEXEからの実行なのかを識別する方法はないでしょうか?
ご指摘の方法だと、直接{$DEFINE DEBUG}と書いてから条件分けするのと同じで、リリースコンパイルするときにDEBUGを削除し忘れる可能性があります。(とういか忘れた経験があります。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのエラーについて 2 2023/08/02 17:46
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Visual Basic(VBA) エクセルで、1つのセルで上書き足し算して セルの範囲を指定できますか? パソコン初心者です。 お時間 3 2023/07/05 06:13
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Visual Basic(VBA) VBAで実行時エラー'424' オブジェクトが必要ですと出る 2 2022/10/07 09:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MacBookAir起動時にRubyソース...
-
デスクトップパソコンのSSD化を...
-
windows10でハンゲーム起動でき...
-
BUWはインストールできました。...
-
C#からvbsを実行したい
-
jdk17.06のインストーラーが起...
-
Media Gallery?勝手に起動
-
wordとexcelについて
-
ctfmon.exe。スタック ベースの...
-
外部アプリケーション操作
-
web.configとは?(初心者です)
-
IUSR でCreateObject("Excel.Ap...
-
2つの異なるサーバーのDBを扱う
-
VB.NET Oracle接続 クライアン...
-
ActiveXをダウンロードさせてた...
-
Program FilesとProgram Files ...
-
GridviewとDataGridviewの違い
-
pixus mp630 ドライバインストール
-
レンタルサーバー上のMySQL
-
IIS
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TeraTermマクロの”Link...
-
コマンドボタンのキャプション...
-
C#からvbsを実行したい
-
信長の野望 革新について
-
Media Gallery?勝手に起動
-
Windowsが起動しなくなってしま...
-
audiveris(pdf楽譜を読み込む...
-
MacBookAir起動時にRubyソース...
-
jdk17.06のインストーラーが起...
-
タイマーマクロの二重起動防止...
-
ゆっくりムービーメーカーのエ...
-
VB.NETからLINUXのSH起動
-
windows10でハンゲーム起動でき...
-
コマンドプロンプトのERRORLEVE...
-
「cronから1分毎に起動→処理」 ...
-
Java デスクトップアイコン変更
-
ネットワークフォルダが開かない
-
デスクトップパソコンのSSD化を...
-
WSH(Windows Script Host)の...
-
Apache2.2起動しない・・・助け...
おすすめ情報