Помощь - Поиск - Пользователи - Календарь
Полная версия: Отключение-подключение интернета.
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Krjuger
Здраствуйте,нужно написать программу на С++,которая будет принудительно отключать и через N-ный промежуток времени включать интернет.Дело в том,что ни на форуме да и в гугле я найти никакой инфы не смог.Поэтому если кто то обладает информацией киньте ссылку,чтобы было откуда начать шагать,а заодно в последствии помоч в разработке самой программы.Винда Хр ,внешний модем стримовский.
volvo
Начать копать можно отсюда:
INetConnection Interface. Для WinXP подойдет, в новых версиях Windows - не уверен, читай ремарки в MDSN внимательно.

Отключение соответствующего сетевого соединения (network connection) приведет к невозможности его использования. Где-то на expert-exchange выкладывался пример использования этого интерфейса для отключения/подключения Интернета. Искать сейчас некогда, попробуй поискать сам. Если у тебя нет аккаунта в ЕЕ - в ГуглоКэше должно было сохраниться...
Krjuger
Цитата
INetConnection Interface

Это я более менее понял,но это уже идет обработка события,а для начала,надо как то это событие создать..Насчет Экспертов,да там поднята парочка подобных тем,но прочитать коментарии из всех я смог только в 1 и то не очень понял.
Цитата

In general declarations:

Private Declare Function InternetAutodial Lib "wininet.dll" (ByVal dwFlags As Long, ByVal dwReserved As Long) As Long
Private Const INTERNET_AUTODIAL_FORCE_ONLINE = 1
Private Const INTERNET_AUTODIAL_FORCE_UNATTENDED = 2
Private Declare Function InternetAutodialHangup Lib "wininet.dll" (ByVal dwReserved As Long) As Long


Private Sub Command1_Click()

'Shell "rundll32.exe rnaui.dll,RnaDial" & "your dial-up connection", 1
'To prompt the user to connect to the Internet use:
'
If InternetAutodial(INTERNET_AUTODIAL_FORCE_ONLINE, 0) Then
' MsgBox "Connected"
End If

'To display the "Dial-up Connection" window and automatically start dialing use:

If InternetAutodial(INTERNET_AUTODIAL_FORCE_UNATTENDED, 0) Then
'MsgBox "Connected"
End If



'To disconnect an automatically dial Internet connection use:
'
If InternetAutodialHangup(0) Then
' MsgBox "Disconnected"
End If

Но что то это через чур мудрено и явно не для СИ++.По крайней мере я не совсем представляюю как dll библиотеку подключить эту.
volvo
Да не надо ничего подключать:

здесь, из кеша пост abdij от 09/15/03 - именно С/С++
Krjuger
Цитата
All comments and solutions are aviable to premium service members only.

Так что не могу я посмотреть его ответ даже через кеш.Все атки там люди не глубые администрируют сайт))))

Так что если тебя не затруднит не мог бы ты суда скопироват что там написано,как я понмаю у тебя доступ то есть.
volvo
Цитата
Так что не могу я посмотреть его ответ даже через кеш.
А ты до конца страничку-то вниз прокрути... Сначала - сообщения "All comments and solutions are aviable to premium service members only.", потом - рекламный блок. А потом - чудо, правда? - открытым текстом сами сообщения... С Гуглом не проходят такие штуки, он все видит smile.gif
Krjuger
Воистину я лол....

Нечто подобное на намного более примитивное я пытался написать...

#include <netcon.h>
#include <stdio.h>

void DisableNIC(char* InterfaceName)
{
INetConnectionManager* pNet;
INetConnection* pConn;
IEnumNetConnection* pEnum;
NETCON_PROPERTIES* pProps;
wchar_t Temp[255];
ULONG uCount = 0;

swprintf(Temp, L"%S", InterfaceName);
CoInitialize(NULL);
CoCreateInstance(CLSID_ConnectionManager, NULL, CLSCTX_SERVER, IID_INetConnectionManager, (void**)&pNet);
pNet->EnumConnections(NCME_DEFAULT, &pEnum);

while (pEnum->Next(1, &pConn, &uCount) == S_OK)
{
pConn->GetProperties( &pProps );
if (!wcscmp(pProps->pszwName, Temp))
{
printf("Found %S\n", pProps->pszwName);
printf("Going to disable connection now!\n");
pConn->Disconnect();
printf("Disabled!");
CoTaskMemFree(pProps->pszwName);
CoTaskMemFree(pProps->pszwDeviceName);
CoTaskMemFree(pProps);
pConn->Release();
}
}
pEnum->Release();
pNet->Release();
CoUninitialize();
}

void main()
{
DisableNIC("Local Area Connection");
}



Скомпилироваться то оно скомпилировалось, а вот отработать не захотело.Лан щас попробую на базе того что ты давал.
Krjuger
Тааак,я попробовал скомпилировать и посомтреть тот код, про кторый ты говорил,что то он у меня не работает а точнее он не проходит проверку.

void main(int argc, char** argv)
......
.......
if (argc <= 2)


А вместо имени там выводится какая то белиберда на китайском.короче эту проверку не проходит и выкидывает сразу на ошибку.

И еще такой вопрос,надо ли отключать анитирусы и файрволы, а то они не любят когда такие дела проворачиваются.или же все таки пропускают такие манипулции?
volvo
А можно посмотреть, с какими параметрами запускается программа? Ей вообще-то должно передаваться как минимум 2 параметра: первый - название интерфейса (для примера - "Local Area Connection"), который надо отключить/включить, второй - "0" для отключения, "1" для включения.
Krjuger
А по моему наоборот так как первый параметр интовый тобиш число,а второй массив символов.лан щас попробую ручками передать.
volvo
А еще лучше - так:


myProg.exe "Local Area Connection" 4 0

(это для отключения, для включения - надо последним параметром передать "1")

Там же все написано, кодом, какие параметры откуда читаются, и как потом обрабатываются... Я, кстати, запускать и ставить эксперименты на рабочей машине не буду, это так, для информации.

Добавлено через 2 мин.
Цитата
А по моему наоборот так как первый параметр интовый тобиш число,а второй массив символов
Зарекался уже тебе отвечать - нет, опять ответил. Знаешь что, иди ка ты... Учи язык, а? Где у тебя первый параметр интовый? Где второй - массив символов?
Цитата
      swprintf(ifname,L"%S",argv[1]); //Copy the interface name "Local Area Connection"
nCmd = atoi(argv[2]); //Copy the Command
if ( argc == 4 )
{
nPortStatus = ( argv[3][0] == '1' ) ? 1:0 ; //Copy the Status to be Set
}


В общем, с тобой ясно, до свидания.
Krjuger
Не ты меня наверно немного не понял.У меня в программе до этого даже не доходило.....Насчет того что ты запускать на своем компе не будет это я прекрасно понимаю.Насчет параметров я имел в виду

void main(int argc, char** argv)


У меня проверку argc не проходило,так что это наверно недопонимание между нами возникло.Так что не надо уж так радикально то..В этой сфере я действительно знаю оочень мало.Поэтому и прошу помощи.

Да до этого мы пару раз довольно бурно дискутировали,но зачем же каждый раз так "в штыки" меня воспринимать то.
Krjuger
Да я конешно дико извиняюсь за свою тупку,щас я уже разобрался почти во всем,откуда что берется,но тут возникла небольшая проблема.Варианты проверки статусов порта и линка работают коректно,а вот при попытке включения и отключения возникает такая ошибка 'pConnectionUI' используется без инициализации.Причем эта ошибка возникает как при включении так и при отключении.
Ошибка происходит в строке.

if(SUCCEEDED(pConnection->QueryInterface(IID_INetConnectionConnectUi, (void**)pConnectionUI)))

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.