INTERNET_PROXY_INFO satur DWORD piekļuves tipu un divus virknes rādītājus. Vietējam vaicājumam arī nepieciešams pietiekami daudz bufera vietas tā starpniekservera datiem; mazas pārvaldītas struktūras Marshal.SizeOf nav pilnīgs mainīga garuma rezultāta buferis.

Darbvirsmas saderības palīgs var izmantot ANSI ieejas punktu un kopēt virknes pirms šī vaicājuma bufera atbrīvošanas:

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 ir INTERNET_OPTION_PROXY; 122 ir ERROR_INSUFFICIENT_BUFFER. Pirmais izsaukums iegūst nepieciešamo baitu skaitu, otrais aizpilda šo piešķīrumu. Ja rezultāts starp izsaukumiem pieaug, tiek ziņots par otro kļūmi, nevis lasīts pārāk mazs buferis.

Saglabājiet AccessType kā uint. 64 bitu procesā tas paliek 32 bitu DWORD, bet rādītāja lauki paplašinās līdz ar procesa arhitektūru. Parastais secīgais izkārtojums nodrošina atbilstošo izlīdzinājumu.

Šis piemērs attiecas uz 38. opcijas rezultāta buferi. Nepiemērojiet tā īpašumtiesību modeli akli INTERNET_OPTION_PER_CONNECTION_OPTION, kura atgrieztajām virknes opcijām nepieciešama dokumentētā atsevišķā tīrīšana.

Rezultāts apraksta WinINet konfigurāciju izvēlētajā roktura tvērumā. Tas nav PAC lēmums patvaļīgam URL vai pārskats par katras pārlūkprogrammas faktisko maršrutu. Ja atgrieztā starpniekservera virkne ir protokolam raksturīga karte, saglabājiet šo struktūru, nevis uzskatiet to par vienu galapunktu. WinINet ir darbvirsmas API; pakalpojumu lietojumprogrammām nepieciešams to atbalstītais WinHTTP izkārtojums.

Saistītie raksti