Сохраняет ли CString код GetLastError?

Мне нужно опубликовать некоторую отладочную информацию в журнале, используя CSFC для MFC, но я не могу найти, сохраняет ли он код ошибки, установленный последним 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?
}

1 ответ

Одним из удобных решений было бы определить класс, который содержит как 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);
}

Таким образом, вам не нужно менять код, который вызывает функции обработки ошибок.

Другие вопросы по тегам