मैं CallNtPowerInformation का उपयोग करके SystemBatteryState प्राप्त करने का प्रयास कर रहा हूं। मैंने SetLastError एट्रिब्यूट को true पर सेट किया है, लेकिन Marshal.GetLastWin32Error() हमेशा 0 देता है, भले ही CallNtPowerInformation द्वारा दिया गया स्टेटस कोड 0 के बराबर न हो।

कोड का उदाहरण जहां मैं GetLastWin32Error गैर-शून्य मान लौटाने की अपेक्षा कर रहा हूं (मैं आउटपुटबफ़र के लिए आवश्यकता से कम मेमोरी आवंटित करता हूं):

var outputBufferLength = Marshal.SizeOf(typeof(SYSTEM_BATTERY_STATE)) - 1;
var outputBuffer = Marshal.AllocHGlobal(outputBufferLength);

var statusCode = CallNtPowerInformation(
    POWER_INFORMATION_LEVEL.SystemBatteryState,
    IntPtr.Zero,
    0,
    outputBuffer,
    (uint)outputBufferLength
);

var errorCode = Marshal.GetLastWin32Error();
Console.WriteLine("Win32 error code: " + errorCode);

मेरा CallNtPowerInformation:

[DllImport("powrprof.dll", SetLastError = true, ExactSpelling = true,
            CallingConvention = CallingConvention.Cdecl)]
private static extern uint CallNtPowerInformation(
    [In] POWER_INFORMATION_LEVEL informationLevel,
    [In] IntPtr inputBuffer,
    [In] uint inputBufferLength,
    [Out] IntPtr outputBuffer,
    [In] uint outputBufferLength
);

CallNtPowerInformation कोड 3221225507 (STATUS_BUFFER_TOO_SMALL) देता है, लेकिन GetLastWin32Error 0 देता है। क्या इसे कुछ त्रुटि लौटानी चाहिए? या मैं क्या गलत कर रहा हूँ?

पी.एस. हो सकता है कि CallNtPowerInformation से केवल स्थिति कोड प्राप्त करना पर्याप्त हो, लेकिन फिर हमें SetLastError = true की आवश्यकता क्यों है?

-1
Aizeren 25 पद 2021, 13:08

1 उत्तर

सबसे बढ़िया उत्तर

GetLastWin32Error केवल उन तरीकों के लिए काम करेगा जहां प्रलेखन कहता है कि उन्होंने अंतिम त्रुटि मान निर्धारित किया है। CallNtPowerInformation उनमें से एक नहीं है . यह विधि सीधे एक त्रुटि कोड लौटाती है, इसलिए अंतिम त्रुटि कोड अपडेट नहीं किया जाएगा। अंतिम त्रुटि मान का उपयोग नहीं करने वाली विधि की घोषणा में SetLastError = true का उपयोग करना बेकार है और इसका कोई प्रभाव नहीं है (अंततः पिछले विफल सिस्टम कॉल से त्रुटि कोड वापस करने के अलावा)।

प्रलेखन स्पष्ट रूप से कुछ ऐसा कहता है जैसे GetLastError द्वारा लौटाए गए मान को अद्यतन करने वाले कार्यों के लिए "अधिक जानकारी प्राप्त करने के लिए GetLastError का उपयोग करें"।

0
PMF 25 पद 2021, 13:13
धन्यवाद! मैंने CallNtPowerInformation का उपयोग करने के बहुत सारे उदाहरण देखे और SetLastError = true सेट किया गया था इसलिए मैंने सोचा कि यह कुछ समझ में आता है।
 – 
Aizeren
25 पद 2021, 13:20