WinINet INTERNET_OPTION_PROXY өлчөмдөлгөн C# буфери менен окуу
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 жөндөөсүн талап кылат.