CreateFileでファイルのロックがしたい!
Lock 2013/6/8(Sat) 19:01:30|NO.54700
CreateFileでファイルのロックがしたいです。
refstrでファイルを指定するのではなくて
C:\Users\User名\Desktop\○○.exe
みたいな感じで最初から指定してファイルをロックしたいのですが
この場合どういったソースを書けばいいですか?
ちなみに下記ソースは拾い物です
#include "kernel32.as"
#define INVALID_HANDLE_VALUE -1
#define GENERIC_READ 0x80000000
#define OPEN_EXISTING 3
#define FILE_ATTRIBUTE_NORMAL 0x00000080
#define NULL 0
title "ロックするファイルを選択してください"
dialog "*", 16
if (stat == 0) : end
fname = refstr
// ファイルハンドルを取得する
CreateFileA fname, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
hFile = stat ; ファイルハンドル
if (hFile == INVALID_HANDLE_VALUE){
dialog "ファイルハンドル取得失敗" : end
}
// ファイルサイズを取得
FileSizeHigh = 0
GetFileSize hFile, varptr(FileSizeHigh)
FileSizeLow = stat
if (FileSizeLow == -1){
dialog "ファイルサイズ取得失敗"
gosub *close
end
}
// ファイルをロックする
LockFile hFile, 0, 0, FileSizeLow, FileSizeHigh
if (stat == 0){
dialog "ロックに失敗しました"
gosub *close
end
}
dialog "OKボタンを押すと開放します"
// ファイルのロックを解除する
UnLockFile hFile, 0, 0, FileSizeLow, FileSizeHigh
if (stat == 0){
dialog "ロックの解除に失敗しました"
gosub *close
end
}
gosub *close
stop
*close
// ファイルハンドルを閉じる
CloseHandle hFile
return
test 2013/6/8(Sat) 20:00:25|NO.54712
ハンドルネームを3つも使い分けるのは大変なので、やめたほうがよろしいのではないでしょうか。
確かにこのソースではrefstrでファイルを指定しています。しかし、CreateFileに渡されている変数はrefstrではないですね。その変数に直接目的のファイル名を入れてしまえばいいと思います。
Lock 2013/6/9(Sun) 23:16:41|NO.54770
んーあれからかれこれ試したんですが、解決できません><
cats 2013/6/9(Sun) 23:25:04|NO.54773
え、
fname = refstr
の変数に直でファイル名を入れるだけでは?
Lock 2013/6/9(Sun) 23:30:12|NO.54774
catsさん
やりましたがなぜかできません;;
test 2013/6/9(Sun) 23:34:50|NO.54775
できないとは、具体的にどういう状態ですか。
どういうことを試してみて、どういうエラーが出たとか、あるいは何も起きないとか、そういう具体的な情報を提供すれば回答がもらえるかもしれません。
MillkeyStars 2013/6/10(Mon) 13:17:16|NO.54789
ファイルをロックしたいだけなら、CreateFile 関数の共有のところを共有させないようにすればいい。
ソースの中にある LockFile は、ファイルの一部分をロックする為の物であり、アクセス自体をロックするものではない。
以下、ファイル自体のロック仕方。
#uselib "kernel32.dll"
#cfunc CreateFile "CreateFileA" sptr,int,int,int,int,int,int
#cfunc CloseHandle "CloseHandle" int
#define GENERIC_ALL 0x10000000
#define OPEN_EXISTING 0x00000003
#define INVALID_HANDLE_VALUE -1
onexit *p_end
FileName = "d:\\test.avi"
fHandle = 0
fHandle = CreateFile(FileName,GENERIC_ALL,0,0,OPEN_EXISTING,0,0)
if fHandle = INVALID_HANDLE_VALUE{
mes "ファイルのロックに失敗しました。
} else {
mes FileName+" のファイルは、このプログラムを終了するまでロックされています。"
}
stop
*p_end
if fHandle != NULL : hr = CloseHandle(fHandle)
end