Windows 7 64でLockfileを使用したDelphi
質問
64ビットWindows 7マシンから共有フォルダーの32ビットサーバーにあるファイルを開くと、読んでロックしてから再度開くことがわかりました。すべてのオープンハンドルを閉じると、ファイルは実際には開いたままです。
正確な手順は次のとおりです。
32ビットWindowsマシンの共有フォルダーに長さ7000〜10000バイトのファイルを配置し、Windows Server 2003を使用しています。
win32の次のコードをコンパイルして、wow64の下で実行するようにします。簡単にするために、私は試してみて、宣言などを見逃したことに注意してください。
(以下のコードフラグメントを参照してください。StackOverFlowバグは、リスト内にあるときにコードを正しくフォーマットしません)64ビットWindowsマシンでアプリケーションを実行します。ファイルは32ビットマシン上にある必要があります。WindowsServer2003を使用します。ファイルが64ビットサーバー上にある場合、バグは発生しません。
アプリケーションを終了します。
これで、サーバー上のコンピューターマネージャー(コントロールパネル - >コンピューター管理)を開き、ファイルが存在する共有フォルダーの開いたファイルを確認した場合、ファイルがまだ開いていることがわかります。
これはコードです:
procedure CauseFileLockBug(FileName: PChar);
var
FileHandle1: LongInt;
FileHandle2: LongInt;
Buffer: Pointer;
BytesRead: Cardinal;
begin
FileHandle1 := CreateFile(
FileName,
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
FILE_FLAG_RANDOM_ACCESS,
0);
if FileHandle1 > 0 then
begin
try
GetMem(Buffer, 1);
try
if ReadFile(FileHandle1, Buffer^, 1, BytesRead, nil) then
begin
if LockFile(FileHandle1, 6217, 0, 1, 0) then
begin
try
FileHandle2 := CreateFile(
FileName,
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
FILE_FLAG_RANDOM_ACCESS,
0);
if FileHandle2 > 0 then
begin
CloseHandle(FileHandle2);
end;
finally
UnLockFile(FileHandle1, 6217, 0, 1, 0);
end;
end;
end;
finally
FreeMem(Buffer);
end;
finally
CloseHandle(FileHandle1);
end;
end;
end;
ファイルを2回開くときにFile_flag_no_bufferingフラグを使用する場合、またはロックする前にファイルを読み取らない場合、問題は発生しません。
file_flag_no_bufferingを使用せずに、これにこれに気づいたか、それを解決する方法を知っている人はいますか? 64ビットWindowsクライアントが32ビットWindowsマシンでこの方法でファイルを開く場合にのみ発生することではなく、32からビットまたは64T〜64で発生しません。
解決
OK問題が解決しました。
NOD32 X64が問題を引き起こしているようです。フォルダー(すべてのネットワークパスとマッピングドライブ)にすべての可能なパスを除外リストに追加し、PCを再起動すると修正されました。
とにかくあなたの助けをありがとう。