• ベストアンサー

二重起動の禁止

If App.PrevInstance = True Then End End If このコードで二重起動を禁止しているのですが、 たまに二重起動してしまいます。 確実に禁止できる方法はありませんか? (VB6)

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

  • ベストアンサー
noname#139383
noname#139383
回答No.3

WMIオブジェクトを使って自身のプロセス名を指定して起動状態を確認する方法です。 これで確実に禁止できるはずです。 参照設定でMicrosoft WMI Scripting V1.2 Libraryにチェックをいれてください。 **************ここからソース************* Option Explicit Private Sub Main() Dim strPROC_NAME As String '実行ファイル(プロセス名)を代入 strPROC_NAME = App.EXEName '二重起動防止 If fncGet_ProcStatus(strPROC_NAME & ".exe")=False Then MsgBox "既に起動中です。" '二重起動の場合、処理終了 End End If '処理を続行 End Sub '/------------------------------------------------ ' 関数名 : fncGet_ProcStatus ' 機能概要 : 引数で指定したプロセス名の起動を確認する。 ' 引数 : strProcName(String) : 起動状態を確認するプロセス名 ' 戻り値 : Boolean, True=起動していない,False=起動している '------------------------------------------------/ Private Function fncGet_ProcStatus(ByVal strProcName As String) As Long Dim Service As WbemScripting.SWbemObject Dim ServiceSet As WbemScripting.SWbemObjectSet Dim lngCounta As Long On Error GoTo ErrTrap fncGet_ProcStatus = False 'WMI(WindowsManagementInstrumentation)オブジェクトの宣言 Set ServiceSet = GetObject("winmgmts:{impersonationLevel=impersonate}"). _ InstancesOf("Win32_Process") For Each Service In ServiceSet If Service.Description = strProcName Then lngCounta = lngCounta + 1 End If Next If lngCounta = 1 Then '起動しているプロセスが1つだけならTrue fncGet_ProcStatus = True End If 'WMIオブジェクトの解放 If Not (ServiceSet Is Nothing) Then Set ServiceSet = Nothing End If Exit Function ErrTrap: 'WMIオブジェクトの解放 If Not (ServiceSet Is Nothing) Then Set ServiceSet = Nothing End If End Function

freednia
質問者

お礼

忙しくて遅くなりましたが、 どうもありがとうございました。

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>たまに二重起動してしまいます。 というくらいシビアなことを求めるのなら FindWindow()よりもCreateMutex()の方がより確実。 Cの例ですけど。 http://www.expertmg.co.jp/html/cti/vctips/process.htm#多重起動を防止する

参考URL:
http://www.expertmg.co.jp/html/cti/vctips/process.htm#多重起動を防止する
回答No.1

App.PrevInstanceのチェックの他にも FindWindowのAPIを用いて同じタイトルのウィンドウが 開いていないかどうか探すチェックも組み込んでおくのはいかがでしょうか。

参考URL:
http://www31.ocn.ne.jp/~heropa/vb27.htm

関連するQ&A

  • 二重起動禁止について

    VB6から.NETへ移行してきました。 VB6の時システムの二重起動を禁止するのは、プロパティの値を見るだけでしたが、.NETでの方法がわかりません。 どのようにすれば、二重起動が禁止できるのでしょうか?

  • 既にファイルが開いているのなら開かない(二重起動防

    アクセス 既にファイルが開いているのなら開かない(二重起動防止)とするには? 自分なりにコードを考えてみたのですが Sub Sample() Dim acApp As Access.Application Set acApp = CreateObject("Access.Application") acApp.OpenCurrentDatabase "C:\test.accdb" '該当のファイルが開いてないのなら、 If acApp.ReadOnly = False Then acApp.Visible = True acApp.UserControl = True End If End Sub これだと、.ReadOnlyがコンパイルエラーになります。 どうやらReadOnlyはアクセスには用意されてない用語のようです。 このような場合どうすればいいでしょう?

  • 起動しているIEをVBSで閉じるときの問題・・・

    VBスクリプトで起動しているIEを探し特定のサイトであればウィンドウを閉じたいのですがどのようにすればよいのでしょうか? Dim ObjIE Dim ObjShell Dim ObjWindow Dim WinExist WinExist = False Set ObjShell = CreateObject("Shell.Application") For Each ObjWindow In ObjShell.Windows If TypeName(ObjWindow.Document) = "HTMLDocument" Then WinExist = True Set ObjIE = ObjWindow End If Next Set ObjShell = Nothing If Not WinExist = True Then Set ObjIE = CreateObject("InternetExplorer.Application") End If If objIE.Document.URL = "http://www.yahoo.co.jp/" Then objIE.quit End If If objIE.Document.URL = "http://www.excite.co.jp/" Then objIE.quit End If If objIE.Document.URL = "http://www.google.co.jp/" Then ?????????? End If ・ ・ ・ 例えばディスプレイ上にYahoo、Excite、Googleのホームページがそれぞれ立ち上がっていたとします。 もしYahooがあれば閉じて次にExciteを探しあれば閉じて、次にGoogleのページがあればそのままにし後の処理を行わず終わらせたいのですが・・・もしGoogleが開いていればこれ以降の処理を全てすっ飛ばして終了にしたいのですが・・・ また、If thenを繰り返してばかりで汚いコードのような気もします。 これをやっていてYahoo、Excite、Google全て開いていた場合何故かエラーが出て終了してしまいます。 どなたかいい方法があれば教えて下さい。

  • 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 ************************************************

  • 二重起動禁止にする理由とは

    プログラム(アプリケーション)の二重起動を禁止にする処理があるようですが、禁止にしなければならない理由とは、どういったものがあるのでしょうか?

  • ファイルが既に開いているかどうかを取得するには

    Sub Sample1() Dim App As Object Dim MyFileName As String Set App = CreateObject("Excel.Application") MyFileName = "C:\Users\test.xlsm" With App .Workbooks.Open Filename:=MyFileName .Visible = True If .ReadOnly Then MsgBox "既に開いています" App.Quit '既に開いているのなら、閉じる End If End With End Sub このようなコードを作ったのですが、どうやらIf .ReadOnly Thenの部分が間違っているようです。 エラーになります。 既にファイルが開いているか、読み取り専用かどうかを取得するコードをご教授ください。

  • vbスクリプトからexcelのVBAを起動したい。

    vbスクリプトからexcelのVBAを起動したいので、初心者ながら下記のようにコーディングしましたが、excelのVBA;main()が実行できません。  <excelのVBA;main()は単独では正常に起動します。> vbスクリプトからexcelのVBAの起動の方法を教えて下さい。 そのスクリプトをタスク(元旦)に起動したいです。 <vbスクリプト コーディング> dim exlApp On Error Resume Next set exlApp = createobject("Excel.Application") exlApp.visible = true exlApp.Workbooks.Open "C:\年賀状.xls" exlApp.run "Main" If Err Then WScript.Quit End IF If Not(exlApp Is Nothing) Then exlApp.Quit set exlApp = nothing End If

  • 条件判断について教えて下さい。

    VB2008を使用している初心者です。 現在、RichTextBoxとCheckBoxとそれに対応したTextBoxを準備し、CheckBoxがTrueのTextBox.TextをRichTextBoxに代入するプログラムを作成しています。RichTextBoxにはCheckBoxをTrueにした分だけ複数のTextBox.Textを代入させています。ここまでのプログラムは下記コードで問題なく作動しています。 Button1を押す。 RichTextBox1.Clear() If Me.CheckBox1.Checked = True Then RichTextBox1.Text = TextBox1.Text End If If Me.CheckBox2.Checked = True Then If RichTextBox1.Text <> "" Then RichTextBox1.Text = RichTextBox1.Text & "・" End If RichTextBox1.Text = RichTextBox1.Text & TextBox2.Text End If ・ ・ ・ If Me.CheckBox20.Checked = True Then If RichTextBox1.Text <> "" Then RichTextBox1.Text = RichTextBox1.Text & "・" End If RichTextBox1.Text = RichTextBox1.Text & TextBox20.Text End If ここで問題なのですが、RichTextBox1への代入完了後、FalseにしたCheckBoxを再度True(代入時に選択したもののみ)にするコードをButton2に作成したいのですが上手くいきません。例えば下記のコードですと、RichTextBoxに1つだけTextBoxが入っている場合しかCheckBoxのTrueが戻りません。 If Me.CheckBox1.Checked = False Then If RichTextBox1.Text = TextBox1.Text Then Me.CheckBox1.Checked = True End If End If ・ ・ ・ If Me.CheckBox20.Checked = False Then If RichTextBox1.Text = TextBox20.Text Then Me.CheckBox2.Checked = True End If End If これはIf RichTextBox1.Text = TextBox1.Text Thenにしてしまっているためだと思いますが、これをどう修正したら良いかわかりません。もしお時間がある方みえましたらご教授お願いいたします。

  • プログラム2重起動処理の方法

    こんにちは。 VBで2重起動を阻止したいのです。 Appのプロパティ 「PrevInstance」 を使用すればいいような気はするのですが・・・ いまいち使用方法がわかりません 「Load イベント プロシージャ内で PrevInstance プロパティを参照する」 とヘルプにはかいてありますが、具体的にどのようなソースになるのでしょうか。よろしくお願いします。

  • エクセルのシートの移動禁止方法について

    'UserForm1 Public 着目シート名  Public シート変更禁止 As Boolean Private Sub CommandButton1_Click() 着目シート名 = "Sheet1" シート変更禁止 = True End Sub Private Sub CommandButton2_Click() 着目シート名 = "Sheet2" シート変更禁止 = True End Sub 'ThisWorkbook Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) If シート移動禁止 = True Then Worksheets(着目シート名).Activate End If End Sub '標準モジュール Sub test() UserForm1.Show End Sub 'UserForm1には、CommandButton1,CommandButton2のみ貼り付けています。 'フォームは、ShwoModal=Falseにしています それぞれのモジュールに上記のコードを書いて、フォーム上のボタンを押すと、 シートの変更が出来ないようにしようと考えています。 シートは、任意に変更しようと考えていますので、シート名の指定に変数を使いたいのですが、スコープの問題からか? 着目シート名がEmpteyになってしまい、自由に変更が可能となってしまいます。 何が、悪いのでしょうか? どなたか詳しい方教えて頂けないでしょうか?宜しくお願いいたします。 (Workbook_SheetDeactivateによる方法は、ここで教えて頂いた方法をアレンジしようとしている部分です。) QNo.2503758の続きの質問です。

専門家に質問してみよう