INTERNET_PROXY_INFO bevat 'n DWORD-toegangstipe en twee stringwysers. Die inheemse navraag het ook genoeg bufferruimte vir sy proxy-data nodig; Marshal.SizeOf van 'n klein bestuurde struktuur is nie 'n volledige resultaatbuffer met veranderlike lengte nie.

'n Lessenaar-versoenbaarheidshulp kan die ANSI-ingangspunt gebruik en die stringe kopieer voordat daardie navraagbuffer vrygestel word:

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 is INTERNET_OPTION_PROXY; 122 is ERROR_INSUFFICIENT_BUFFER. Die eerste oproep verkry die vereiste greepgetal, en die tweede vul daardie toekenning. As die resultaat tussen oproepe groei, word die tweede fout gerapporteer eerder as om 'n te klein buffer te lees.

Hou AccessType as uint. Dit bly 'n 32-bis DWORD in 'n 64-bis proses, terwyl die wyservelde met die prosesargitektuur groei. Normale sekwensiële uitleg voorsien die ooreenstemmende belyning.

Hierdie voorbeeld handel oor opsie 38 se resultaatbuffer. Moet nie sy eienaarskappatroon blindelings op INTERNET_OPTION_PER_CONNECTION_OPTION toepas nie, want die stringopsies wat dit teruggee, vereis hul gedokumenteerde afsonderlike opruiming.

Die resultaat beskryf die WinINet-konfigurasie op die gekose handvatselomvang. Dit is nie 'n PAC-besluit vir 'n willekeurige URL of 'n verslag van elke blaaier se effektiewe roete nie. Wanneer die teruggegewe proxy-string 'n protokolspesifieke kaart is, behou daardie struktuur eerder as om dit as een eindpunt te behandel. WinINet is die lessenaar-API; diensprogramme het hul ondersteunde WinHTTP-reëling nodig.

Verwante artikels