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 ترتیب درکار ہے۔

متعلقہ مضامین