-1

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?
}
4

1 に答える 1

1

便利な解決策の 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);
}

この方法では、エラー処理関数を呼び出すコードを変更する必要はありません。

于 2014-07-22T04:49:46.583 に答える