INTERNET_PROXY_INFO ਵਿੱਚ DWORD ਐਕਸੈਸ ਕਿਸਮ ਅਤੇ ਦੋ ਸਟ੍ਰਿੰਗ ਪੁਆਇੰਟਰ ਹੁੰਦੇ ਹਨ। ਨੇਟਿਵ ਕਵੈਰੀ ਨੂੰ ਇਸਦੇ ਪ੍ਰੌਕਸੀ ਡੇਟਾ ਲਈ ਕਾਫ਼ੀ ਬਫ਼ਰ ਥਾਂ ਵੀ ਚਾਹੀਦੀ ਹੈ; ਛੋਟੀ ਪ੍ਰਬੰਧਿਤ ਬਣਤਰ ਦਾ Marshal.SizeOf ਪੂਰਾ ਬਦਲਦੇ ਲੰਬਾਈ ਵਾਲਾ ਨਤੀਜਾ ਬਫ਼ਰ ਨਹੀਂ ਹੈ।

ਇੱਕ ਡੈਸਕਟਾਪ ਅਨੁਕੂਲਤਾ ਸਹਾਇਕ ANSI ਪ੍ਰਵੇਸ਼ ਬਿੰਦੂ ਵਰਤ ਕੇ ਉਸ ਕਵੈਰੀ ਬਫ਼ਰ ਨੂੰ ਛੱਡਣ ਤੋਂ ਪਹਿਲਾਂ ਸਟ੍ਰਿੰਗਾਂ ਦੀ ਨਕਲ ਕਰ ਸਕਦਾ ਹੈ:

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 INTERNET_OPTION_PROXY ਹੈ; 122 ERROR_INSUFFICIENT_BUFFER ਹੈ। ਪਹਿਲੀ ਕਾਲ ਲੋੜੀਂਦੀ ਬਾਈਟ ਗਿਣਤੀ ਲੈਂਦੀ ਹੈ, ਅਤੇ ਦੂਜੀ ਉਸ ਅਲਾਟਮੈਂਟ ਨੂੰ ਭਰਦੀ ਹੈ। ਜੇ ਕਾਲਾਂ ਵਿਚਕਾਰ ਨਤੀਜਾ ਵਧਦਾ ਹੈ, ਤਾਂ ਬਹੁਤ ਛੋਟਾ ਬਫ਼ਰ ਪੜ੍ਹਨ ਦੀ ਥਾਂ ਦੂਜੀ ਅਸਫਲਤਾ ਦੀ ਰਿਪੋਰਟ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।

AccessType ਨੂੰ uint ਵਜੋਂ ਰੱਖੋ। 64-ਬਿੱਟ ਪ੍ਰਕਿਰਿਆ ਵਿੱਚ ਇਹ 32-ਬਿੱਟ DWORD ਰਹਿੰਦਾ ਹੈ, ਜਦੋਂ ਕਿ ਪੁਆਇੰਟਰ ਫ਼ੀਲਡ ਪ੍ਰਕਿਰਿਆ ਦੀ ਆਰਕੀਟੈਕਚਰ ਨਾਲ ਚੌੜੇ ਹੁੰਦੇ ਹਨ। ਆਮ ਲੜੀਵਾਰ ਲੇਆਉਟ ਸੰਬੰਧਿਤ ਸੰਰੇਖਣ ਦਿੰਦਾ ਹੈ।

ਇਹ ਉਦਾਹਰਨ ਵਿਕਲਪ 38 ਦੇ ਨਤੀਜਾ ਬਫ਼ਰ ਬਾਰੇ ਹੈ। ਇਸਦੇ ਮਾਲਕੀ ਪੈਟਰਨ ਨੂੰ INTERNET_OPTION_PER_CONNECTION_OPTION ਉੱਤੇ ਅੰਨ੍ਹੇਵਾਹ ਲਾਗੂ ਨਾ ਕਰੋ, ਜਿਸਦੇ ਵਾਪਸ ਕੀਤੇ ਸਟ੍ਰਿੰਗ ਵਿਕਲਪਾਂ ਨੂੰ ਉਨ੍ਹਾਂ ਦੀ ਦਸਤਾਵੇਜ਼ੀ ਵੱਖਰੀ ਸਫ਼ਾਈ ਚਾਹੀਦੀ ਹੈ।

ਨਤੀਜਾ ਚੁਣੇ ਹੋਏ ਹੈਂਡਲ ਦਾਇਰੇ ਵਿੱਚ WinINet ਸੰਰਚਨਾ ਦਾ ਵਰਣਨ ਕਰਦਾ ਹੈ। ਇਹ ਕਿਸੇ ਮਨਮਾਨੇ URL ਲਈ PAC ਫ਼ੈਸਲਾ ਜਾਂ ਹਰ ਬ੍ਰਾਊਜ਼ਰ ਦੇ ਪ੍ਰਭਾਵੀ ਰਸਤੇ ਦੀ ਰਿਪੋਰਟ ਨਹੀਂ ਹੈ। ਜਦੋਂ ਵਾਪਸ ਕੀਤੀ ਪ੍ਰੌਕਸੀ ਸਟ੍ਰਿੰਗ ਪ੍ਰੋਟੋਕਾਲ-ਵਿਸ਼ੇਸ਼ ਨਕਸ਼ਾ ਹੁੰਦੀ ਹੈ, ਤਾਂ ਇਸਨੂੰ ਇੱਕ ਅੰਤ ਬਿੰਦੂ ਮੰਨਣ ਦੀ ਥਾਂ ਉਹ ਬਣਤਰ ਸੰਭਾਲੋ। WinINet ਡੈਸਕਟਾਪ API ਹੈ; ਸੇਵਾ ਐਪਲੀਕੇਸ਼ਨਾਂ ਨੂੰ ਆਪਣੀ ਸਮਰਥਿਤ WinHTTP ਵਿਵਸਥਾ ਚਾਹੀਦੀ ਹੈ।

ਸੰਬੰਧਿਤ ਲੇਖ