• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB5.0 二重起動防止)

VB5.0 二重起動防止の方法は?

このQ&Aのポイント
  • OSWin98/VB5.0を使用しています。同一のシステムの重複起動を防止したいのです。
  • App.PrevInstanceで判断できると思うのですが、例1と同じ方法でもこの場合は、二重起動を防ぐことができません。
  • 他によい方法がある、ここがおかしいんじゃないの?等ありましたら、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#5584
noname#5584
回答No.2

> それでも二重起動ができてしまう Sub Main() が実行されていないのでは? MsgBoxを表示させる等、工夫して、必要な処理が間違いなく実行されているか確認してください。 尚、App.PrevInstanceプロパティで防止できる二重起動は文字通り同一の実行ファイルの場合のみです。同じEXEファイルでも、コピーして複数のフォルダに配置すれば二重起動は可能です。 Mutexを使用する方法であれば、上記のケース (別の場所に同一プログラムが複数存在)でも起動できるのは1つだけです。 [コード例] Option Explicit ' 指定されたクラス名とウィンドウ名を持つトップレベルウィンドウを探す。 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long ' 指定されたウィンドウが所有するポップアップウィンドウのうち、 ' 直前にアクティブであったウィンドウを調べる。 Private Declare Function GetLastActivePopup Lib "user32" _ (ByVal hWndOwnder As Long) As Long ' 指定されたウィンドウを作成したスレッドをフォアグラウンドにし、そのウィンドウをアクティブにする。 Private Declare Function SetForegroundWindow Lib "user32" _ (ByVal hwnd As Long) As Long ' 指定されたウィンドウの表示状態を設定する。 Private Declare Function ShowWindow Lib "user32" _ (ByVal hwnd As Long, _ ByVal nCmdShow As Long) As Long Private Const SW_RESTORE = 9 Private Declare Function OpenMutex Lib "Kernel32" Alias "OpenMutexA" _ (ByVal dwDesiredAccess As Long, _ ByVal bInheritHandle As Long, _ ByVal lpName As String) As Long Private Declare Function CreateMutex Lib "Kernel32" Alias "CreateMutexA" _ (ByVal lpMutexAttributes As Long, _ ByVal bInitialOwner As Long, _ ByVal lpName As String) As Long Private Declare Function ReleaseMutex Lib "Kernel32" (ByVal hMutex As Long) As Long Private Declare Function CloseHandle Lib "Kernel32" (ByVal hObject As Long) As Long Private Const SYNCHRONIZE As Long = &H100000 Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000 Private Const MUTEX_QUERY_STATE As Long = &H1 Private Const MUTEX_ALL_ACCESS As Long = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or MUTEX_QUERY_STATE 'ミューテックスオブジェクトのハンドル Private hMutex As Long 'メインフォームのキャプション Public Const pCstStrAppTitle = "Mutexによる重複起動防止" Public Sub Main() Dim strAppCaption As String Dim lngFirstTophWnd As Long Dim lngFirstPophWnd As Long Dim lngResult As Long '実行ファイルの場合のみ重複起動防止処理を行う。 If IsExeFile Then If IsMutexEntity(pCstStrAppTitle) Then ' 多重起動を許さない。 ' アプリケーションのキャプションを得る。 strAppCaption = App.Title ' 自アプリのキャプションを変更しておく。 App.Title = strAppCaption & Space(1) ' トップレベルのウィンドウハンドルを得る。 lngFirstTophWnd = FindWindow("ThunderRT6Main", strAppCaption) ' ちなみに、Visual Basic 5アプリの場合。 'lngFirstTophWnd = FindWindow("ThunderRT5Main", strAppCaption) ' 直前にアクティブなウィンドウハンドルを得る。 lngFirstPophWnd = GetLastActivePopup(lngFirstTophWnd) ' ウィンドウをアクティブにする。 lngResult = SetForegroundWindow(lngFirstPophWnd) ' 最小化されタスクバーに格納されてある場合があるので、ウィンドウを通常表示にさせる。 lngResult = ShowWindow(lngFirstPophWnd, SW_RESTORE) ' アプリケーションを終了させる。 End End If End If frmMain.Caption = pCstStrAppTitle frmMain.Show End Sub Public Function IsMutexEntity(ByRef strAppTitle As String) As Boolean 'Mutexが作成されているか調べる。作成されていなかったら作成する。 Dim strBuff As String strBuff = String(255, 0) Mid$(strBuff, 1, Len(strAppTitle)) = strAppTitle 'Mutexを開く。 hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, strBuff) 'Mutexオブジェクトがすでに存在する場合はハンドルをクローズし、終了。 If hMutex <> 0 Then Call CloseHandle(hMutex) IsMutexEntity = True Exit Function End If 'ミューテックスオブジェクトを作成する。 hMutex = CreateMutex(0, 0, strBuff) End Function Public Sub TerminateMutex() 'Mutexオブジェクトを解放する Call ReleaseMutex(hMutex) End Sub Public Function IsExeFile() As Boolean '実行ファイルか、IDE上の実行かを判定する。 On Error Resume Next Debug.Print 1 / 0 IsExeFile = CBool(Err.Number = 0) On Error GoTo 0 End Function

matyap
質問者

お礼

すみません。 私が大ボケでした。(二重起動を許可するかコマンドラインから引数を取得するところがうまくいっていませんでした。なので、二重起動チェックが起動していなかったのです。) 教えていただいたとおりにやってみるとできました。今日は一日はまっていたので、本当に助かりました。 本当に本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#5584
noname#5584
回答No.1

App.PrevInstanceプロパティを利用する方法は下記の通りです。(一例) ' 指定されたクラス名とウィンドウ名を持つトップレベルウィンドウを探す。 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long ' 指定されたウィンドウが所有するポップアップウィンドウのうち、 ' 直前にアクティブであったウィンドウを調べる。 Private Declare Function GetLastActivePopup Lib "user32" _ (ByVal hWndOwnder As Long) As Long ' 指定されたウィンドウを作成したスレッドをフォアグラウンドにし、そのウィンドウをアクティブにする。 Private Declare Function SetForegroundWindow Lib "user32" _ (ByVal hwnd As Long) As Long ' 指定されたウィンドウの表示状態を設定する。 Private Declare Function ShowWindow Lib "user32" _ (ByVal hwnd As Long, _ ByVal nCmdShow As Long) As Long Private Const SW_RESTORE = 9 Public Sub Main() Dim strAppCaption As String Dim lngFirstTophWnd As Long Dim lngFirstPophWnd As Long Dim lngResult As Long If App.PrevInstance Then ' 多重起動の禁止。 ' アプリケーションのキャプションを得る。 strAppCaption = App.Title ' 自アプリのキャプションを変更する。 App.Title = strAppCaption & " " ' トップレベルのウィンドウハンドルを得る。 lngFirstTophWnd = FindWindow("ThunderRT5Main", strAppCaption) ' Visual Basic 6.0アプリの場合。 'lngFirstTophWnd = FindWindow("ThunderRT6Main", strAppCaption) ' 直前にアクティブなウィンドウハンドルを得る。 lngFirstPophWnd = GetLastActivePopup(lngFirstTophWnd) ' ウィンドウをアクティブにする。 lngResult = SetForegroundWindow(lngFirstPophWnd) ' 最小化されタスクバーに格納されてある場合があるので、ウィンドウを通常表示にさせる。 lngResult = ShowWindow(lngFirstPophWnd, SW_RESTORE) ' アプリケーションを終了させる。 End End If End Sub ただし、.NETでは、このコードは使用できません。 VB以外の開発ツールでは、Mutex等を使用する方法が一般的なようです。 http://dobon.net/vb/dotnet/process/checkprevinstance.html  

参考URL:
http://dobon.net/vb/dotnet/process/checkprevinstance.html
matyap
質問者

補足

ありがとうございます。教えていただいたとおりにやっているのに、それでも二重起動ができてしまうとしたら、何か考えられる問題があるでしょうか。お心あたりがありましたら教えてください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • vb.net2003での二重起動防止について

    度々お世話になっています。 vb.net2003でアプリケーションを作りました。 そこで二重起動防止を行いたい為に、Process.GetProcessesByName メソッドを使用して行いました。 二重起動防止は出来ているのですが、ターミナルサービスでリモートデスクトップ接続を行い、同一ユーザーの二重起動防止はしたいですが、1ユーザーでも使用していたら 別ユーザーで起動できません。 何か良い方法はありませんでしょうか? 出来れば解説しているサイトがあれば教えて下さい。

  • VBについて教えてください。

    1.a.exeでShell関数でb.exe起動したときにa.exeはみれなくして   b.exeで終了するとb.exeはなくなりa.exeだけにしたいのですが   どうすればよいのかおしえてください。   a.vbp   RetVal = Shell("c:\b.exe", 1)   ← b.exeの起動 b.vbp end ← 終了   b.exeが起動中はヤククにa.exeがなくなり、b.exeが終了すると   a.exeが起動するようにしたいのです   よろしくお願いします。   WINDOWS98でvb6.0で開発しています。   

  • VB6での二重起動(複数起動)の制御について

    Visual Basic6で (1)test.exeを起動する (2)もう1回、test.exeを起動する ここで、(1)のtest.exeを終了して(2)のtest.exeを新たに起動したいです。 二重起動の禁止の方法は色々見つかるのですが、どれも2回目に起動した方を終了してしまいます…。 よろしくお願いします。

  • VB6 二重起動確実防止について

    VB6 SP5にて2重起動確実な防止処理をいれようとCreateMutex 関数を使用しようと思っています。 CreateMutex 関数を埋め込んでEXEを実行すると 実際に対象となるプログラムが起動しているにも関わらず起動してしまいます。 何がいけないのか?検討がつかず困っています。 下記がプログラムになります。 何かわかりましたらご回答の程、よろしくお願い致します。 ***Win32API**************** Option Explicit ' CreateMutex 関数 Private Declare Function CreateMutex Lib "KERNEL32.DLL" Alias "CreateMutexA" ( _ ByRef lpMutexAttributes As Long, _ ByVal bInitialOwner As Long, _ ByVal lpName As String _ ) As Long ' CloseHandle 関数 Private Declare Function CloseHandle Lib "KERNEL32.DLL" ( _ ByVal hObject As Long _ ) As Long ************************************ SUB MAIN********************************* Public Sub Main() Dim hMutex As Long hMutex = CreateMutex(ByVal 0&, 0&, App.Title) On Error GoTo Err_Main If Err.LastDllError = 0 Then Dim cForm As Form1 Set cForm = New Form1 Call cForm.Show(vbModal) End If Err_Main: If hMutex <> 0 Then Call CloseHandle(hMutex) End If End Sub ************************************************

  • 子プロセスのデバッグ方法について

    VisualStudio2008のVCでデバッグをしています。 Win32のCreateProcess関数で"自分自身"のEXEファイルを実行すると、新プロセスが起動するのですがデバッグができません。 CreateProcessの呼び出し側プロセスと、同じプログラムである新プロセスを同時にデバッグすることはできないものでしょうか。

  • 二重起動チェックについて

    Solarisで、プロセスの二重起動チェックを行いたい のですが、システムコールの使用など簡単に行える 方法はないでしょうか? よろしくお願い致します。

  • VBプログラムの終了

    VB6.0で作成した実行ファイル(exe)を終了させても タスクマネージャのプロセスに残ってしまい、 もう一度プログラムを起動することができません。 (プログラムで二重起動防止の処理をしています) このプログラムをVBのラインタイムが入っていない マシンで動かしているのですが、 やはりそれが問題なのでしょうか? それとも別に何か原因があるのでしょうか?

  • Powershell プロセス二重起動

    PowerShell初心者です。 自身で起動中のスクリプトと同じコマンドで実行しているプロセスを検知し、他方のプロセスをkillしようと考えております。要は二重起動のチェックをしたいです。 現在コマンドラインで確認しているのですがどうもうまくいきません。 やろうとしている操作は以下です。 (1)ファイルにプロセス情報を出力。 PS C:\> $tempfile = "C:\pswork\servicemon\temp.log" PS C:\> Get-WmiObject win32_process ` | select Name, ProcessId, CommandLine ` | sort Name ` | Format-Table -AutoSize ` | Out-File -FilePath $tempfile -width 1000 (2)自分のPID以外のプロセス情報を取得 PS C:\> $mypid = $PID PS C:\> $killpidtmp = Get-Content $tempfile | Select-String -Pattern ".*powershell.exe.*svmon131_loop.*" |Select-String -NotMatch -Pattern "\s$mypid\s" PS C:\> echo $killpidtmp powershell.exe 2024 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command C:\pswork\servicemon\svmon131_loop.ps1 (3)splitでプロセス番号のみを取得。 PS C:\> $killpid = echo $killpidtmp |% {$($_-split(" "))[1]} PS C:\> echo $killpid ★ここがうまく取得できません。空白しか取得できていません。 (4)最終的には取得したPIDでプロセスを終了。 PS C:\pswork\servicemon> Stop-Process -ID $killpid Bシェルで同様のスクリプトがあったので、それを参考にPowerShellで書こうとしているので、 そもそも無理があるのかもしれないかと考えています。 上記の方法でなくてもよいので、二重起動のチェックと該当プロセスの停止で参考となる情報があれば教えて頂きたいです。

  • デバッグ時と実行時の識別はできますか?

     多重起動の防止のため、WEBページを参考にしてメインFormのLoad時に、下記のコードで2個目以降起動しないようにしています。 '2重起動の防止 Dim pn As String = Process.GetCurrentProcess.ProcessName If Process.GetProcessesByName(pn).GetUpperBound(0) > 0 Then   MessageBox.Show("すでに起動しています")   Me.Close()   Exit Sub End If  これはうまく行くのですが、デバッグ実行のときに時々起動しないことがあります。 EXEでの実行時にこのようなことはないので、デバッグ時のみこの部分を機能しないようと思っています。 参照可能な内部変数などご存知ないでしょうか。

  • VB6.0(SP6)にて開発を行なっています。参照設定に関して教えてく

    VB6.0(SP6)にて開発を行なっています。参照設定に関して教えてください。 ソースコードはVSS(VisualSourceSafe)にて管理しています。 3つのフォルダにそれぞれVB6.0のプロジェクトがあります。 C:. +---フォルダ1 | ProjectA.dll ←このdllはVSS管理されていない。 | ProjectA.vbp | +---フォルダ2 | ProjectB.dll ←このdllはVSS管理されていない | ProjectB.vbp | \---フォルダ3 ProjectC.exe ←このexeはVSS管理されていない ProjectC.vbp 上図にはdllファイルもexeファイルも記載してありますが、dllファイルとexeファイルはVSSでは管理(登録)しておりません。各開発担当者はVSSから最新のソースコードを取得して、各自のローカル環境でビルドを行なってdllやexeを生成します。 ProjectA.vbpはProjectA.dllを生成します。 ProjectB.vbpはProjectB.dllを生成します。 ProjectC.vbpはProjectC.exeを生成します。 ここでProjectC.vbpはProjectA.dllとProjectB.dllを参照しています。 ここからが質問なのですが、A君の環境でProjectA.dllとProjectB.dllを生成したあとProjectC.vbpをビルドすると問題なくProjectC.exeが生成できます。ところが、B君の環境で同じことをやろうとすると、ProjectA.dllとProjectB.dllを生成まで問題なくできるもののProjectC.vbpをビルドしてProjectC.exeを生成する際に、ProjectA.dllとProjectB.dllが参照エラーとなってしまいます。参照設定をし直せばB君の環境でもProjectC.vbpをビルドしてProjectC.exeを生成できるようになります。ところが、参照設定し直したProjectC.vbpをVSSにチェックインして、A君の環境で最新ソースを取得してProjectC.vbpをビルドしようとすると今度はA君の環境でProjectA.dllとProjectB.dllが参照エラーとなってしまいます。 各開発担当者のローカル環境で参照設定をしなおさずに済むようなプロジェクトの設定方法がありましたら教えていただけないでしょうか。よろしくお願いします。 (なお、変更したのはProjectCの参照設定のみであり、ProjectAとProjectBには一切変更箇所はありません。)

このQ&Aのポイント
  • fax誤発信とは、アドレス帳で選択した宛先と異なる相手にfaxが送信される問題のことです。この誤発信の原因は、機器の不具合や設定の誤りが考えられます。誤発信の発生時には、送信先の確認や再設定を行うことが必要です。
  • fax誤発信の対処方法は、以下の通りです。まず、誤発信が起きた場合は送信先の確認を行い、正しい宛先に再設定します。また、fax機の設定を確認し、誤発信を防ぐための設定を行うことも重要です。さらに、定期的なメンテナンスやファームウェアのアップデートも忘れずに行いましょう。
  • fax誤発信の原因として考えられるものには、以下のようなものがあります。まず、アドレス帳の登録ミスや誤った入力がある場合は、誤発信が起こる原因となります。また、fax機の不具合やネットワークのエラーも誤発信の原因となることがあります。そのため、正確なアドレス帳の管理や機器の状態の確認が重要です。
回答を見る

専門家に質問してみよう