【发布时间】:2014-07-20 23:17:12
【问题描述】:
我需要使用 MFC 的 CString 将一些调试信息发布到日志中,但我似乎无法找到它是否保留了最后一个 WinAPI 设置的错误代码(并且可以使用 GetLastError 检索)?
编辑:这是我目前在现有项目中所做的简化版本的代码示例:
HANDLE hFile = CreateFile(strFilePath, ...);
if(hFile == INVALID_HANDLE_VALUE)
{
logError(collectDebuggerInfo(strFilePath));
}
void logError(LPCTSTR pStrDesc)
{
int nLastError = ::GetLastError();
CString str;
str.Format(L"LastError=%d, Description: %s", nLastError, pStrDesc);
//Add 'str' to the logging file...
}
CString collectDebuggerInfo(LPCTSTR pFilePath)
{
int nLastError = ::GetLastError();
CString str;
str.Format(L"Debugging info for file: \"%s\"", pFilePath);
::SetLastError(nLastError);
return str; //RETURNING CString -- will it overwrite the last error?
}
【问题讨论】:
-
CString的方法不可能保留错误代码。一些方法进行 API 调用(通过new或malloc),如果他们有代码来保存错误代码,那将是非常令人惊讶的,因为这不是CString会关心的事情。它处于错误的抽象级别。 -
您可以将 GetLastError 代码保留在 DWORD 中。 CString 和它有什么关系?
-
返回
CString会调用复制构造函数,这可能会影响GetLastError。 (例如,如果存在每个线程的CString缓存,则对TlsGetValue的调用将破坏GetLastError。)通常,不能保证任何函数在成功时保留GetLastError。 -
在示例中,您展示了将“最后一个错误”代码缓存在您自己的成员变量(或全局)中而不是尝试猜测使用
SetLastError和 @ 是否安全987654335@. -
为什么不在调用时将
GetLastError的值传递给您的日志记录函数?GetLastError只保证在返回失败的调用之后立即有意义,因此此时您应该保存错误代码。
标签: c++ string winapi mfc getlasterror