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 ವ್ಯವಸ್ಥೆ ಬೇಕು.

ಸಂಬಂಧಿತ ಲೇಖನಗಳು