Czy istnieje sposób, aby uzyskać reprezentację łańcuchową wartości HRESULT za pomocą win API?

Czy istnieje funkcja w win API, która może być użyta do wyodrębnienia reprezentacji łańcuchowej wartości HRESULT?

Problem polega na tym, że nie wszystkie zwracane wartości są udokumentowane w MSDN, na przykład ExecuteInDefaultAppDomain() funkcja nie zwraca "0x80070002 - system nie może znaleźć określonego pliku.", jednak tak! Dlatego zastanawiałem się, czy istnieje funkcja, która ma być używana w powszechnym przypadku.

Author: khkarens, 2011-08-10

3 answers

Możesz użyć _com_error :

_com_error err(hr);
LPCTSTR errMsg = err.ErrorMessage();

Jeśli nie chcesz używać _com_error z jakiegokolwiek powodu, nadal możesz spojrzeć na jego źródło i zobaczyć, jak to się robi.

Nie zapomnij dołączyć nagłówka comdef.h

 71
Author: eran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-17 00:00:32

Windows API to FormatMessage . Oto link, który wyjaśnia, jak to zrobić: Jak uzyskać opisy komunikatów o błędach za pomocą FormatMessage API .

Dla wiadomości Win32 (wiadomości z HRESULT, który zaczyna się od 0X8007, czyli FACILITY_WIN32), musisz usunąć słowo hi order. Na przykład w 0x80070002 musisz wywołać FormatMessage z 0x0002.

Jednak nie zawsze działa dla każdego rodzaju wiadomości. I dla niektórych konkretnych wiadomości (specyficzne dla technologii, dostawcy itp.), trzeba załadować odpowiednią DLL zasobów, co nie zawsze jest łatwym zadaniem, ponieważ trzeba znaleźć ten DLL.

 14
Author: Simon Mourier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-12 07:27:37

Oto przykład użycia FormatMessage ()

LPTSTR SRUTIL_WinErrorMsg(int nErrorCode, LPTSTR pStr, WORD wLength )
{
    try
    {
        LPTSTR  szBuffer = pStr;
        int nBufferSize = wLength;

        //
        // prime buffer with error code
        //
        wsprintf( szBuffer, _T("Error code %u"), nErrorCode);

        //
        // if we have a message, replace default with msg.
        //
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
                NULL, nErrorCode,
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
                (LPTSTR) szBuffer,   
                nBufferSize,    
                NULL );
    }
    catch(...)
    {
    }
    return pStr;
} // End of SRUTIL_WinErrorMsg()
 0
Author: WebDrive,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-26 15:27:27