- ベストアンサー
VBからのACCESSの起動に関して
- VB2008よりACCESSを更新したり、ACCESSのレポートを使用したりするプログラムを作成しています。
- 複数のACCESSに複数のレポートを作成しているため、複数のプログラムからACCESSを起動させるとエラーが発生します。
- 1つのACCESSファイルを複数のVBプログラムからアクセスすることはできないのか、または既に開いているか確認して処理をスキップする方法があるのか知りたいです。
- みんなの回答 (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(ミューテックス) 使用済みのミューテックスを閉じます。
その他の回答 (2)
- MARU4812
- ベストアンサー率43% (196/452)
> ミューテックスというのはどのような事でしょうか? そんな発言をする人が使うべきではないと思うけど、 API 直じゃなくてクラスになってるからまぁいいか レベルの情報投下。 http://msdn.microsoft.com/ja-jp/library/system.threading.mutex(v=vs.90).aspx API 直で使うなら貴方はプログラムすべきではないです。
- nda23
- ベストアンサー率54% (777/1415)
AccessのVBAはマルチスレッドに対応できないので、 複数のプロセスが同時にVBAを走らせると、障害が 発生します。 資源の競合を避けるには名前付きミューテックスを 用いるのが一般的です。 特定のファイルを排他モードで開くというのもあり ます。いずれも競争に勝った唯一のプロセスだけが 実行権を得ると言う理屈です。
お礼
nda23様、ご回答ありがとうございます。 やはりACCESSを同時に開くというのは難しいのですね、、、 教えて頂いた名前付きミューテックスというのはどのような事でしょうか? 使用方法等が記載されたHP等ありましたら教えて頂ければと思います。 お願いする事ばかりで申し訳ありませんが、よろしくお願いします。
お礼
nda23様、返答が遅くなりまして申し訳ありません。 教えて頂いたミューテックスでなんとか実現する事ができました! ありがとうございました。