यहाँ प्रणाली से वापस एक HRESULT
के लिए एक त्रुटि संदेश प्राप्त करने के लिए उचित तरीका है (इस मामले में नामित HRESULT, या आप GetLastError()
साथ यह जगह ले सकता है):
LPTSTR errorText = NULL;
FormatMessage(
// use system message tables to retrieve error text
FORMAT_MESSAGE_FROM_SYSTEM
// allocate buffer on local heap for error text
|FORMAT_MESSAGE_ALLOCATE_BUFFER
// Important! will fail otherwise, since we're not
// (and CANNOT) pass insertion parameters
|FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, // unused with FORMAT_MESSAGE_FROM_SYSTEM
hresult,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&errorText, // output
0, // minimum size for output buffer
NULL); // arguments - see note
if (NULL != errorText)
{
// ... do something with the string `errorText` - log it, display it to the user, etc.
// release memory allocated by FormatMessage()
LocalFree(errorText);
errorText = NULL;
}
इस और डेविड हानाक के उत्तर के बीच महत्वपूर्ण अंतर FORMAT_MESSAGE_IGNORE_INSERTS
ध्वज का उपयोग है। एमएसडीएन थोड़ा सा अस्पष्ट है कि प्रविष्टि का उपयोग कैसे किया जाना चाहिए, लेकिन Raymond Chen notes that you should never use them सिस्टम संदेश पुनर्प्राप्त करते समय, क्योंकि आपके पास यह जानने का कोई तरीका नहीं है कि सिस्टम किस प्रविष्टि की अपेक्षा करता है।
Fwiw, आप ++ आप _com_error
वर्ग का उपयोग करके अपने जीवन को थोड़ा आसान बना सकते हैं विज़ुअल सी उपयोग कर रहे हैं:
{
_com_error error(hresult);
LPCTSTR errorText = error.ErrorMessage();
// do something with the error...
//automatic cleanup when error goes out of scope
}
MFC या ATL का हिस्सा नहीं सीधे जहाँ तक मुझे पता है हूँ।
सावधान रहें: यह कोड Win32 त्रुटि कोड के स्थान पर hResult का उपयोग करता है: वे अलग-अलग चीजें हैं! वास्तव में जो हुआ उससे आप एक पूरी तरह से अलग त्रुटि का पाठ प्राप्त कर सकते हैं। –
उत्कृष्ट बिंदु, @ एंड्रेई - और वास्तव में, अगर त्रुटि * एक Win32 त्रुटि है, तो यह दिनचर्या केवल तभी सफल होगी जब यह एक * सिस्टम * त्रुटि है - एक मजबूत त्रुटि-हैंडलिंग तंत्र को स्रोत के बारे में पता होना चाहिए त्रुटि, FormatMessage को कॉल करने से पहले कोड की जांच करें और इसके बजाय अन्य स्रोतों से पूछें। – Shog9
@AndreiBelogortseff मुझे कैसे पता चलेगा कि प्रत्येक मामले में क्या उपयोग करना है? उदाहरण के लिए, 'RegCreateKeyEx' एक' लंबा 'देता है। इसके दस्तावेज़ कहते हैं कि मैं त्रुटि पुनर्प्राप्त करने के लिए 'FormatMessage' का उपयोग कर सकता हूं, लेकिन मुझे' LONG' को 'HRESULT' में डालना होगा। – csl