2011-08-10 9 views
39

क्या जीत एपीआई में कोई फ़ंक्शन है जिसका उपयोग HRESULT मान के स्ट्रिंग प्रस्तुति को निकालने के लिए किया जा सकता है?क्या जीत एपीआई का उपयोग कर HRESULT मूल्य की स्ट्रिंग प्रस्तुति प्राप्त करने का कोई तरीका है?

समस्या यह है कि सभी वापसी मान एमएसडीएन में दस्तावेज नहीं किए जाते हैं, उदाहरण के लिए ExecuteInDefaultAppDomain() फ़ंक्शन को "0x80070002" वापस करने के लिए दस्तावेज नहीं किया गया है - सिस्टम निर्दिष्ट फ़ाइल नहीं ढूंढ सकता है। "हालांकि, यह करता है! इसलिए, मैं सोच रहा था कि आम मामले में एक समारोह का उपयोग किया जाना है या नहीं।

+2

शीर्षक अलग है, लेकिन अनिवार्य रूप से इस सवाल का जवाब है (जैसा कि [इस] के लिए http://stackoverflow.com/questions/455434/how-should ही होगा -i-use-formatmessage-right-in-c) एक। –

उत्तर

62

आप _com_error उपयोग कर सकते हैं:

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

आप जो भी कारण के लिए _com_error का उपयोग नहीं करना चाहते हैं, तो आप अभी भी अपने स्रोत पर एक नज़र ले जा सकते हैं, और देखते हैं कि यह कैसे हुआ।

हैडर comdef.h

+4

सुविधा के लिए एक और पूर्ण नमूना: इनलाइन सीएसटींग GetMessageForHresult (HRESULT घंटा) { _com_error त्रुटि (घंटा); सीएसटीआरिंग सीएस; cs.Format (_T ("त्रुटि 0x% 08x:% s"), घंटा, त्रुटि। त्रुटि संदेश()); रिटर्न सीएस; } – nietras

+1

हेडर फ़ाइल आवश्यक: # शामिल

12

इस के लिए Windows API FormatMessage है शामिल करने के लिए मत भूलना। यहां एक लिंक है जो बताता है कि इसे कैसे करें: How to obtain error message descriptions using the FormatMessage API

Win32 संदेशों के लिए (HRESULT के साथ संदेश जो 0x8007 से शुरू होता है, जो FACILITY_WIN32 है), आपको हाय ऑर्डर शब्द को निकालना होगा। उदाहरण के लिए 0x80070002 में, आपको 0x0002 के साथ FormatMessage को कॉल करने की आवश्यकता है।

हालांकि, यह हमेशा किसी भी प्रकार के संदेश के लिए काम नहीं करता है। और कुछ विशिष्ट संदेशों (एक तकनीक के लिए विशिष्ट, एक विक्रेता, आदि) के लिए, आपको संबंधित संसाधन DLL लोड करना होगा, जो हमेशा एक आसान काम नहीं है, क्योंकि आपको यह DLL खोजने की आवश्यकता है।

+0

7x8007 में 7 FACILITY_WIN32 है और यह FACILITY_ITF नहीं है। उदाहरण के लिए देखें "COM त्रुटि कोडों का ढांचा" http://msdn.microsoft.com/en-us/library/ms690088 –

+0

@uvts_cvs - निश्चित रूप से। मेरी गलती। मैंने जवाब अपडेट किया है। –

+0

'HRESULT_CODE (घंटा) 'इसे Win32 त्रुटि कोड में बदल सकता है – Andy

-1

यहाँ() 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() 
+1

फ़ंक्शन में कैच क्लॉज का बिंदु क्या है? –

+0

मुझे नहीं पता था 'FormatMessage' फेंकता है ... – Andy

संबंधित मुद्दे

 संबंधित मुद्दे