ファイルの特定領域をロック          <TOP>


CreateFile 指定したファイルをオープンし、デバイスハンドルを返す
LockFile オープンしているファイルの特定の領域を、他のプロセスがアクセスできないようにロック
UnlockFile 他のプロセスがアクセスできるようにロックを解除
CloseHandle オープンされているオブジェクトハンドルをクローズ
Sleep カレントスレッドの実行を指定の時間だけ中断
 

例では、実行をクリックすると20秒間ロックされます。その間に指定したファイルをアクセスした場合右図のようなメッセージが表示されます。

 

 

'================================================================
'= ファイルの特定領域をロック
'=    (LockFile.bas)
'================================================================
#include "Windows.bi"

' 指定したファイルをオープンし、デバイスハンドルを返す
Declare Function Api_CreateFile& Lib "Kernel32" Alias "CreateFileA" (ByVal lpFileName$, ByVal dwDesiredAccess&, ByVal dwShareMode&, lpSecurityAttributes As Any, ByVal dwCreationDisposition&, ByVal dwFlagsAndAttributes&, ByVal hTemplateFile&)

' オープンしているファイルの特定の領域を、他のプロセスがアクセスできないようにロック
Declare Function Api_LockFile& Lib "kernel32" Alias "LockFile" (ByVal hFile&, ByVal dwFileOffsetLow&, ByVal dwFileOffsetHigh&, ByVal nNumberOfBytesToLockLow&, ByVal nNumberOfBytesToLockHigh&)

' 他のプロセスがアクセスできるようにロックを解除
Declare Function Api_UnlockFile& Lib "kernel32" Alias "UnlockFile" (ByVal hFile&, ByVal dwFileOffsetLow&, ByVal dwFileOffsetHigh&, ByVal nNumberOfBytesToUnlockLow&, ByVal nNumberOfBytesToUnlockHigh&)

' オープンされているオブジェクトハンドルをクローズ
Declare Function Api_CloseHandle& Lib "Kernel32" Alias "CloseHandle" (ByVal hObject&)

' カレントスレッドの実行を指定の時間だけ中断
Declare Sub Api_Sleep Lib "Kernel32" Alias "Sleep" (ByVal dwMilliseconds&)

#define GENERIC_READ -2147483648        '読み込みモード(&H80000000)
#define GENERIC_WRITE &H40000000        '書き込みモード
#define FILE_ATTRIBUTE_NORMAL &H80      '他のファイル属性を持たない
#define OPEN_EXISTING 3                 'ファイルをオープンする(存在しない場合失敗)

Var Shared Edit1 As Object
Var Shared Text1 As Object
Var Shared Button1 As Object

Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14
Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

Var Shared PathName As String

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub mainForm_Start()
	PathName = Edit1.GetWindowText
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hFile As Long
    Var Ret As Long


    'ファイルのオープン
    hFile = Api_CreateFile(PathName, GENERIC_READ, 0, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, ByVal 0)

    'ファイルのロック
    Ret = Api_LockFile(hFile, 0, 0, GENERIC_READ, 0)
    Text1.SetWindowText "ファイルをロックしました。"

    'ファイルの書き込み処理などを実行
    Api_Sleep 20000

    'ファイルのアンロック
    Ret = Api_UnlockFile(hFile, 0, 0, GENERIC_READ, 0)
    Text1.SetWindowText "ファイルをアンロックしました。"

    'ファイルのクローズ
    Ret = Api_CloseHandle(hFile)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End