コード例 #1
0
	  public static bool SetProxy(string strProxy, string exceptions)
	  {
	     InternetPerConnOptionList list = new InternetPerConnOptionList();
	
	     int optionCount = string.IsNullOrEmpty(strProxy) ? 1 : (string.IsNullOrEmpty(exceptions) ? 2 : 3);
	     InternetConnectionOption[] options = new InternetConnectionOption[optionCount];
	     // USE a proxy server ...
	     options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS;
	     options[0].m_Value.m_Int = (int)((optionCount < 2) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY));
	     // use THIS proxy server
	     if (optionCount > 1)
	     {
	        options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER;
	        options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy);
	        // except for these addresses ...
	        if (optionCount > 2)
	        {
	           options[2].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS;
	           options[2].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions);
	        }
	     }
	
	     // default stuff
	     list.dwSize = Marshal.SizeOf(list);
	     list.szConnection = IntPtr.Zero;
	     list.dwOptionCount = options.Length;
	     list.dwOptionError = 0;
	
	
	     int optSize = Marshal.SizeOf(typeof(InternetConnectionOption));
	     // make a pointer out of all that ...
	     IntPtr optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length);
	     // copy the array over into that spot in memory ...
	     for (int i = 0; i < options.Length; ++i)
	     {
	        IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (i * optSize));
	        Marshal.StructureToPtr(options[i], opt, false);
	     }
	
	     list.options = optionsPtr;
	
	     // and then make a pointer out of the whole list
	     IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize);
	     Marshal.StructureToPtr(list, ipcoListPtr, false);
	
	     // and finally, call the API method!
	     int returnvalue = NativeMethods.InternetSetOption(IntPtr.Zero,
	        InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION,
	        ipcoListPtr, list.dwSize) ? -1 : 0;
	     if (returnvalue == 0)
	     {  // get the error codes, they might be helpful
	        returnvalue = Marshal.GetLastWin32Error();
	     }
	     // FREE the data ASAP
	     Marshal.FreeCoTaskMem(optionsPtr);
	     Marshal.FreeCoTaskMem(ipcoListPtr);
	     if (returnvalue > 0)
	     {  // throw the error codes, they might be helpful
	        throw new Win32Exception(Marshal.GetLastWin32Error());
	     }
	
	     return (returnvalue < 0);
	  }
コード例 #2
0
        public static bool SetProxy(string strProxy, string exceptions)
        {
            InternetPerConnOptionList list = new InternetPerConnOptionList();

            int optionCount = string.IsNullOrEmpty(strProxy) ? 1 : (string.IsNullOrEmpty(exceptions) ? 2 : 3);

            InternetConnectionOption[] options = new InternetConnectionOption[optionCount];
            // USE a proxy server ...
            options[0].m_Option      = PerConnOption.INTERNET_PER_CONN_FLAGS;
            options[0].m_Value.m_Int = (int)((optionCount < 2) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY));
            // use THIS proxy server
            if (optionCount > 1)
            {
                options[1].m_Option            = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER;
                options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy);
                // except for these addresses ...
                if (optionCount > 2)
                {
                    options[2].m_Option            = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS;
                    options[2].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions);
                }
            }

            // default stuff
            list.dwSize        = Marshal.SizeOf(list);
            list.szConnection  = IntPtr.Zero;
            list.dwOptionCount = options.Length;
            list.dwOptionError = 0;


            int optSize = Marshal.SizeOf(typeof(InternetConnectionOption));
            // make a pointer out of all that ...
            IntPtr optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length);

            // copy the array over into that spot in memory ...
            for (int i = 0; i < options.Length; ++i)
            {
                IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (i * optSize));
                Marshal.StructureToPtr(options[i], opt, false);
            }

            list.options = optionsPtr;

            // and then make a pointer out of the whole list
            IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize);

            Marshal.StructureToPtr(list, ipcoListPtr, false);

            // and finally, call the API method!
            int returnvalue = NativeMethods.InternetSetOption(IntPtr.Zero,
                                                              InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION,
                                                              ipcoListPtr, list.dwSize) ? -1 : 0;

            if (returnvalue == 0)
            {   // get the error codes, they might be helpful
                returnvalue = Marshal.GetLastWin32Error();
            }
            // FREE the data ASAP
            Marshal.FreeCoTaskMem(optionsPtr);
            Marshal.FreeCoTaskMem(ipcoListPtr);
            if (returnvalue > 0)
            {   // throw the error codes, they might be helpful
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }

            return(returnvalue < 0);
        }