Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать что-б прога сама обнаружила коннект? [D6, Win95/98]


0pavel0 ©   (2002-10-19 02:24:00) 

Умные дядьки подскажите пожалуйста:

Запустил свою прогу,вот она висит включенная,запускаю
internet explorer,коннектюсь,и когда законнектился моя
прога должна это определять(Без моего участия),и начинать
чёта делать!


Как ей самой понять,что я законнектился???

Заранее благодарен!!!


Bsl   (2002-10-24 07:59:00) [1]

Попробуй через функции RSA (если для подключения используется удаленный доступ).


Юрий   (2002-10-24 04:30:00) [2]

{*************************************************************}
{ This component determines online status of the computer }
{ and returns current IP address }
{*************************************************************}
{ PROPERTIES: }
{ IP: String - Current IP address of local machine }
{ Online: Boolean - Online status of local machine }
{ DispatchInterval - Determines in milliseconds the }
{ intervals of time between testing }
{ online of a mode of computer }
{ Enabled: Boolean - As usual... =) }
{ EVENTS: }
{ OnChanged - causes if online status changed. }
{*************************************************************}
{ Please see demo program for more information. }
{*************************************************************}
unit OnlineIP;

interface

uses
Windows, Messages, Winsock, Classes, Forms;

type
TOnlineIP = class(TComponent)
private
FEnabled: Boolean;
FDispatchInterval: Cardinal;
FWindowHandle: hWnd;
FOnline: Boolean;
FIP: String;
FOnChanged: TNotifyEvent;

procedure UpdateTimer;
procedure SetEnabled(Value: Boolean);
procedure SetDispatchInterval(Value: Cardinal);
procedure SetNoneBool(Value: Boolean);
procedure SetNoneStr(Value: String);
procedure WndProc(var Msg: TMessage);
protected
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Enabled: Boolean read FEnabled write SetEnabled;
property DispatchInterval: Cardinal read FDispatchInterval write SetDispatchInterval;
property Online: Boolean read FOnline write SetNoneBool;
property IP: String read FIP write SetNoneStr;
property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;
end;

procedure Register;

implementation

function LocalIP: String;
type
TaPInAddr = Array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
Buffer: Array[0..63] of Char;
I: Integer;
GInitData: TWSAData;
begin
WSAStartup($101, GInitData);
Result := "";
GetHostName(Buffer, SizeOf(Buffer));
phe := GetHostByName(buffer);
if phe = nil then Exit;
pPtr := PaPInAddr(phe^.h_addr_list);
I := 0;
while pPtr^[I] <> nil do
begin
Result := inet_ntoa(pptr^[I]^);
Inc(I);
end;
WSACleanup;
end;

constructor TOnlineIP.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEnabled := True;
FDispatchInterval := 1000;
FWindowHandle := AllocateHWnd(WndProc);
UpdateTimer;
end;

destructor TOnlineIP.Destroy;
begin
FEnabled := False;
UpdateTimer;
DeallocateHWnd(FWindowHandle);
inherited Destroy;
end;

procedure TOnlineIP.WndProc(var Msg: TMessage);
var
OldState: Boolean;
begin
with Msg do
if Msg = wm_Timer then
try
FIP := LocalIP;
OldState := FOnline;
FOnline := (FIP <> "") and (FIP <> "127.0.0.1");
if (not OldState and FOnline) or
(OldState and not FOnline) then
if Assigned(FOnChanged) then FOnChanged(Self);
except
Application.HandleException(Self);
end
else
Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;

procedure TOnlineIP.UpdateTimer;
begin
KillTimer(FWindowHandle, 1);
if (FDispatchInterval <> 0) and FEnabled then
SetTimer(FWindowHandle, 1, FDispatchInterval, nil);
end;

procedure TOnlineIP.SetEnabled(Value: Boolean);
begin
if Value <> FEnabled then
begin
FEnabled := Value;
UpdateTimer;
end;
end;

procedure TOnlineIP.SetDispatchInterval(Value: Cardinal);
begin
if Value <> FDispatchInterval then
begin
FDispatchInterval := Value;
UpdateTimer;
end;
end;

procedure TOnlineIP.SetNoneBool(Value: Boolean); begin {} end;

procedure TOnlineIP.SetNoneStr(Value: String); begin {} end;

procedure Register;
begin
RegisterComponents("Designed", [TOnlineIP]);
end;

end.


Rouse_   (2002-10-20 04:29:00) [3]

Можно, но есть идея и получше, напиши свою программу в виде прокси сервера, и коннкться через него, тогда ты 100% моментально узнаешь когда установилось соединение (в момент прихода ответа на запрос)

Желаю успехов


0pavel0   (2002-10-20 04:03:00) [4]

И ЕЩЁ

Раз это проблемма,идея:
Можно просто ждать появления иконки коннекта в systemtree,
и после производить свои действия.!

Как это реализовать?


Rouse_   (2002-10-20 04:01:00) [5]

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

(Ну раз мелкософт заблокирован, и когда только успели) пингуй своего провайдера

Желаю успехов


0pavel0   (2002-10-20 03:45:00) [6]

Спасибо,но вопрос остаётся,есть програмка:

Dial-Up NetWorking Monitor v2,0

Она стабильно при коннекте запускает окно статистики,при
обрыве прячет !(может и есть исключения, но при нормально
работающей системе всё OK)
А при помощи установленного глобального HOOKa это
словить никак?
Если пинговать или опрашивать это не дело,прога должна
постоянно висеть в памяти и минимум тормозить систему.


INCOGNITO   (2002-10-20 00:32:00) [7]

const
IC_Modem=1;
IC_LAN= 2;
IC_PROXY=3;
IC_MODEM_BUSY=4;
winetdll="wininet.dll";
...
...
function InternetGetConnectedState(lpdwFlags:LPDWORD; dwReserved: DWORD): BOOLEAN;
stdcall; external winetdll name"InternetGetConnectedState";
...
...
procedure TForm1.Timer1Timer(Sender: TObject);
var
dwConnectionTypes : DWORD;
begin
dwConnectionTypes:=IC_MODEM+IC_LAN+IC_PROXY;
if InternetGetConnectedState(@dwConnectionTypes,0) then...
end;
...
...


guest_xxx   (2002-10-19 15:08:00) [8]

Надежного способа нет.


RV   (2002-10-19 09:00:00) [9]

esu © (19.10.02 07:40)

когда это они его блокировали?


esu   (2002-10-19 07:40:00) [10]


> 0pavel0 © (19.10.02 02:24)
> начинать
> чёта делать!

Spam рассылать например...


> примеру www.Microsoft.com

Они заблокировали ping. Наверное у слишком многих людей проги постоянно их пинговали ;)
BTW и ip у них некрасивый: 207.46.134.190 могли бы уж наверное и запоминающийся прикупить.


Rouse_   (2002-10-19 02:42:00) [11]

Варианты
1. Определять состояние модема (не надежно)
2. Воспользоваться InternetGetConnectedState (не надежно)
3. Пинговать какой либо постоянный сервер (к примеру www.Microsoft.com)

Желаю успехов


Наверх

Титульная страница Поиск, карта сайта Написать письмо