INTERNET_PROXY_INFO enhavas DWORD-an alirtipon kaj du ĉenmontrilojn. La denaska demando ankaŭ bezonas sufiĉan bufran spacon por sia prokura datumaro; Marshal.SizeOf de malgranda mastrumata strukturo ne estas plena rezulta bufro de varia longo.

Labortabla kongrueca helpilo povas uzi la ANSI-enirejon kaj kopii la ĉenojn antaŭ ol liberigi tiun demandan bufron:

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 estas INTERNET_OPTION_PROXY; 122 estas ERROR_INSUFFICIENT_BUFFER. La unua alvoko akiras la bezonatan bajtokvanton, kaj la dua plenigas tiun asignon. Se la rezulto kreskos inter alvokoj, la dua malsukceso estas raportata anstataŭ legi tro malgrandan bufron.

Konservu AccessType kiel uint. En 64-bita procezo ĝi restas 32-bita DWORD, dum la montrilaj kampoj larĝiĝas kun la proceza arkitekturo. Normala sinsekva aranĝo donas la respondan ĝisrandigon.

Ĉi tiu ekzemplo koncernas la rezultan bufron de opcio 38. Ne apliku ĝian posedmodelon blinde al INTERNET_OPTION_PER_CONNECTION_OPTION, kies redonitaj ĉenopcioj bezonas sian dokumentitan apartan purigadon.

La rezulto priskribas la agordon de WinINet ĉe la elektita tenila amplekso. Ĝi ne estas PAC-decido por arbitra URL nek raporto pri la efektiva vojo de ĉiu retumilo. Kiam la redonita prokura ĉeno estas protokol-specifa mapo, konservu tiun strukturon anstataŭ trakti ĝin kiel unu finpunkton. WinINet estas la labortabla API; servaj aplikaĵoj bezonas sian subtenatan WinHTTP-aranĝon.

Rilataj artikoloj