ページ 1 / 1
LockFile関数の使い方
Posted: 2006年8月10日(木) 22:12
by 雷電
題どうりです。
LockFile関数の使い方を教えていただけないでしょうか?
いろいろ調べてみたんですが、まったく載ってないので
UnLockFile関数の使い方も教えていただけたら光栄です。
宜しくお願いします。
Re: LockFile関数の使い方
Posted: 2006年8月10日(木) 22:22
by 7
> LockFile関数の使い方を教えていただけないでしょうか?
> いろいろ調べてみたんですが、まったく載ってないので
>
> UnLockFile関数の使い方も教えていただけたら光栄です。
弄ったことがないので直接教えることはできませんが、サンプルがあります。
http://nienie.com/~masapico/api_LockFile.html
Posted: 2006年8月10日(木) 22:52
by 雷電
頑張ってやってみたんですが、できません。
失敗作のコードを書いておきます。
コード: 全て選択
Sub MainWnd_CommandButton3_Click()
Dim hFile As Long
Dim hLock As Long
Dim buffer As String
Dim Length As Long
Dim dwAccessByte As DWord
GetDlgItemTextStr(hMainWnd,Static2,buffer)
hFile=CreateFile(buffer,GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hFile=INVALID_HANDLE_VALUE Then
MessageBox(hMainWnd,"ファイルオープンに失敗","Locker",MB_OK or MB_ICONEXCLAMATION)
Exit Sub
End If
hLock=LockFile(hFile,0,0,&HFFFFFFFF,0)
Length=GetWindowTextLength(hLock)
WriteFile(hFile,hLock,Length,VarPtr(dwAccessByte),ByVal 0)
CloseHandle(hFile)
End Sub
どこがいけないんでしょうか?
Posted: 2006年8月11日(金) 09:06
by イグトランス
まずGetDlgItemTextStrで,スタティックコントロールの内容の文字列を取得していることが気になります。
ほかにもファイルに書き込むのに,CreateFileでは読み取りしか行わないという指定であるGENERIC_READを指定していること,
LockFileは単に成功の可否を返すだけでなのにそれをハンドル(hLock)として扱い,
そしてそれはウィンドウハンドルではないのにGetWindowTextLengthに渡していることがおかしいです。
あと,単にファイルに書き込むだけならLockFileでファイルをロックする必要はありませんよ。
そもそもロックする必要はあるのでしょうか?
Posted: 2006年8月11日(金) 09:19
by 7
> どこがいけないんでしょうか?
CreateFile()関数の第二引数に
GENERIC_WRITEを加える必要があります。
LockFile()関数の戻り値はBOOL型です。真偽を表すんですね。
で、GetWindowTextLength()関数に渡すべきはウィンドウハンドルです。
あと、UnlockFile()関数でロックを解除してください。
コード: 全て選択
Sub MainWnd_CommandButton1_Click()
Dim hFile As HANDLE
Dim hLock As BOOL
Dim length As Long
Dim dwAccessByte As DWord
Dim lpszStr="TEST" As LPCSTR
hFile=CreateFile("E:\result.txt",GENERIC_READ Or GENERIC_WRITE,FILE_SHARE_READ Or FILE_SHARE_WRITE,ByVal NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
If INVALID_HANDLE_VALUE<>hFile Then
hLock=LockFile(hFile,0,0,&HFFFFFFFF,&HFFFFFFFF)
length=lstrlen(lpszStr)
WriteFile(hFile,lpszStr,length,VarPtr(dwAccessByte),ByVal NULL)
UnlockFile(hFile,0,0,&HFFFFFFFF,&HFFFFFFFF)
CloseHandle(hFile)
End If
End Sub
Posted: 2006年8月11日(金) 17:38
by 雷電
自分のやりたいこととしては、ボタン1でロックするファイルを選択して、スタッティックにパスをセット。そのファイルをロックして同じディレクトリにロックしたファイルを作る。
という風にしたいのですが、、、コードが難しいので、教えていただけないでしょうか?
Posted: 2006年8月11日(金) 17:39
by 雷電
自分のやりたいこととしては、ボタン1でロックするファイルを選択して、スタッティックにパスをセット。そのファイルをロックして同じディレクトリにロックしたファイルを作る。
という風にしたいのですが、、、コードが難しいので、教えていただけないでしょうか?
Posted: 2006年8月12日(土) 09:42
by 7
> 自分のやりたいこととしては、ボタン1でロックするファイルを選択して、スタッティックにパスをセット。そのファイルをロックして同じディレクトリにロックしたファイルを作る。
- 1.コマンドボタンを押されたらGetOpenFileName()関数でファイルオープンダイアログを開く。
2.ユーザーがファイルを選んだ場合、選んだファイルのパスをスタティックテキストに設定。
3.ユーザーが選んだファイルをロックする。
4.同じディレクトリにファイルを作る。(全く同じファイル名のファイルじゃないですよね?)
5.作ったファイルをロックする。
といった感じになるんじゃないでしょうか。
細かく考えてみれば難しい関数は使ってないので割愛しますが、4.の同じディレクトリにファイルを作る場合、ファイル名はどうしたいのでしょうか?
Posted: 2006年8月12日(土) 21:33
by 雷電
ファイル名は、ちょっとしたものがあったのでそれを使って、.まで切り落とす。
それからその文字列に.lockを付け足す。
この部分はできています。
ただ、ロックファイル関数のパラメータの意味が分からないんです。
それさえ分かればロックはできそうなんですが・・・
Posted: 2006年9月24日(日) 14:41
by 雷電
コード: 全て選択
Sub MainWnd_CommandButton1_Click()
Dim FilePath As String
Dim hFile As HANDLE
Dim hFile2 As HANDLE
Dim dwFileSize As DWord
Dim hLock As BOOL
Dim ofn As OPENFILENAME
Dim length As DWord
Dim dwAccessByte As DWord
Dim FileName[MAX_PATH] As Byte
Dim Size As Long
GetDlgItemTextStr(hMainWnd,Static2,FilePath)
hFile=CreateFile(FilePath, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE,_
ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hFile=INVALID_HANDLE_VALUE Then
MessageBox(hMainWnd,"ファイルオープンに失敗","Locker",MB_OK or MB_ICONEXCLAMATION)
Exit Sub
End If
dwFileSize=GetFileSize(hFile,Size)
hLock=LockFile(hFile,Size,dwFileSize,&HFFFFFFFF,&HFFFFFFFF)
If hLock=1 Then
'OPENFILENAME構造体の初期化
FillMemory(VarPtr(ofn),Len(ofn),0)
ofn.lStructSize=Len(ofn)
ofn.hwndOwner=hMainWnd
ofn.lpstrFilter=Ex"ロックファイル(*.lock)\0*.lock\0\0\0"
ofn.nFilterIndex=1
ofn.lpstrFile=FileName
ofn.nMaxFile=MAX_PATH
ofn.lpstrTitle="ロックしたファイルの保存"
ofn.Flags=OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST
ofn.lpstrDefExt="*"
'「ファイルの保存」ダイアログ ボックスを表示
If GetSaveFileName(ofn)=0 Then Exit Sub
hFile2=CreateFile(ofn.lpstrFile, GENERIC_WRITE, 0,ByVal 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
If hFile=INVALID_HANDLE_VALUE Then
MessageBox(hMainWnd,"ファイルオープンに失敗","Locker",MB_OK or MB_ICONEXCLAMATION)
Exit Sub
End If
length=lstrlen(hFile)
WriteFile(hFile2,hFile,length,VarPtr(dwAccessByte),ByVal NULL)
UnlockFile(hFile,Size,dwFileSize,&HFFFFFFFF,&HFFFFFFFF)
CloseHandle(hFile)
CloseHandle(hFile2)
Else
MessageBox(0,"ロックに失敗しました。","Locker",0)
ExitSub
End If
End Sub
こうすると、アクセス違反が起きるのですが、なぜでしょうか?