పరిమాణం చేసిన C# బఫర్తో WinINet INTERNET_OPTION_PROXY చదవడం
పరిమాణ ప్రశ్న మరియు సరిగ్గా పరిమాణం చేసిన స్థానిక బఫర్తో INTERNET_OPTION_PROXY పొందండి, C# లోని DWORD మరియు పాయింటర్ ఫీల్డ్లతో సరిపోలుతూ.
INTERNET_PROXY_INFO లో DWORD యాక్సెస్ రకం మరియు రెండు స్ట్రింగ్ పాయింటర్లు ఉంటాయి. స్థానిక ప్రశ్నకు దాని ప్రాక్సీ డేటా కోసం సరిపడా బఫర్ స్థలం కూడా అవసరం; చిన్న నిర్వహిత నిర్మాణం యొక్క Marshal.SizeOf పూర్తి మారే-పొడవు ఫలిత బఫర్ కాదు.
డెస్క్టాప్ అనుకూలత సహాయకం ANSI ప్రవేశ బిందువును ఉపయోగించి ఆ ప్రశ్న బఫర్ను విడుదల చేయడానికి ముందు స్ట్రింగ్లను కాపీ చేయగలదు:
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 అంటే INTERNET_OPTION_PROXY; 122 అంటే ERROR_INSUFFICIENT_BUFFER. మొదటి కాల్ అవసరమైన బైట్ సంఖ్యను పొందుతుంది, రెండవది ఆ కేటాయింపును నింపుతుంది. కాల్ల మధ్య ఫలితం పెరిగితే, చాలా చిన్న బఫర్ చదవడం బదులు రెండవ వైఫల్యం నివేదించబడుతుంది.
AccessType ను uint గా ఉంచండి. 64-బిట్ ప్రక్రియలో ఇది 32-బిట్ DWORD గానే ఉంటుంది, పాయింటర్ ఫీల్డ్లు ప్రక్రియ ఆర్కిటెక్చర్తో విస్తరిస్తాయి. సాధారణ క్రమ లేఅవుట్ సంబంధిత సమలేఖనాన్ని అందిస్తుంది.
ఈ ఉదాహరణ ఎంపిక 38 యొక్క ఫలిత బఫర్ గురించి. దాని యాజమాన్య నమూనాను INTERNET_OPTION_PER_CONNECTION_OPTION పై గుడ్డిగా వర్తింపజేయవద్దు, దాని తిరిగి ఇచ్చే స్ట్రింగ్ ఎంపికలకు వాటి పత్రీకరించిన ప్రత్యేక శుభ్రత అవసరం.
ఫలితం ఎంచుకున్న హ్యాండిల్ పరిధిలో WinINet కాన్ఫిగరేషన్ను వివరిస్తుంది. ఇది ఏదైనా URL కోసం PAC నిర్ణయం లేదా ప్రతి బ్రౌజర్ యొక్క వాస్తవ మార్గం గురించిన నివేదిక కాదు. తిరిగి ఇచ్చే ప్రాక్సీ స్ట్రింగ్ ప్రోటోకాల్-నిర్దిష్ట మ్యాప్ అయితే, దానిని ఒక చివరి బిందువుగా పరిగణించకుండా ఆ నిర్మాణాన్ని సంరక్షించండి. WinINet డెస్క్టాప్ API; సేవా అనువర్తనాలకు వాటి మద్దతు ఉన్న WinHTTP ఏర్పాటు అవసరం.