Мне нужно опубликовать отладочную информацию в журнал, используя 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, так и код последней ошибки, а затем перегрузить logError
и переопределить collectDebuggerInfo
что-то вроде этого:
void logError(StringWithEmbeddedErrorCode instr)
{
LPCTSTR pStrDesc = instr.str;
SetLastError(instr.nLastError);
logError(pStrDesc);
}
StringWithEmbeddedErrorCode collectDebuggerInfo(LPCTSTR pFilePath)
{
int nLastError = ::GetLastError();
CString str;
str.Format(L"Debugging info for file: \"%s\"", pFilePath);
return StringWithEmbeddedErrorCode(str, nLastError);
}
Таким образом, вам не нужно менять код, который вызывает функции обработки ошибок.