לייענען INTERNET_OPTION_PROXY אין WinINet מיט אַ C# בופר פֿון אַ געמעסטן גרייס
באַקומט INTERNET_OPTION_PROXY מיט אַ גרייס אָנפֿרעג און אַ ריכטיק געמעסטן נאַטיוון בופר, צוגעפּאַסט צו די DWORD און פּוינטער פֿעלדער אין C#.
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־קאָנפֿיגוראַציע אין דעם אויסגעקליבענעם האַנדל־באַרײַך. עס איז נישט קיין PAC־באַשלוס פֿאַר אַן אַרביטראַרישן URL און נישט קיין באַריכט וועגן דעם טאַקע וועג פֿון יעדן בלעטערער. ווען דער צוריקגעגעבענער פּראָקסי־סטרינג איז אַ פּראָטאָקאָל־ספּעציפֿישע מאַפּע, האַלט יענע סטרוקטור אַנשטאָט באַטראַכטן זי ווי איין ענדפּונקט. WinINet איז די דעסקטאָפּ API; סערוויס־אַפּלאַקיישאַנען דאַרפֿן זיך זײַן געשטיצטע WinHTTP־סדרונג.