題どうりです。
LockFile関数の使い方を教えていただけないでしょうか?
いろいろ調べてみたんですが、まったく載ってないので
UnLockFile関数の使い方も教えていただけたら光栄です。
宜しくお願いします。
LockFile関数の使い方
Re: LockFile関数の使い方
> LockFile関数の使い方を教えていただけないでしょうか?
> いろいろ調べてみたんですが、まったく載ってないので
>
> UnLockFile関数の使い方も教えていただけたら光栄です。
弄ったことがないので直接教えることはできませんが、サンプルがあります。
http://nienie.com/~masapico/api_LockFile.html
> いろいろ調べてみたんですが、まったく載ってないので
>
> UnLockFile関数の使い方も教えていただけたら光栄です。
弄ったことがないので直接教えることはできませんが、サンプルがあります。
http://nienie.com/~masapico/api_LockFile.html
頑張ってやってみたんですが、できません。
失敗作のコードを書いておきます。
どこがいけないんでしょうか?
失敗作のコードを書いておきます。
コード: 全て選択
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
> どこがいけないんでしょうか?
CreateFile()関数の第二引数にGENERIC_WRITEを加える必要があります。
LockFile()関数の戻り値はBOOL型です。真偽を表すんですね。
で、GetWindowTextLength()関数に渡すべきはウィンドウハンドルです。
あと、UnlockFile()関数でロックを解除してください。
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
> 自分のやりたいこととしては、ボタン1でロックするファイルを選択して、スタッティックにパスをセット。そのファイルをロックして同じディレクトリにロックしたファイルを作る。
細かく考えてみれば難しい関数は使ってないので割愛しますが、4.の同じディレクトリにファイルを作る場合、ファイル名はどうしたいのでしょうか?
- 1.コマンドボタンを押されたらGetOpenFileName()関数でファイルオープンダイアログを開く。
2.ユーザーがファイルを選んだ場合、選んだファイルのパスをスタティックテキストに設定。
3.ユーザーが選んだファイルをロックする。
4.同じディレクトリにファイルを作る。(全く同じファイル名のファイルじゃないですよね?)
5.作ったファイルをロックする。
細かく考えてみれば難しい関数は使ってないので割愛しますが、4.の同じディレクトリにファイルを作る場合、ファイル名はどうしたいのでしょうか?
コード: 全て選択
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
===============================
MyHomePage;; raiden.no.land.to/
===============================
MyHomePage;; raiden.no.land.to/
===============================