INTERNET_PROXY_INFO yana ɗauke da nau'in shiga DWORD da masu nuni biyu na zance. Tambayar asali kuma tana buƙatar isasshen sarari buffer don bayanan wakili; Marshal.SizeOf na ƙaramin tsari da ake sarrafawa ba cikakken buffer sakamako mai canjin tsayi ba ne.

Mataimakin jituwa na tebur zai iya amfani da wurin shiga ANSI kuma ya kwafi zancen kafin a saki wannan buffer ɗin tambayar:

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 shine INTERNET_OPTION_PROXY; 122 shine ERROR_INSUFFICIENT_BUFFER. Kira na farko yana samun adadin byte da ake buƙata, na biyu kuma yana cika wannan rabon. Idan sakamakon ya girma tsakanin kira, ana ba da rahoton gazawar ta biyu maimakon karanta buffer ƙarami.

Ka riƙe AccessType a matsayin uint. A cikin tsari na 64-bit yana zama DWORD na 32-bit, yayin da filayen masu nuni ke faɗaɗa tare da gine-ginen tsari. Tsarin jeri na al'ada yana ba da daidaiton da ya dace.

Wannan misali ya shafi buffer sakamakon zaɓi na 38. Kada ka yi amfani da tsarin mallakarsa a makance a kan INTERNET_OPTION_PER_CONNECTION_OPTION, wanda zaɓuɓɓukan zance da ake dawowa suke buƙatar tsaftacewar daban da aka rubuta.

Sakamakon yana bayyana tsarin WinINet a iyakar riƙon da aka zaɓa. Ba shawara ta PAC ba ce ga URL na sabani ko rahoton hanyar da kowane burauza ke bi. Idan zancen wakili da aka dawo taswirar takamaiman yarjejeniya ne, ka kiyaye wannan tsarin maimakon ɗaukar sa a matsayin ƙarshen ɗaya. WinINet API ne na tebur; aikace-aikacen sabis suna buƙatar tsarin WinHTTP da aka goyi bayan.

Labarai masu alaƙa