Помогите пергнать код с++ >> vb net

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Помогите пергнать код с++ >> vb net

Сообщение Fedorfx » 05.11.2007 (Пн) 3:12

Привет
есть кусок кода который заставляет работать через прокси текущее интернет соединение.
К сожалению пример приведен на с++
Помогите заставить его работать на VB net - к сожалению могу только дерать некоторые апи а там сложнее все.
вот собственно статья и код.
Спасибо - если что с меня пиво или кока-кола.
_____________________________________________________

Интернет соединение через прокси сервер. Настройка прокси соединения без измений в реестре. С++.


Прокси сервер - это программа на серверном компьютере, которая занимается обработкой запросов от клиентов внутренней сети, отправляет их во внешнюю сеть и наоборот. Зачастую прокси сервер служит для того чтобы не выдавать каждому пользователю локальной сети свой личный внешний ip адрес, что значительно снижает расходы на содержание такой сети, предоставляя пользователям оной, услуги интернет.

Очевидно, что перспектива сэкономить, не говоря уже об увеличении безопасности локальной сети с использованием прокси, ведёт к распространению такого вида организации интернет подключений. Поэтому при разработке сетевого приложения следует учесть то, что Ваша программа должна уметь работать через прокси соединение. Иначе приложение просто не сможет выполнять возложенные на него задачи.

Итак, здесь ниже будет приведён пример рабочего кода написанного на С++ с использованием Windows API.


UrlMkSetSessionOption(INTERNET_OPTION_PROXY, &IntInfo, sizeof(IntInfo), 0);


Собственно говоря, настройка прокси осуществляется вызовом функции UrlMkSetSessionOption, которая устанавливает свойства( или иначе) опции текущего интернет соединения. (Внимание: эти опции применяются только для текущего соединения и реестр виндовс при этом, остаётся неизменным!) Первый параметр функции – это название той опции, значение которой требуется изменить. В нашем случае это INTERNET_OPTION_PROXY. Второй параметр – данные для установки параметров прокси. За это отвечает структура INTERNET_PROXY_INFO:

typedef struct {
DWORD dwAccessType;
LPCTSTR lpszProxy;
LPCTSTR lpszProxyBypass;
} INTERNET_PROXY_INFO, *LPINTERNET_PROXY_INFO;

Здесь
dwAccessType
Тип доступа. Может принимать следующие значения:


Значение
Описание

INTERNET_OPEN_TYPE_DIRECT Интернет доступ через прямое соединение(без прокси)
INTERNET_OPEN_TYPE_PRECONFIG Применяется только при установке настроек прокси
INTERNET_OPEN_TYPE_PROXY Интернет доступ используя прокси



lpszProxy
Указатель на строку содержащую список прокси серверов.
lpszProxyBypass
Указатель на строку содержащую список тех кому не надо использовать прокси.

Установим настройки прокси:

IntInfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
IntInfo.lpszProxy = “10.10.0.1”; //адрес прокси сервера
IntInfo.lpszProxyBypass = "";

Последний параметр функции UrlMkSetSessionOption зарезирвирован и должен равняться 0. Настройка прокси соединения осуществляется вызовом этой функции, которая в свою очередь, производит вызов функции InternetSetOption. Это функция и устанавливает выбранные нами опции для текущего интернет соединения.

Для того чтобы использовать функцию UrlMkSetSessionOption её следует предварительно загрузить из библиотеки urlmon.dll следующим образом:

BOOL (WINAPI * _UrlMkSetSessionOption)(DWORD, LPVOID, DWORD, DWORD);
HINSTANCE hPsApi = LoadLibrary(_T("URLMON.DLL"));
If (hPsApi == NULL)
ShowMessage("URLMON.DLL not found!");
*(FARPROC *)&_UrlMkSetSessionOption = GetProcAddress(hPsApi,"UrlMkSetSessionOption");
if(_UrlMkSetSessionOption == NULL)
ShowMessage("UrlMkSetSessionOption not found!");

Итак, код, который установит Ваши настройки для прокси соединения, выглядит так:

BOOL (WINAPI * _UrlMkSetSessionOption)(DWORD, LPVOID, DWORD, DWORD);
HINSTANCE hPsApi = LoadLibrary(_T("URLMON.DLL"));
If (hPsApi == NULL)
ShowMessage("URLMON.DLL not found!");
*(FARPROC *)&_UrlMkSetSessionOption = GetProcAddress(hPsApi,"UrlMkSetSessionOption");
if(_UrlMkSetSessionOption == NULL)
ShowMessage("UrlMkSetSessionOption not found!");
INTERNET_PROXY_INFO IntInfo;
IntInfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
IntInfo.lpszProxy = “10.10.0.1”; //адрес прокси сервера
IntInfo.lpszProxyBypass = "";
_UrlMkSetSessionOption(INTERNET_OPTION_PROXY, &IntInfo, sizeof(IntInfo), 0);


Его можно вызвывать в любом месте программы. Если вдруг Вам понадобится использовать прямое интернет соединение, т.е без прокси, то опять же в любом месте программы:

BOOL (WINAPI * _UrlMkSetSessionOption)(DWORD, LPVOID, DWORD, DWORD);
HINSTANCE hPsApi = LoadLibrary(_T("URLMON.DLL"));
If (hPsApi == NULL)
ShowMessage("URLMON.DLL not found!");
*(FARPROC *)&_UrlMkSetSessionOption = GetProcAddress(hPsApi,"UrlMkSetSessionOption");
if(_UrlMkSetSessionOption == NULL)
ShowMessage("UrlMkSetSessionOption not found!");
INTERNET_PROXY_INFO IntInfo;
IntInfo.dwAccessType = INTERNET_OPEN_TYPE_DIRECT;
IntInfo.lpszProxy = “”;
IntInfo.lpszProxyBypass = "";
_UrlMkSetSessionOption(INTERNET_OPTION_PROXY, &IntInfo, sizeof(IntInfo), 0);

Надеюсь эта статья поможет Вам при написании собственных программ. Удачи.

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 05.11.2007 (Пн) 19:48

Ребята -помогите
структуру создам
константы найду

но вот никак не вьеду как и зачем подгружать URLMON
и навернякак там параметры с маршалингом передаются а в этом я хреново разбираюсь
Поможите кто чем может.

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 05.11.2007 (Пн) 21:35

Код: Выделить всё
<DllImport("urlmon.dll", CharSet:=CharSet.Ansi)> _
Private Shared Function UrlMkSetSessionOption(ByVal dwOption As Integer, pBuffer As IntPtr, _
      ByVal dwBufferLength As Integer, ByVal dwReserved As Integer) As Integer
End Function

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 06.11.2007 (Вт) 4:51

спасибо большое но у меня осталось пара вещей что я непонимаю
сделал структуру
Код: Выделить всё
    Public Structure s_p1
        Public tt As Integer
        Public adr As String
        Public pass As String
    End Structure


нашел значение константы
Public Const internet_option_proxy = 38


вызываю

Код: Выделить всё
Dim st As New s_p1
        st.tt = 38
        st.adr = "15.180.38.91:62317"
        st.pass = ""

        result = UrlMkSetSessionOption(internet_option_proxy, st, 26, 0)


длинну посчитал ручками - аналога size пока не нашел

вываливаюсь с ошибкой

A call to PInvoke function 'k2!k2.mdl_k2::UrlMkSetSessionOption' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature.

вопрос - как получить intptr на структуру?
и как вычислить размер структуры?

Премного благодарен.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 06.11.2007 (Вт) 8:01

Вот видимо ручной подсчет длины тебя и подвел, или где нить вместо Integer таки Long передается. Для подсчета длины юзай

System.Runtime.InteropServices.Marshal.SizeOf
Весь мир матрица, а мы в нем потоки байтов!

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 06.11.2007 (Вт) 9:37

невыходит каменный цветок
ошибка соталась прежняя

а с размером
Dim st As New s_p1
st.tt = 38
st.adr = "15.180.38.91:62317"
st.pass = ""

System.Runtime.InteropServices.Marshal.SizeOf(s_p1)
возвращает 12
я так бачу 4 байта инт и 2 указателя на строки
тоесть возвращает размер самой структуры а не данных в ней
но не думаю что именно это и надо - навига константы передавать?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 06.11.2007 (Вт) 10:51

Понятно, смотреть хелп по классу Marshal и мою (Путевской моя фамилие) статью на www.vbstreets.ru о работе с памятью в NET. ибо в двух словах это не объяснить
Весь мир матрица, а мы в нем потоки байтов!

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 06.11.2007 (Вт) 12:56

Статья супер - спасибо
нашел все ответы.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 102

    TopList  
cron