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-ის კონფიგურაციას არჩეული დესკრიპტორის არეში. ეს არ არის PAC გადაწყვეტილება თვითნებური URL-ისთვის და არც ყოველი ბრაუზერის ფაქტობრივი მარშრუტის ანგარიში. როდესაც დაბრუნებული პროქსი სტრიქონი პროტოკოლის სპეციფიკური რუკაა, შეინარჩუნეთ ეს სტრუქტურა და ნუ განიხილავთ მას როგორც ერთ საბოლოო წერტილს. WinINet არის სამუშაო მაგიდის API; სერვისული აპლიკაციები საჭიროებენ თავიანთ მხარდაჭერილ WinHTTP მოწყობას.

დაკავშირებული სტატიები