INTERNET_PROXY_INFO DWORD kirish turi va ikkita satr ko'rsatkichini o'z ichiga oladi. Mahalliy so'rov proksi ma'lumotlari uchun yetarli bufer joyini ham talab qiladi; kichik boshqariladigan tuzilmaning Marshal.SizeOf qiymati to'liq o'zgaruvchan uzunlikdagi natija buferi emas.

Ish stoli muvofiqlik yordamchisi ANSI kirish nuqtasidan foydalanib, o'sha so'rov buferini bo'shatishdan oldin satrlarni nusxalashi mumkin:

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. Birinchi chaqiruv kerakli bayt sonini oladi, ikkinchisi bu ajratmani to'ldiradi. Agar natija chaqiruvlar orasida o'ssa, juda kichik bufer o'qish o'rniga ikkinchi xato haqida xabar beriladi.

AccessType'ni uint sifatida saqlang. 64 bitli jarayonda u 32 bitli DWORD bo'lib qoladi, ko'rsatkich maydonlari esa jarayon arxitekturasi bilan kengayadi. Oddiy ketma-ket joylashuv mos tekislashni ta'minlaydi.

Bu misol 38-variant natija buferiga tegishli. Uning egalik namunasini INTERNET_OPTION_PER_CONNECTION_OPTION ga ko'r-ko'rona qo'llamang, uning qaytariladigan satr variantlari o'zining hujjatlashtirilgan alohida tozalashini talab qiladi.

Natija tanlangan tutqich doirasidagi WinINet konfiguratsiyasini tavsiflaydi. Bu ixtiyoriy URL uchun PAC qarori yoki har bir brauzerning haqiqiy marshruti haqidagi hisobot emas. Qaytarilgan proksi satri protokolga xos xarita bo'lsa, uni bitta oxirgi nuqta deb hisoblash o'rniga o'sha tuzilmani saqlang. WinINet — ish stoli API; xizmat ilovalari o'zlarining qo'llab-quvvatlanadigan WinHTTP sozlamasiga muhtoj.

O'xshash maqolalar