例外を発生させる行為は、呼び出しスレッドのエラーコードをリセットする可能性があります。例外ハンドラ内でGetLastError()
を呼び出すのは適切ではありません。言われていること
、TFileStream
ファイルを開くに失敗した場合、例外が(ただし、実際のエラーコード)システム提供のエラーメッセージが含まれていることを上げて、例えば:
procedure TForm1.Button1Click(Sender: TObject);
var
Stream: TStream;
begin
try
Stream := TFileStream.Create('d:\toto.docx', fmOpenRead);
try
// use Stream as needed
finally
Stream.Free;
end;
except
on E: Exception do
ShowMessage('Erreur : ' + E.Message);
end;
end;
あなたはアクセスする必要がある場合エラーコードに、あなたはTFileStream
を使用することはできません、あなたが代わりに直接CreateFile()
を使用する必要があります。また
procedure TForm1.Button1Click(Sender: TObject);
var
hFile: THandle;
iError: DWORD;
begin
hFile := CreateFile('d:\toto.docx', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
if hFile <> INVALID_HANDLE_VALUE then
begin
try
// use hFile as needed...
//
// if you need to access the file as a TStream, you can
// instantiate a THandleStream passing hFile to its constructor...
//
finally
CloseHandle(hFile);
end;
end else
begin
iError := GetLastError;
ShowMessage('Erreur : ' + IntToStr(iError));
if iError = ERROR_SHARING_VIOLATION then
begin
// do something...
end;
end;
end;
:
procedure TForm1.Button1Click(Sender: TObject);
var
hFile: THandle;
begin
hFile := CreateFile('d:\toto.docx', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
try
Win32Check(hFile <> INVALID_HANDLE_VALUE);
try
// use hFile as needed...
finally
CloseHandle(hFile);
end;
except
on E: EOSError do
begin
ShowMessage('Erreur : ' + IntToStr(E.ErrorCode));
if E.ErrorCode = ERROR_SHARING_VIOLATION then
begin
// do something...
end;
end;
end;
end;
私はこのコードを書いて、ロックされたドキュメントを検出します。ランタイムパックのないgetLastErrorにはコード32があります。ファイルがロックされていることを検出する最良の方法は何ですか? – Joc02
最新の編集を見る –