開発環境: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
No.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(ミューテックス)
使用済みのミューテックスを閉じます。
nda23様、返答が遅くなりまして申し訳ありません。
教えて頂いたミューテックスでなんとか実現する事ができました!
ありがとうございました。
No.2
- 回答日時:
> ミューテックスというのはどのような事でしょうか?
そんな発言をする人が使うべきではないと思うけど、
API 直じゃなくてクラスになってるからまぁいいか
レベルの情報投下。
http://msdn.microsoft.com/ja-jp/library/system.t …
API 直で使うなら貴方はプログラムすべきではないです。
No.1
- 回答日時:
AccessのVBAはマルチスレッドに対応できないので、
複数のプロセスが同時にVBAを走らせると、障害が
発生します。
資源の競合を避けるには名前付きミューテックスを
用いるのが一般的です。
特定のファイルを排他モードで開くというのもあり
ます。いずれも競争に勝った唯一のプロセスだけが
実行権を得ると言う理屈です。
nda23様、ご回答ありがとうございます。
やはりACCESSを同時に開くというのは難しいのですね、、、
教えて頂いた名前付きミューテックスというのはどのような事でしょうか?
使用方法等が記載されたHP等ありましたら教えて頂ければと思います。
お願いする事ばかりで申し訳ありませんが、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- MySQL データベースの複製の仕方(mysql) 2 2023/05/30 18:24
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Access(アクセス) Access DAOのExecuteメソッドのオプション(RecordsetOptionEnum)に 1 2022/09/19 07:34
- ソフトウェア データベースのウェブでの自作 2 2023/08/01 10:06
- Access(アクセス) access レポート 請求書について 2 2022/07/04 22:52
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- その他(データベース) Microsoft Accessについて 1 2022/06/06 16:20
- Visual Basic(VBA) Access VBAから使用したExcelプロセスを閉じる方法について 4 2022/06/08 17:50
- Access(アクセス) Accessにインポートした複数のテーブルを表示させる方法が分かりません。 1 2023/01/30 20:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++のプログラムをバックグラウ...
-
VB6.0 SHELLで起動...
-
explorer.exeが異様にメモリを食う
-
バックグラウンドのプロセスの...
-
タスクマネージャーのプロセス...
-
共有メモリの使い方について
-
プロセスのアタッチ・デタッチ...
-
WSH.Runで待機できません
-
C#でのbatファイル実行結果取得
-
ロードアベレージが高いのです...
-
警告『 別のプロセスで使用され...
-
VB.NET 自プログラムのプロセス...
-
フレームワークとプロセスの違...
-
vb.netでEXCEL起動がうまくでき...
-
CreateProcess時の実行ユーザ変...
-
popen について
-
プロセスIDからウィンドウハ...
-
指定した実行中プロセスの、指...
-
Linuxでのスレッド間メッセージ...
-
VBSからbat実行(WMI)して戻り値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
C#でのbatファイル実行結果取得
-
プロセスのアタッチ・デタッチ...
-
VB6.0 SHELLで起動...
-
プロセスIDからウィンドウハ...
-
Process.Startの戻り値を後で取得
-
ウィンドウのタイトルからプロ...
-
他のEXEが起動しているかの確認
-
ADOでアクセスのレコードに...
-
怪しいプロセス教えてください。
-
別のプロセスの関数を呼び出す...
-
Linuxでのスレッド間メッセージ...
-
C++のプログラムをバックグラウ...
-
C++でシェルを起動
-
プロセスIDの取得方法について
-
OSPFでプロセスを分ける意義に...
-
非表示になったエクセルは?
-
Windowsでのfork方法
おすすめ情報