アプリ版:「スタンプのみでお礼する」機能のリリースについて

開発環境:Visual Basic 2008/ACCESS 2000

VB2008よりACCESSを更新したり、ACCESSのレポートを使用したりする
プログラムを作成しています。

その際に、1つのACCESSに複数のレポートを作成している事から、複数のプログラム
からACCESSを起動させようとするとエラーとなってしまいます。

ACCESSをそれぞれ分けてしまえば問題ないですが、、、、

そもそも1つのACCESSファイルを複数からアクセス(複数のVBプログラム)するという事が
不可能なのでしょうか?

あるいは、下記の記述にあるように、データベースを開こうとするかエラーである為、
開いているか確認の記述をし、既に開いているようだったら、その処理をとばすような事
をすれば問題ないのでしょうか???

教えて頂きたいと思います。

よろしくお願いします。


《記述内容》

Dim ac As Object

ac = CreateObject("Access.Application")

With ac
'アプリケーションを表示する
ac.Visible = True
'データベースを開く
ac.OpenCurrentDatabase("C:\sample.mdb")

'名前を指定してレポートを開く
ac.DoCmd.OpenReport("R_一覧表", 2) 'acViewPreview

'レポートの最大化
.DoCmd.Maximize()

'オブジェクトの解放
System.Runtime.InteropServices.Marshal.ReleaseComObject(ac)

End With
ac = Nothing

A 回答 (3件)

ミューテックスはセマフォやイベントと同じく


マルチスレッド/マルチプロセスにおける同期を
とるためのオブジェクトです。
ミューテックスはこれを獲得できるスレッドは
唯一つで、あるスレッドがミューテックスを獲得
している間は他のスレッドがこれを獲得することが
できません。APIでのサンプルを示します。

'関数の定義
Module Module1
  Public Declare Function CreateMutex Lib "kernel32" _
    Alias "CreateMutexA" _
    (ByVal セキュリティ記述子 As Integer, _
     ByVal 初期所有状態 As Integer, _
     ByVal 名前 As String) _
     As Integer
  Public Declare Function WaitForSingleObject Lib "kernel32" _
    (ByVal ハンドル As Integer, _
     ByVal 待機時間 As Integer) _
     As Integer
  Public Declare Function CloseHandle Lib "kernel32" _
    (ByVal ハンドル As Integer) _
     As Integer
  Public Declare Function ReleaseMutex Lib "kernel32" _
    (ByVal ハンドル As Integer) _
     As Integer

'使用例
Public Class Form1
  Private ミューテックス As Integer = 0
  Private 獲得中 As Boolean = False

  Private Sub Form1_Load(~
    '最初にミューテックスを作っておく
    ミューテックス = CreateMutex(0, 0, "hoge")
  End Sub

  Private Sub Button1_Click(~
    If WaitForSingleObject(ミューテックス, 0) = 0 Then
      '獲得できた時の処理
      獲得中 = True

      == 中略 ==

      '処理終了後、ミューテックスを解放する
      ReleaseMutex(ミューテックス)
      獲得中 = False
    Else
       '獲得できなかった時の処理
    End If
  End Sub
  Private Sub Form1_FormClosed(~
    '獲得中なら解放する
    If 獲得中 Then
      ReleaseMutex(ミューテックス)
      獲得中 = False
    End If
    'ミューテックスを閉じる
    CloseHandle(ミューテックス)
  End Sub

(1)CreateMutex(0, 0, "hoge")
ミューテックスを作ります。セキュリティ記述子はこのハンドルを
子プロセスに継承しないのでNULL(=0)を指定します。
初期所有状態は非所有状態にするので、FALSE(=0)を指定します。
ミューテックスの名前は各プロセスで同じものを付けます。
ここではミューテックスを作っただけで獲得はしていません。
(2)WaitForSingleObject(ミューテックス, 0)
ミューテックスの獲得を試みます。獲得できるまでの待機時間が0
なので、獲得できない場合は直ぐに制御が戻ります。戻り値は
獲得できれば0、できない時は258が返ります。
因みに待機時間はミリ秒単位で、-1を指定すると獲得できるまで
制御が戻りません。
(3)ReleaseMutex(ミューテックス)
獲得したミューテックスを解放します。
これをやらないでCloseHandleだけするとミューテックスは捕まった
ままで、プロセスが終了するまでミューテックスを解放できなくなり
ます。
(4)CloseHandle(ミューテックス)
使用済みのミューテックスを閉じます。
    • good
    • 0
この回答へのお礼

nda23様、返答が遅くなりまして申し訳ありません。

教えて頂いたミューテックスでなんとか実現する事ができました!

ありがとうございました。

お礼日時:2012/05/14 11:24

> ミューテックスというのはどのような事でしょうか?


そんな発言をする人が使うべきではないと思うけど、
API 直じゃなくてクラスになってるからまぁいいか
レベルの情報投下。
http://msdn.microsoft.com/ja-jp/library/system.t …

API 直で使うなら貴方はプログラムすべきではないです。
    • good
    • 0

AccessのVBAはマルチスレッドに対応できないので、


複数のプロセスが同時にVBAを走らせると、障害が
発生します。
資源の競合を避けるには名前付きミューテックスを
用いるのが一般的です。
特定のファイルを排他モードで開くというのもあり
ます。いずれも競争に勝った唯一のプロセスだけが
実行権を得ると言う理屈です。
    • good
    • 0
この回答へのお礼

nda23様、ご回答ありがとうございます。

やはりACCESSを同時に開くというのは難しいのですね、、、

教えて頂いた名前付きミューテックスというのはどのような事でしょうか?

使用方法等が記載されたHP等ありましたら教えて頂ければと思います。

お願いする事ばかりで申し訳ありませんが、よろしくお願いします。

お礼日時:2012/05/09 16:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!