मैं WinAPI से WSAGetLastError()
कैसे कॉल करूं ताकि मुझे वैध टेक्स्ट त्रुटि मिल सके?अंतिम त्रुटि कैसे प्राप्त करें (WSAGetLastError)?
उत्तर
[DllImport("ws2_32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern Int32 WSAGetLastError();
इसके अलावा, pinvoke.net पर यह कहा है:
तुम कभी GetLastError को PInvoke चाहिए। मार्शल को कॉल करें। गेटलास्टविन 32 इसके बजाय त्रुटि!
प्रबंधित कोड से उस फ़ंक्शन को कॉल करने के लिए यह बहुत अधिक समझ में नहीं आता है। यह अप्रबंधित कोड में समझ में आता है क्योंकि आप सटीक अंतिम Win32 फ़ंक्शन को जानते हैं जिसे आप बुलाया गया था, इसलिए आप जानते हैं कि किस फ़ंक्शन ने अंतिम त्रुटि सेट करनी होगी। प्रबंधित कोड में, आप नहीं जानते कि किन कार्यों को बुलाया गया है।
आप शायद फ़ंक्शन को कॉल करने के लिए पी/Invoke का उपयोग कर सकते हैं; यह सिर्फ आपको अच्छा नहीं करेगा। आप क्या खत्म करने की कोशिश कर रहे हैं?
WSAGetLastError
Win32 GetLastError
फ़ंक्शन के लिए केवल एक रैपर है।
यदि आप पी/Invoke के साथ चीजें कर रहे हैं, तो आप DllImport
विशेषता पर SetLastError
पैरामीटर का उपयोग कर सकते हैं। यह .NET को बताता है कि आयातित फ़ंक्शन SetLastError()
पर कॉल करेगा, और यह मान एकत्र किया जाना चाहिए।
यदि आयातित फ़ंक्शन विफल रहता है, तो आप Marshal.GetLastWin32Error()
के साथ अंतिम त्रुटि प्राप्त कर सकते हैं। वैकल्पिक रूप से, आप केवल throw new Win32Exception()
कर सकते हैं, जो स्वचालित रूप से इस मान का उपयोग करता है।
यदि आप पी/Invoke के साथ चीजें नहीं कर रहे हैं, तो आप भाग्य से बाहर हैं: इस बात की कोई गारंटी नहीं है कि अंतिम त्रुटि मान को .NET कोड की कई परतों के माध्यम से वापस लाने के लिए पर्याप्त लंबे समय तक संरक्षित किया जाएगा। वास्तव में, मैं एडम नाथन से लिंक करूंगा: never define a PInvoke signature for GetLastError।
इस तरह मैं वेब सी # अपवाद में GetLastError डाल करने पर देखा mechanismand कैसे इसे वापस बाहर फिर से पाने के लिए ...
try
{
// some p/invoke call that is going to fail with a windows error ...
mHndActivatedDevice = MyNameSpace.Interop.Device.Device.ActivateDevice(
"Drivers\\BuiltIn\\SomeDriverName", IntPtr.Zero, 0, IntPtr.Zero);
}
catch(System.ComponentModel.Win32Exception exc) // as suggested by John Saunders
{
// you can get the last error like this:
int lastError = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
Console.WriteLine("error:" + lastError.ToString());
// but it is also inside the exception, you can get it like this
Console.WriteLine(exc.NativeErrorCode.ToString());
Console.WriteLine(exc.ToString());
}
जहां ActivateDevice इस प्रकार परिभाषित किया गया है:
-1: कोड Win32Exception पकड़ना चाहिए, अपवाद नहीं। अन्यथा, कुछ अन्य अपवाद प्रकार पकड़े जाने का मौका है, तो Win32Exception के मामले में विफल रहा है। –
мерси! टिप्पणी। लम्बाई = 10; –