INTERNET_PROXY_INFO mengandungi jenis akses DWORD dan dua penuding rentetan. Pertanyaan asli juga memerlukan ruang buffer yang mencukupi untuk data proksinya; Marshal.SizeOf struktur terurus kecil bukan buffer hasil lengkap dengan panjang berubah.

Pembantu keserasian desktop boleh menggunakan titik masuk ANSI dan menyalin rentetan sebelum melepaskan buffer pertanyaan 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 ialah INTERNET_OPTION_PROXY; 122 ialah ERROR_INSUFFICIENT_BUFFER. Panggilan pertama memperoleh bilangan bait yang diperlukan, dan yang kedua mengisi peruntukan itu. Jika hasil bertambah antara panggilan, kegagalan kedua dilaporkan dan bukannya membaca buffer yang terlalu kecil.

Kekalkan AccessType sebagai uint. Dalam proses 64-bit ia kekal DWORD 32-bit, manakala medan penuding meluas dengan seni bina proses. Susun atur jujukan biasa memberikan penjajaran yang sepadan.

Contoh ini berkaitan buffer hasil pilihan 38. Jangan gunakan corak pemilikannya secara membuta tuli pada INTERNET_OPTION_PER_CONNECTION_OPTION, yang pilihan rentetannya yang dikembalikan memerlukan pembersihan berasingan yang didokumenkan.

Hasilnya menerangkan konfigurasi WinINet pada skop pengendali yang dipilih. Ia bukan keputusan PAC untuk URL sewenang-wenangnya atau laporan laluan berkesan setiap pelayar. Apabila rentetan proksi yang dikembalikan ialah peta khusus protokol, kekalkan struktur itu dan bukannya menganggapnya sebagai satu titik akhir. WinINet ialah API desktop; aplikasi perkhidmatan memerlukan susunan WinHTTP yang disokongnya.

Artikel berkaitan