引发异常的行为可以重置调用线程的错误代码。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;