Llegeix INTERNET_OPTION_PROXY de WinINet amb un buffer C# dimensionat
Recupera INTERNET_OPTION_PROXY amb una consulta de mida i un buffer natiu ben dimensionat, coincidint amb els camps DWORD i de punter de C#.
INTERNET_PROXY_INFO conté un tipus d'accés DWORD i dos punters a cadenes. La consulta nativa també necessita prou espai de buffer per a les seves dades de proxy; Marshal.SizeOf d'una estructura gestionada petita no és un buffer de resultat complet de longitud variable.
Un auxiliar de compatibilitat d'escriptori pot usar el punt d'entrada ANSI i copiar les cadenes abans d'alliberar aquest buffer de consulta:
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 és INTERNET_OPTION_PROXY; 122 és ERROR_INSUFFICIENT_BUFFER. La primera crida obté el recompte de bytes necessari i la segona omple aquesta assignació. Si el resultat creix entre crides, es notifica el segon error en lloc de llegir un buffer massa petit.
Mantén AccessType com a uint. En un procés de 64 bits continua sent un DWORD de 32 bits, mentre que els camps de punter s'amplien amb l'arquitectura del procés. La disposició seqüencial normal proporciona l'alineació corresponent.
Aquest exemple tracta del buffer de resultat de l'opció 38. No apliquis el seu patró de propietat cegament a INTERNET_OPTION_PER_CONNECTION_OPTION, les opcions de cadena retornades del qual requereixen la seva neteja separada documentada.
El resultat descriu la configuració de WinINet a l'àmbit de handle seleccionat. No és una decisió PAC per a una URL arbitrària ni un informe de la ruta efectiva de cada navegador. Quan la cadena de proxy retornada és un mapa específic de protocol, conserva aquesta estructura en lloc de tractar-la com un sol punt final. WinINet és l'API d'escriptori; les aplicacions de servei necessiten la seva disposició WinHTTP compatible.