Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  09:02[Войти] | [Зарегистрироваться]
Ответ на вопрос № 35676

14-09-2005 06:13
Люди спасайте!
Надо менять прокси-сервев в ИЕ налету. Отрыл код на С++ но я в нем туго соображаю ((( Может кто "переведет" его на Делфу или откомпилит мне dll?

BOOL SetConnectionOptions(LPCTSTR conn_name,LPCTSTR proxy_full_addr)
{
    //conn_name: active connection name.
    //proxy_full_addr : eg "210.78.22.87:8000"
    INTERNET_PER_CONN_OPTION_LIST list;
    BOOL    bReturn;
    DWORD  dwBufSize = sizeof(list);
    // Fill out list struct.
    list.dwSize = sizeof(list);
    // NULL == LAN, otherwise connectoid name.
    list.pszConnection = conn_name;
    // Set three options.
    list.dwOptionCount = 3;
    list.pOptions = new INTERNET_PER_CONN_OPTION[3];
    // Make sure the memory was allocated.
    if(NULL == list.pOptions)
    {
        // Return FALSE if the memory wasn't allocated.
        OutputDebugString("failed to allocat memory in SetConnectionOptions()");
        return FALSE;
    }
    // Set flags.
    list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
    list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT |
        PROXY_TYPE_PROXY;

    // Set proxy name.
    list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
    list.pOptions[1].Value.pszValue = proxy_full_addr;//"http://proxy:80";

    // Set proxy override.
    list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
    list.pOptions[2].Value.pszValue = "local";

    // Set the options on the connection.
    bReturn = InternetSetOption(NULL,
        INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);

    // Free the allocated memory.
    delete [] list.pOptions;
    InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
    InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
    return bReturn;
}
BOOL DisableConnectionProxy(LPCTSTR conn_name)
{
    //conn_name: active connection name.
    INTERNET_PER_CONN_OPTION_LIST list;
    BOOL    bReturn;
    DWORD  dwBufSize = sizeof(list);
    // Fill out list struct.
    list.dwSize = sizeof(list);
    // NULL == LAN, otherwise connectoid name.
    list.pszConnection = conn_name;
    // Set three options.
    list.dwOptionCount = 1;
    list.pOptions = new INTERNET_PER_CONN_OPTION[list.dwOptionCount];
    // Make sure the memory was allocated.
    if(NULL == list.pOptions)
    {
        // Return FALSE if the memory wasn't allocated.
        OutputDebugString("failed to allocat memory in DisableConnectionProxy()");
        return FALSE;
    }
    // Set flags.
    list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
    list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT  ;
    // Set the options on the connection.
    bReturn = InternetSetOption(NULL,
        INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
    // Free the allocated memory.
    delete [] list.pOptions;
    InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
    InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
    return bReturn;
}

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

12-07-2015 05:56
уже решено давно тут http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_20620431.html

23-09-2005 02:36 | Сообщение от автора вопроса
To Андрей Кишкин: огромное спасибо! Все работает.

20-09-2005 07:09
Привет!
LPINTERNET_PER_CONN_OPTION - это отдельная структура

Как же ты описал структуры, если не понял что это;)
Это не другая структура, это указатель на INTERNET_PER_CONN_OPTION, т.е.

typedef
  LPINTERNET_PER_CONN_OPTION = ^INTERNET_PER_CONN_OPTION;



А дальше создается динамический массив  list.pOptions = new INTERNET_PER_CONN_OPTION[3];

Как это написать в Дельфи?



Дык я ж писал, что тут лучше использовать статику, так как количество элементов массива известно заранее, вобщем смотри код ниже.

Необходимые структуры и константы:


type
  ValueType = (DWR, PCH, FTM);
  INTERNET_PER_CONN_OPTION = record
      dwOption : DWORD;
      case ValueType of
          DWR    : (dwValue : DWORD);
          PCH    : (pszValue : PChar);
          FTM    : (ftValue : FILETIME);
  end;

  LPINTERNET_PER_CONN_OPTION = ^INTERNET_PER_CONN_OPTION;

  INTERNET_PER_CONN_OPTION_LIST = record
      dwSize : DWORD;
      pszConnection : PChar;
      dwOptionCount : DWORD;
      dwOptionError : DWORD;
      pOptions : LPINTERNET_PER_CONN_OPTION;
  end;

  LPINTERNET_PER_CONN_OPTION_LIST = ^INTERNET_PER_CONN_OPTION_LIST; 

const
  INTERNET_PER_CONN_FLAGS = 1;
  INTERNET_PER_CONN_PROXY_SERVER = 2;
  INTERNET_PER_CONN_PROXY_BYPASS = 3;

  PROXY_TYPE_DIRECT = 1;
  PROXY_TYPE_PROXY = 2;

  INTERNET_OPTION_PER_CONNECTION_OPTION = 75;
  INTERNET_OPTION_SETTINGS_CHANGED = 39;
  INTERNET_OPTION_REFRESH = 36;



Ну и одну из процедур я написал:


function SetConnectionOptions(conn_name,
  proxy_full_addr: string): boolean;

var
    list : INTERNET_PER_CONN_OPTION_LIST;
    Options : array [0..2] of INTERNET_PER_CONN_OPTION;
    dwBufSize : DWORD;
begin
    dwBufSize := SizeOf(list);
    list.dwSize := SizeOf(list);
    list.pszConnection := PChar(conn_name);
    list.dwOptionCount := 3;
    list.pOptions := @Options;

    //set flags
    Options[0].dwOption := INTERNET_PER_CONN_FLAGS;
    Options[0].dwValue := PROXY_TYPE_DIRECT or PROXY_TYPE_PROXY;

    //set proxy name
    Options[1].dwOption := INTERNET_PER_CONN_PROXY_SERVER;
    Options[1].pszValue := PChar('http://proxy:80');

    Options[2].dwOption := INTERNET_PER_CONN_PROXY_BYPASS;
    Options[2].pszValue := PChar('local');

    Result := InternetSetOption(nil, INTERNET_OPTION_PER_CONNECTION_OPTION,
                          @list, dwBufSize);

    InternetSetOption(nil, INTERNET_OPTION_SETTINGS_CHANGED, nil, 0);
    InternetSetOption(nil, INTERNET_OPTION_REFRESH, nil, 0);   
end;



Вторую, думаю, допишешь по аналогии:)

Проверить корректность работы процедуры у себя не могу, т.к. прокси не пользую, но функция возвращает true, значит работает:)

Удачи.

19-09-2005 09:34 | Сообщение от автора вопроса
Ну хорошо эти две структуры я описал, но как понять вот это:
typedef struct {
DWORD dwSize;
LPTSTR pszConnection;
DWORD dwOptionCount;
DWORD dwOptionError; 
LPINTERNET_PER_CONN_OPTION pOptions;}

LPINTERNET_PER_CONN_OPTION - это отдельная структура

А дальше создается динамический массив  list.pOptions = new INTERNET_PER_CONN_OPTION[3];

Как это написать в Дельфи?

19-09-2005 07:15
че это за тип такой? Или я забыл что-то подключить?

ну не описана в Delphi такая структура:), так что придется ее ручками описать, на сишнике это выглядит так:

typedef struct {  DWORD dwSize;  LPTSTR pszConnection;  DWORD dwOptionCount;  DWORD dwOptionError;  LPINTERNET_PER_CONN_OPTION pOptions;
}
INTERNET_PER_CONN_OPTION_LIST, *LPINTERNET_PER_CONN_OPTION_LIST;

Members
dwSize
Size of the structure, in bytes.
pszConnection
Pointer to a string that contains the name of the RAS connection or NULL, which indicates the default or LAN connection, to set or query options on.
dwOptionCount
Number of options to query or set.
dwOptionError
Options that failed, if an error occurs.
pOptions
Pointer to an array of INTERNET_PER_CONN_OPTION structures containing the options to query or set.



Обычный однонаправленный список:) с переводом проблем быть не должно:)
Это я скопировал из msdn, все остальное нужное можно взять там же:)

Удачи.

15-09-2005 04:09
Ссылку на MSDN надо поправить так:
http://support.microsoft.com/kb/q226473

15-09-2005 04:07 | Сообщение от автора вопроса
Хм... ссылка на msdn работает только если ее копировать-вставить... странно.. А проблемы уже в самом начале  -

INTERNET_PER_CONN_OPTION_LIST 

че это за тип такой? Или я забыл что-то подключить?

15-09-2005 02:00
Привет!

В том то и дело что можно на лету (есть много программ меняющих прокси прямо в процессе работы)... и этот код именно так делает. Ваш код меняет прокси только для подключения по локалке? А если у меня диал-ап соединение. Ниже ссылки на msdn и сайт с кодом:
http://support.microsoft.com/kb/q226473/ ; http://lib.training.ru/Lib/ArticleDetail.aspx?ar=1717&l=&mi=100&mic=309


Нет пределу совершенству! Спасибо за ссылки было очень интересно почитать, правда на msdn ссылка битая:(

Автору: Справшивай конкретно, какие у тебя проблемы, с переводом каких конкретно строк - поможем:)
Кстати представленнй код можно серьезно упростить и уменьшить, если динамические массивы INTERNET_PER_CONN_OPTION заменить статическими.
Смысла использовать динамику в данном случае не вижу, ведь количество элементов известно заранее.

Удачи.

14-09-2005 16:16 | Сообщение от автора вопроса
В том то и дело что можно на лету (есть много программ меняющих прокси прямо в процессе работы)... и этот код именно так делает. Ваш код меняет прокси только для подключения по локалке? А если у меня диал-ап соединение. Ниже ссылки на msdn и сайт с кодом:
http://support.microsoft.com/kb/q226473/  http://lib.training.ru/Lib/ArticleDetail.aspx?ar=1717&l=&mi=100&mic=309

14-09-2005 09:10
Привет!

Что-то не то ты нашел:)

Тут всего делов-то - заменить значение в реестре :)

Написать можно на чем угодно, но в данном случае идеальное решение - скрипт, т.е. можно и на Делфи, но зачем из пушки по воробьям...

Ниже приведен скрипт на wsh, который при запуске переключается между двумя прокси и выводит сообщение об активном прокси, код нужно сохранить в файл с расширением js, запускать - двойным кликом :)

XXX и YYY нужно заменить реальным адресами прокси (формат смотри в реестре)

var WshShell = WScript.CreateObject("WScript.Shell");

var ProxyName = WshShell.RegRead("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ProxyServer");

if (ProxyName == 'XXX') {
  WshShell.RegWrite("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ProxyServer", "YYY", "REG_SZ");
  WScript.Echo("Активен YYY");
}



else {
  WshShell.RegWrite("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ProxyServer", "XXX", "REG_SZ");
  WScript.Echo("Активен XXX");
}


А "на горячку" переключаться все-равно не получится, т.к. IE кэширует инфу из реестра при запуске, придется ослика перезапускать :(, ну, или запускать еще одного :)

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Однажды, в студеную зимнюю пору я из лесу вышел, был сильный ЧТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования