Читање INTERNET_OPTION_PROXY у WinINet са C# бафером одређене величине
Преузмите INTERNET_OPTION_PROXY упитом за величину и правилно димензионисаним изворним бафером, у складу са пољима DWORD и показивача у C#.
INTERNET_PROXY_INFO садржи DWORD тип приступа и два показивача на стрингове. Изворни упит такође захтева довољно бафер простора за своје proxy податке; 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 нити извештај о стварној рути сваког прегледача. Када је враћени proxy стринг мапа специфична за протокол, сачувајте ту структуру уместо да је третирате као једну крајњу тачку. WinINet је десктоп API; сервисне апликације требају свој подржани WinHTTP распоред.