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 зохицуулалтыг шаарддаг.

Холбоотой нийтлэлүүд