அளவிடப்பட்ட 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 அமைப்பு தேவை.