INTERNET_PROXY_INFO bevat een DWORD-toegangstype en twee tekenreeksaanwijzers. De native query heeft ook genoeg bufferruimte nodig voor zijn proxygegevens; Marshal.SizeOf van een kleine beheerde structuur is geen volledige resultaatbuffer met variabele lengte.

Een desktopcompatibiliteitshulp kan het ANSI-toegangspunt gebruiken en de tekenreeksen kopiëren voordat die querybuffer wordt vrijgegeven:

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. De eerste aanroep haalt het benodigde aantal bytes op en de tweede vult die toewijzing. Als het resultaat tussen aanroepen groeit, wordt de tweede fout gemeld in plaats van een te kleine buffer te lezen.

Houd AccessType als uint. In een 64-bits proces blijft het een 32-bits DWORD, terwijl de aanwijzervelden meegroeien met de procesarchitectuur. De normale sequentiële indeling levert de bijbehorende uitlijning.

Dit voorbeeld gaat over de resultaatbuffer van optie 38. Pas het eigendomspatroon niet blindelings toe op INTERNET_OPTION_PER_CONNECTION_OPTION, waarvan de teruggegeven tekenreeksopties hun gedocumenteerde aparte opschoning vereisen.

Het resultaat beschrijft de WinINet-configuratie binnen het gekozen handlebereik. Het is geen PAC-beslissing voor een willekeurige URL en geen rapport van de feitelijke route van elke browser. Wanneer de teruggegeven proxystring een protocolspecifieke kaart is, behoud die structuur in plaats van hem als één eindpunt te behandelen. WinINet is de desktop-API; dienstoepassingen hebben hun ondersteunde WinHTTP-indeling nodig.

Gerelateerde artikelen