LockFile関数の使い方

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: LockFile関数の使い方

by 雷電 » 2006年9月24日(日) 14:41

コード: 全て選択

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
こうすると、アクセス違反が起きるのですが、なぜでしょうか?

by 雷電 » 2006年8月12日(土) 21:33

ファイル名は、ちょっとしたものがあったのでそれを使って、.まで切り落とす。
それからその文字列に.lockを付け足す。
この部分はできています。

ただ、ロックファイル関数のパラメータの意味が分からないんです。
それさえ分かればロックはできそうなんですが・・・

by 7 » 2006年8月12日(土) 09:42

> 自分のやりたいこととしては、ボタン1でロックするファイルを選択して、スタッティックにパスをセット。そのファイルをロックして同じディレクトリにロックしたファイルを作る。
  • 1.コマンドボタンを押されたらGetOpenFileName()関数でファイルオープンダイアログを開く。
    2.ユーザーがファイルを選んだ場合、選んだファイルのパスをスタティックテキストに設定。
    3.ユーザーが選んだファイルをロックする。
    4.同じディレクトリにファイルを作る。(全く同じファイル名のファイルじゃないですよね?)
    5.作ったファイルをロックする。
といった感じになるんじゃないでしょうか。
細かく考えてみれば難しい関数は使ってないので割愛しますが、4.の同じディレクトリにファイルを作る場合、ファイル名はどうしたいのでしょうか?

by 雷電 » 2006年8月11日(金) 17:39

自分のやりたいこととしては、ボタン1でロックするファイルを選択して、スタッティックにパスをセット。そのファイルをロックして同じディレクトリにロックしたファイルを作る。
という風にしたいのですが、、、コードが難しいので、教えていただけないでしょうか?

by 雷電 » 2006年8月11日(金) 17:38

自分のやりたいこととしては、ボタン1でロックするファイルを選択して、スタッティックにパスをセット。そのファイルをロックして同じディレクトリにロックしたファイルを作る。
という風にしたいのですが、、、コードが難しいので、教えていただけないでしょうか?

by 7 » 2006年8月11日(金) 09:19

> どこがいけないんでしょうか?
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

by イグトランス » 2006年8月11日(金) 09:06

まずGetDlgItemTextStrで,スタティックコントロールの内容の文字列を取得していることが気になります。
ほかにもファイルに書き込むのに,CreateFileでは読み取りしか行わないという指定であるGENERIC_READを指定していること,
LockFileは単に成功の可否を返すだけでなのにそれをハンドル(hLock)として扱い,
そしてそれはウィンドウハンドルではないのにGetWindowTextLengthに渡していることがおかしいです。

あと,単にファイルに書き込むだけならLockFileでファイルをロックする必要はありませんよ。
そもそもロックする必要はあるのでしょうか?

by 雷電 » 2006年8月10日(木) 22:52

頑張ってやってみたんですが、できません。
失敗作のコードを書いておきます。

コード: 全て選択

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
どこがいけないんでしょうか?

Re: LockFile関数の使い方

by 7 » 2006年8月10日(木) 22:22

> LockFile関数の使い方を教えていただけないでしょうか?
> いろいろ調べてみたんですが、まったく載ってないので
>
> UnLockFile関数の使い方も教えていただけたら光栄です。
弄ったことがないので直接教えることはできませんが、サンプルがあります。
http://nienie.com/~masapico/api_LockFile.html

LockFile関数の使い方

by 雷電 » 2006年8月10日(木) 22:12

題どうりです。
LockFile関数の使い方を教えていただけないでしょうか?
いろいろ調べてみたんですが、まったく載ってないので

UnLockFile関数の使い方も教えていただけたら光栄です。

宜しくお願いします。

ページトップ