INTERNET_OPTION_PROXY yn WinINet lêze mei in grutte C#-buffer
Helje INTERNET_OPTION_PROXY op mei in grutte-fraach en in goed grutte native buffer, oerienkommend mei de DWORD- en wizerfjilden yn C#.
INTERNET_PROXY_INFO befettet in DWORD tagongstype en twa tekenrigewizers. De native fraach hat ek genôch bufferromte nedich foar syn proxy-gegevens; Marshal.SizeOf fan in lytse beheardersstruktuer is gjin folsleine resultaatbuffer fan feroarjende lingte.
In desktop-kompatibiliteitshelp kin it ANSI-yngeappunt brûke en de tekenrigen kopiearje foardat dy fraachbuffer frijjûn wurdt:
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 is INTERNET_OPTION_PROXY; 122 is ERROR_INSUFFICIENT_BUFFER. De earste oprop krijt it needsaaklike bytetal, en de twadde follet dy tawizing. As it resultaat tusken oproppen groeit, wurdt de twadde mislearring rapportearre ynstee fan in te lytse buffer te lêzen.
Hâld AccessType as uint. Yn in 64-bits proses bliuwt it in 32-bits DWORD, wylst de wizerfjilden mei de prosesarsjitektuer útwreidzje. De normale sekuinsjele yndieling jout de oerienkommende rjochting.
Dit foarbyld giet oer de resultaatbuffer fan opsje 38. Pas syn eigendomspatroan net blyn ta op INTERNET_OPTION_PER_CONNECTION_OPTION, waans weromjûne tekenrige-opsjes har dokumintearre aparte opromming nedich hawwe.
It resultaat beskriuwt de WinINet-konfiguraasje by it keazen handgreepberik. It is gjin PAC-beslissing foar in willekeurige URL en ek gjin rapport fan 'e effektive rûte fan elke browser. As de weromjûne proxystring in protokolspecifike kaart is, behâld dy struktuer ynstee fan it as ien einpunt te behanneljen. WinINet is de desktop-API; tsjinstapplikaasjes hawwe har stipe WinHTTP-regeling nedich.