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 конфигурациясын қажет етеді.

Қатысты мақалалар