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 ዝግጅት ይፈልጋሉ።

ተዛማጅ ጽሑፎች