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 වින්‍යාසය අවශ්‍ය වේ.

අදාළ ලිපි