mdbファイルの現在接続ユーザー数の取得

解決


hiroko  2008-10-30 14:13:54  No: 140766  IP: 192.*.*.*

いつもお世話になっております。
VB.NET(VB STUDIO2008)
Windows VISTAの環境で
でmdb(Access2003形式)のデータベースアプリを開発しようとしています。

mdbファイルを開けるのを
1度に1ユーザーに制限したいのです。
以前Access2000にて
マイクロソフト技術情報から
LDBファイルより接続ユーザー数を取得していました。

そのモジュールをそのままVB.NETにコピーしたのですが、
文法が違うのか
以下の2か所でエラーが発生します。

・ReDim lpszUserBuffer(50) As String
    変数が宣言されていません。
・Cusers = LDBUser_GetUsers(lpszUserBuffer(), StrDbPath, 2)
    引数lpszUserBuffer()の配列数を超えています


勉強不足のせいか修正方法がわかりません。
よろしくお願いいたします。



Declare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" _
      (lpszUserBuffer() As String, ByVal lpszFilename As String, _
      ByVal nOptions As Long) As Integer


'--------------------------------------------------------------
'現在ユーザー使用ユーザー数取得
'1=今回の自分のみ
'2以上=複数いる
'マイナス=エラー
'WindowsのSystem/System32にMSLDBUSR.DLLが必要です。
'http://www.friendlysw.com/knowhow/Forms_Intermediate_010.asp
'--------------------------------------------------------------
      
Public Function GetUsers(Optional StrDbPath As String) As Integer
ReDim lpszUserBuffer(50) As String
Dim intLooper As Integer
Dim Cusers As Long
Dim strMsgBox As String
Dim res As Integer

         res = -99
         
         If IsMissing(StrDbPath) Or StrDbPath = "" Then
              StrDbPath = CurrentDb.name
         End If



         Cusers = LDBUser_GetUsers(lpszUserBuffer(), StrDbPath, 2)

         Select Case Cusers
              Case -1
                   strMsgBox = "Can't open the LDB file"
              Case -2
                   strMsgBox = "No user connected"
              Case -3
                   strMsgBox = "Can't Create an Array"
              Case -4
                   strMsgBox = "Can't redimension array"
              Case -5
                   strMsgBox = "Invalid argument passed"
              Case -6
                   strMsgBox = "Memory allocation error"
              Case -7
                   strMsgBox = "Bad index"
              Case -8
                   strMsgBox = "Out of memory"
              Case -9
                   strMsgBox = "Invalid Argument"
              Case -10
                   strMsgBox = "LDB is suspected as corrupted"
              Case -11
                   strMsgBox = "Invalid argument"
              Case -12
                   strMsgBox = "Unable to read MDB file"
              Case -13
                   strMsgBox = "Can't open the MDB file"
              Case -14
                   strMsgBox = "Can't find the LDB file"
         End Select

         res = Cusers
                 
         


Exit_GetUsers:

        GetUsers = res
        

         Exit Function
Err_GetUsers:
         MsgBox Err.Description
         Resume Exit_GetUsers

    End Function

編集 削除
やじゅ  2008-10-30 15:22:55  No: 140767  IP: 192.*.*.*

・ReDim lpszUserBuffer(50) As String
・Cusers = LDBUser_GetUsers(lpszUserBuffer(), StrDbPath, 2)

Dim lpszUserBuffer(1) As String

いきなり、ReDim は駄目ですね。
Dim宣言してからReDimするならまだしも。

編集 削除
hiroko  2008-10-31 08:15:02  No: 140768  IP: 192.*.*.*

書き込みありがとうございます。
ReDim lpszUserBuffer(50) As String

Dim lpszUserBuffer(1) As String
に変更することでこの部分のエラーはなくなりましたが、

Cusers = LDBUser_GetUsers(lpszUserBuffer(), StrDbPath, 2)

lpszUserBuffer()の部分で
「インデックスの数がインデックス付きの配列の次元より
少ない値です」のエラーが発生します。
この部分はどうすればよろしいでしょうか?

編集 削除
やじゅ  2008-10-31 09:54:22  No: 140769  IP: 192.*.*.*

1で少ないなら、エラーが出なくなる数に増やせばいいでしょう。

編集 削除
YuO  2008-10-31 11:16:51  No: 140770  IP: 192.*.*.*

配列を渡すのですから,()をつけてはいけません。

> Cusers = LDBUser_GetUsers(lpszUserBuffer(), StrDbPath, 2)
を,
Cusers = LDBUser_GetUsers(lpszUserBuffer, StrDbPath, 2)
としてみてはどうでしょうか。

さらに,宣言も怪しそうですが……。
他サイトの構文を見ると,
Declare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" _
      (ByRef lpszUserBuffer() As String, ByVal lpszFilename As String, _
      ByVal nOptions As Integer) As Integer
ではないかと思いますが,どうでしょうか。
・VB.NET以降ではByValがデフォルトです
・旧VBコードでのIntegerはShortに,LongはIntegerに,それぞれ置き換える必要があります (場合によってはIntPtrですが)

編集 削除
hiroko  2008-10-31 14:04:32  No: 140771  IP: 192.*.*.*

やじゅ様
YuO様
ありがとうございます。
Declare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" _
      (ByRef lpszUserBuffer() As String, ByVal lpszFilename As String, _
      ByVal nOptions As Integer) As Integer

Cusers = LDBUser_GetUsers(lpszUserBuffer, StrDbPath, 2)
にする事で、エラーは回避できました。

mdb接続ユーザー数を取得する事が何故かできないのですが、
mdbファイルを既にOPEN時にはいつもCusers=0
そうでない場合(ldbファイルが存在しない場合)Cusers=-14
で帰ってきます。

とりあえずCusers=-14かどうかをチェックする事で、
複数ユーザーによる多重オープンは防げるのですが、
Access2003の頃のソースはそのまま使えないってことですね。
(これならldbファイルのDirチェックでもよかったような気が。)

-----------------------------------------------------------
あと↓はたいへん参考になりました。
・VB.NET以降ではByValがデフォルトです
・旧VBコードでのIntegerはShortに,LongはIntegerに,それぞれ置き換える必要があります (場合によってはIntPtrですが)


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

編集 削除