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 تەڭشىكىگە ئېھتىياجلىق.

مۇناسىۋەتلىك ماقالىلەر