Leximi i INTERNET_OPTION_PROXY në WinINet me një buffer C# të dimensionuar
Merrni INTERNET_OPTION_PROXY me një pyetje madhësie dhe një buffer vendas të dimensionuar saktë, në përputhje me fushat DWORD dhe treguesin në C#.
INTERNET_PROXY_INFO përmban një lloj aksesi DWORD dhe dy tregues vargjesh. Pyetja vendase kërkon gjithashtu hapësirë të mjaftueshme bufferi për të dhënat e saj proxy; Marshal.SizeOf i një strukture të vogël të menaxhuar nuk është një buffer i plotë rezultati me gjatësi të ndryshueshme.
Një ndihmës i përputhshmërisë së desktopit mund të përdorë pikën e hyrjes ANSI dhe të kopjojë vargjet përpara se të lirojë atë buffer pyetjeje:
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 është INTERNET_OPTION_PROXY; 122 është ERROR_INSUFFICIENT_BUFFER. Thirrja e parë merr numrin e nevojshëm të bajteve dhe e dyta mbush atë ndarje. Nëse rezultati rritet midis thirrjeve, raportohet dështimi i dytë në vend që të lexohet një buffer shumë i vogël.
Mbajeni AccessType si uint. Në një proces 64-bit mbetet një DWORD 32-bit, ndërsa fushat e treguesve zgjerohen me arkitekturën e procesit. Paraqitja normale sekuenciale siguron rreshtimin përkatës.
Ky shembull ka të bëjë me bufferin e rezultatit të opsionit 38. Mos e zbatoni modelin e tij të pronësisë verbërisht në INTERNET_OPTION_PER_CONNECTION_OPTION, opsionet e vargjeve të kthyer të të cilit kërkojnë pastrimin e tyre të veçantë të dokumentuar.
Rezultati përshkruan konfigurimin e WinINet në shtrirjen e dorezës së zgjedhur. Nuk është një vendim PAC për një URL arbitrare dhe as një raport i rrugës aktuale të çdo shfletuesi. Kur vargu proxy i kthyer është një hartë specifike për protokollin, ruajeni atë strukturë në vend që ta trajtoni si një pikë të vetme fundore. WinINet është API-ja e desktopit; aplikacionet e shërbimit kanë nevojë për rregullimin e tyre të mbështetur WinHTTP.