INTERNET_PROXY_INFO turi DWORD prieigos tipą ir du eilutės rodykles. Natūrali užklausa taip pat reikalauja pakankamai buferio vietos savo proxy duomenims; mažos valdomos struktūros Marshal.SizeOf nėra visas kintamo ilgio rezultato buferis.

Darbalaukio suderinamumo pagalbinė priemonė gali naudoti ANSI įėjimo tašką ir nukopijuoti eilutes prieš atlaisvinant tą užklausos buferį:

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 yra INTERNET_OPTION_PROXY; 122 yra ERROR_INSUFFICIENT_BUFFER. Pirmas kvietimas gauna reikiamą baitų skaičių, antrasis užpildo tą paskirstymą. Jei rezultatas tarp kvietimų padidėja, pranešama apie antrą nesėkmę, o ne skaitomas per mažas buferis.

Laikykite AccessType kaip uint. 64 bitų procese jis lieka 32 bitų DWORD, o rodyklės laukai platėja kartu su proceso architektūra. Įprastas nuoseklus išdėstymas suteikia atitinkamą lygiavimą.

Šis pavyzdys susijęs su 38 parinkties rezultato buferiu. Nepriskirkite jo nuosavybės modelio aklai INTERNET_OPTION_PER_CONNECTION_OPTION, kurio grąžinamos eilučių parinktys reikalauja dokumentuoto atskiro valymo.

Rezultatas aprašo WinINet konfigūraciją pasirinktoje rankenos apimtyje. Tai nėra PAC sprendimas savavališkam URL ar ataskaita apie kiekvienos naršyklės faktinį maršrutą. Kai grąžinama proxy eilutė yra protokolui būdingas žemėlapis, išsaugokite tą struktūrą, o ne traktuokite ją kaip vieną galinį tašką. WinINet yra darbalaukio API; paslaugų programoms reikia jų palaikomo WinHTTP išdėstymo.

Susiję straipsniai