INTERNET_OPTION_PROXY a léamh i WinINet le maolán C# a bhfuil méid aige
Aisghabh INTERNET_OPTION_PROXY le fiosrú méide agus maolán dúchasach atá dea-mhéadaithe, ag teacht le réimsí DWORD agus pointeoir C#.
Tá cineál rochtana DWORD agus dhá phointeoir teaghráin in INTERNET_PROXY_INFO. Teastaíonn go leor spáis mhaoláin ón bhfiosrú dúchasach dá chuid sonraí seachfhreastalaí freisin; ní maolán iomlán toraidh de fhad athraitheach é Marshal.SizeOf struchtúir bhig bhainistithe.
Is féidir le cúntóir comhoiriúnachta deisce an pointe iontrála ANSI a úsáid agus na teaghráin a chóipeáil sula scaoiltear an maolán fiosrúcháin sin:
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);
}
}
}
Is é 38 INTERNET_OPTION_PROXY; is é 122 ERROR_INSUFFICIENT_BUFFER. Faigheann an chéad ghlao an líon beart atá ag teastáil, agus líonann an dara ceann an leithdháileadh sin. Má fhásann an toradh idir glaonna, tuairiscítear an dara teip in ionad maolán róbheag a léamh.
Coinnigh AccessType mar uint. I bpróiseas 64 giotán fanann sé ina DWORD 32 giotán, agus leathnaíonn na réimsí pointeora le hailtireacht an phróisis. Soláthraíonn gnáthleagan amach seicheamhach an t-ailíniú comhfhreagrach.
Baineann an sampla seo le maolán toraidh rogha 38. Ná cuir a phatrún úinéireachta go dall i bhfeidhm ar INTERNET_OPTION_PER_CONNECTION_OPTION, a bhfuil a roghanna teaghráin fillte ag teastáil a nglantachán ar leithligh doiciméadaithe.
Déanann an toradh cur síos ar chumraíocht WinINet sa raon láimhseála roghnaithe. Ní cinneadh PAC é d'URL treallach ná tuarascáil ar bhealach éifeachtach gach brabhsálaí. Nuair is léarscáil phrótacal-shonrach an teaghrán seachfhreastalaí a fhaightear, caomhnaigh an struchtúr sin in ionad é a mheas mar aon chríochphointe. Is é WinINet an API deisce; teastaíonn a socrú WinHTTP tacaíochta ó fheidhmchláir seirbhíse.