TLa*_*ama 6 delphi delphi-2009
假设我有一个带有这个伪代码的DLL库:
var
LastError: DWORD;
procedure DoSomethingWrong; stdcall;
var
FileStream: TFileStream;
begin
try
FileStream := TFileStream.Create('?', fmCreate);
except
on EFCreateError do
LastError := GetLastError; // <- why does GetLastError return 0 here ?
end;
end;
Run Code Online (Sandbox Code Playgroud)
为什么GetLastError函数在如上所示的DLL库中使用时返回0?有没有办法获得此案例的最后一个错误代码?
Dav*_*nan 10
您对GetLastError返回的调用,0因为返回后调用了其他API CreateFile,并且您的异常代码将执行.
GetLastError线程局部变量返回的错误代码,在线程中运行的所有代码之间共享.因此,为了捕获错误代码,您需要GetLastError在失败的函数返回后立即调用.
该文件解释它是这样的:
调用线程执行的函数通过调用SetLastError函数来设置该值 .当函数的返回值指示此类调用将返回有用数据时,应立即调用GetLastError函数.这是因为一些函数在成功时调用 SetLastError为零,消除了最近失败的函数设置的错误代码.
如果您正在使用,TFileStream.Create那么框架不会让您有机会GetLastError在适当的时候致电.如果你真的想获得这些信息,你必须CreateFile自己打电话,THandleStream而不是使用TFileStream.
有这个想法,THandleStream你负责合成传递给构造函数的文件句柄THandleStream.这使您有机会在发生故障时捕获错误代码.