Darllen INTERNET_OPTION_PROXY WinINet gyda byffer C# o faint priodol
Adferwch INTERNET_OPTION_PROXY gyda ymholiad maint a byffer brodorol o faint cywir, gan gyd-fynd â'r meysydd DWORD a chyfeiriwr yn C#.
Mae INTERNET_PROXY_INFO yn cynnwys math mynediad DWORD a dau bwyntydd llinyn. Mae'r ymholiad brodorol hefyd angen digon o le byffer ar gyfer ei ddata dirprwy; nid yw Marshal.SizeOf strwythur rheoledig bach yn byffer canlyniad llawn o hyd newidiol.
Gall cymorthydd cydnawsedd penbwrdd ddefnyddio'r pwynt mynediad ANSI a chopïo'r llinynnau cyn rhyddhau'r byffer ymholiad hwnnw:
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 yw INTERNET_OPTION_PROXY; 122 yw ERROR_INSUFFICIENT_BUFFER. Mae'r alwad gyntaf yn cael y cyfrif beitiau sydd ei angen, ac mae'r ail yn llenwi'r dyraniad hwnnw. Os yw'r canlyniad yn tyfu rhwng galwadau, adroddir yr ail fethiant yn lle darllen byffer rhy fach.
Cadwch AccessType fel uint. Mewn proses 64-bit mae'n parhau i fod yn DWORD 32-bit, tra bod y meysydd pwyntydd yn ehangu gyda phensaernïaeth y broses. Mae cynllun dilyniannol arferol yn darparu'r aliniad cyfatebol.
Mae'r enghraifft hon yn ymwneud â byffer canlyniad opsiwn 38. Peidiwch â chymhwyso ei batrwm perchnogaeth yn ddall i INTERNET_OPTION_PER_CONNECTION_OPTION, y mae ei opsiynau llinyn a ddychwelir yn gofyn am eu glanhau ar wahân dogfennol.
Mae'r canlyniad yn disgrifio cyfluniad WinINet ar gwmpas y ddolen a ddewiswyd. Nid yw'n benderfyniad PAC ar gyfer URL mympwyol nac yn adroddiad ar lwybr effeithiol pob porwr. Pan fo'r llinyn dirprwy a ddychwelwyd yn map sy'n benodol i brotocol, cadwch y strwythur hwnnw yn hytrach na'i drin fel un pwynt terfyn. WinINet yw API'r penbwrdd; mae angen i raglenni gwasanaeth gael eu trefniant WinHTTP a gefnogir.