માપેલા 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 ગોઠવણીની જરૂર છે.