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 ക്രമീകരണം വേണം.

അനുബന്ധ ലേഖനങ്ങൾ