INTERNET_PROXY_INFO मध्ये DWORD प्रवेश प्रकार आणि दोन स्ट्रिंग पॉइंटर असतात. नेटिव्ह क्वेरीला तिच्या प्रॉक्सी डेटासाठी पुरेशी बफर जागा देखील लागते; लहान व्यवस्थापित रचनेचे Marshal.SizeOf पूर्ण बदलत्या लांबीचे परिणाम बफर नाही.

डेस्कटॉप सुसंगतता सहाय्यक ANSI प्रवेश बिंदू वापरू शकतो आणि ती क्वेरी बफर सोडण्यापूर्वी स्ट्रिंग्जची प्रत करू शकतो:

static class WinInetProxy
{
    [System.Runtime.InteropServices.StructLayout(
        System.Runtime.InteropServices.LayoutKind.Sequential)]
    struct ProxyInfo
    {
        public uint AccessType;
        public IntPtr Proxy;
        public IntPtr Bypass;
    }

    [System.Runtime.InteropServices.DllImport(
        "wininet.dll", EntryPoint = "InternetQueryOptionA",
        SetLastError = true)]
    [return: System.Runtime.InteropServices.MarshalAs(
        System.Runtime.InteropServices.UnmanagedType.Bool)]
    static extern bool Query(
        IntPtr handle, uint option, IntPtr buffer, ref uint size);

    public static (uint Type, string Proxy, string Bypass) Read()
    {
        uint size = 0;
        Query(IntPtr.Zero, 38, IntPtr.Zero, ref size);
        int error = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
        if (error != 122 || size == 0)
            throw new System.ComponentModel.Win32Exception(error);

        IntPtr buffer = System.Runtime.InteropServices.Marshal
            .AllocHGlobal(checked((int)size));
        try
        {
            if (!Query(IntPtr.Zero, 38, buffer, ref size))
                throw new System.ComponentModel.Win32Exception(
                    System.Runtime.InteropServices.Marshal.GetLastWin32Error());
            var value = System.Runtime.InteropServices.Marshal
                .PtrToStructure<ProxyInfo>(buffer);
            return (value.AccessType,
                System.Runtime.InteropServices.Marshal.PtrToStringAnsi(value.Proxy) ?? "",
                System.Runtime.InteropServices.Marshal.PtrToStringAnsi(value.Bypass) ?? "");
        }
        finally
        {
            System.Runtime.InteropServices.Marshal.FreeHGlobal(buffer);
        }
    }
}

38 म्हणजे INTERNET_OPTION_PROXY; 122 म्हणजे ERROR_INSUFFICIENT_BUFFER. पहिला कॉल आवश्यक बाइट संख्या मिळवतो आणि दुसरा तो वाटप भरतो. कॉलमध्ये निकाल वाढल्यास, खूप लहान बफर वाचण्याऐवजी दुसऱ्या अपयशाची नोंद दिली जाते.

AccessType uint म्हणून ठेवा. 64-बिट प्रक्रियेत तो 32-बिट DWORD राहतो, तर पॉइंटर फील्ड प्रक्रियेच्या आर्किटेक्चरसह रुंदावतात. सामान्य क्रमिक मांडणी संबंधित संरेखन देते.

हे उदाहरण पर्याय 38 च्या परिणाम बफरबद्दल आहे. त्याचा मालकी नमुना INTERNET_OPTION_PER_CONNECTION_OPTION वर डोळे झाकून लागू करू नका, कारण त्याच्या परत दिल्या जाणाऱ्या स्ट्रिंग पर्यायांना त्यांची नोंदवलेली स्वतंत्र साफसफाई आवश्यक आहे.

निकाल निवडलेल्या हँडल व्याप्तीवर WinINet संरचना वर्णन करतो. हा कोणत्याही अनियंत्रित URL साठी PAC निर्णय नाही किंवा प्रत्येक ब्राउझरच्या प्रभावी मार्गाचा अहवाल नाही. जेव्हा परत दिलेली प्रॉक्सी स्ट्रिंग प्रोटोकॉल-विशिष्ट नकाशा असते, तेव्हा तिला एक अंतबिंदू मानण्याऐवजी ती रचना जतन करा. WinINet डेस्कटॉप API आहे; सेवा अनुप्रयोगांना त्यांची समर्थित WinHTTP मांडणी आवश्यक आहे.

संबंधित लेख