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