আকাৰৰ C# বাফাৰেৰে WinINet INTERNET_OPTION_PROXY পঢ়ক
আকাৰৰ প্ৰশ্ন আৰু সঠিক আকাৰৰ নেটিভ বাফাৰেৰে INTERNET_OPTION_PROXY আনক, C# ত DWORD আৰু পইণ্টাৰ ফীল্ডৰ সৈতে মিলাই।
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 ব্যৱস্থা প্ৰয়োজন।