INTERNET_PROXY_INFO berisi tipe akses DWORD dan dua pointer string. Kueri native juga membutuhkan ruang buffer yang cukup untuk data proxy-nya; Marshal.SizeOf dari struktur terkelola kecil bukan buffer hasil lengkap dengan panjang variabel.

Pembantu kompatibilitas desktop dapat memakai titik masuk ANSI dan menyalin string sebelum melepaskan buffer kueri itu:

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 adalah INTERNET_OPTION_PROXY; 122 adalah ERROR_INSUFFICIENT_BUFFER. Panggilan pertama memperoleh jumlah byte yang diperlukan, dan yang kedua mengisi alokasi itu. Jika hasil bertambah di antara panggilan, kegagalan kedua dilaporkan alih-alih membaca buffer yang terlalu kecil.

Pertahankan AccessType sebagai uint. Dalam proses 64-bit nilainya tetap DWORD 32-bit, sementara bidang pointer melebar mengikuti arsitektur proses. Tata letak berurutan normal memberikan perataan yang sesuai.

Contoh ini menyangkut buffer hasil opsi 38. Jangan terapkan pola kepemilikannya secara buta ke INTERNET_OPTION_PER_CONNECTION_OPTION, yang opsi stringnya yang dikembalikan memerlukan pembersihan terpisah yang didokumentasikan.

Hasilnya menjelaskan konfigurasi WinINet pada cakupan handle yang dipilih. Ini bukan keputusan PAC untuk URL sembarang atau laporan rute efektif setiap peramban. Ketika string proxy yang dikembalikan adalah peta khusus protokol, pertahankan struktur itu alih-alih memperlakukannya sebagai satu titik akhir. WinINet adalah API desktop; aplikasi layanan memerlukan susunan WinHTTP yang didukungnya.

Artikel terkait