いつもお世話になっております。
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
・ReDim lpszUserBuffer(50) As String
・Cusers = LDBUser_GetUsers(lpszUserBuffer(), StrDbPath, 2)
↓
Dim lpszUserBuffer(1) As String
いきなり、ReDim は駄目ですね。
Dim宣言してからReDimするならまだしも。
書き込みありがとうございます。
ReDim lpszUserBuffer(50) As String
↓
Dim lpszUserBuffer(1) As String
に変更することでこの部分のエラーはなくなりましたが、
Cusers = LDBUser_GetUsers(lpszUserBuffer(), StrDbPath, 2)
の
lpszUserBuffer()の部分で
「インデックスの数がインデックス付きの配列の次元より
少ない値です」のエラーが発生します。
この部分はどうすればよろしいでしょうか?
1で少ないなら、エラーが出なくなる数に増やせばいいでしょう。
配列を渡すのですから,()をつけてはいけません。
> 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ですが)
やじゅ様
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ですが)
ありがとうございました。
ツイート | ![]() |