INTERNET_PROXY_INFO enthält einen DWORD-Zugriffstyp und zwei Zeiger auf Zeichenfolgen. Die native Abfrage benötigt außerdem genügend Pufferplatz für ihre Proxydaten; Marshal.SizeOf einer kleinen verwalteten Struktur ist kein vollständiger Ergebnispuffer variabler Länge.

Ein Desktop-Kompatibilitätshelfer kann den ANSI-Einstiegspunkt verwenden und die Zeichenfolgen kopieren, bevor dieser Abfragepuffer freigegeben wird:

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 ist INTERNET_OPTION_PROXY; 122 ist ERROR_INSUFFICIENT_BUFFER. Der erste Aufruf ermittelt die benötigte Byteanzahl, der zweite füllt diese Zuordnung. Wächst das Ergebnis zwischen den Aufrufen, wird der zweite Fehler gemeldet, statt einen zu kleinen Puffer zu lesen.

Behalten Sie AccessType als uint bei. In einem 64-Bit-Prozess bleibt es ein 32-Bit-DWORD, während sich die Zeigerfelder mit der Prozessarchitektur erweitern. Die normale sequenzielle Anordnung liefert die passende Ausrichtung.

Dieses Beispiel betrifft den Ergebnispuffer von Option 38. Wenden Sie sein Eigentumsmuster nicht blind auf INTERNET_OPTION_PER_CONNECTION_OPTION an, dessen zurückgegebene Zeichenfolgenoptionen ihre dokumentierte separate Bereinigung erfordern.

Das Ergebnis beschreibt die WinINet-Konfiguration im Bereich des gewählten Handles. Es ist keine PAC-Entscheidung für eine beliebige URL und kein Bericht über die tatsächliche Route jedes Browsers. Wenn die zurückgegebene Proxy-Zeichenfolge eine protokollspezifische Zuordnung ist, bewahren Sie diese Struktur, statt sie als einen Endpunkt zu behandeln. WinINet ist die Desktop-API; Dienstanwendungen benötigen ihre unterstützte WinHTTP-Anordnung.

Ähnliche Artikel