Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Message wenn sich die IP einer NIC ändert? (https://www.delphipraxis.net/68347-message-wenn-sich-die-ip-einer-nic-aendert.html)

Sharky 28. Apr 2006 11:21


Message wenn sich die IP einer NIC ändert?
 
Hai,

gibt es eine Möglichkeit zu erfahren das sich die IP-Adresse einer Netzwerkkarte geändert hat?
Hintergrund ist der:
Ich möchte auf dem Notebook gerne ein Programm haben welches aufgrund der IP der WLAN-Karte oder der LAN-Karte bestimmte Netzwerklaufwerke verbindet. Die IP bekomme ich aber erst nachdem das Programm gestartet wurde. Im Notfall müsste ich es mit einem Timer machen. Aber über eine Message vom OS wäre es natürlich eleganter.

Basilikum 28. Apr 2006 11:37

Re: Message wenn sich die IP einer NIC ändert?
 
da dürfte dies genau das richtige sein: http://msdn.microsoft.com/library/en...addrchange.asp

Sharky 28. Apr 2006 11:41

Re: Message wenn sich die IP einer NIC ändert?
 
Hai Ocimum basilicum *g*

Danke schon mal. Jetzt muss ich nur noch rausfinden wie ich das nutze :oops: Sharky und API-Funktionen: Zwei Welten treffen auf einander.

SirThornberry 28. Apr 2006 12:21

Re: Message wenn sich die IP einer NIC ändert?
 
So wie es aussieht registriert man mit der Funktion ein Handle über welches dann ein Callback erfolgt wenn es änderungen gibt. Ähnlich also wie bei einem Timer oder dem TrayIcon. Auch dort übergibt man einer Funktion ein Handle über welches dann die Callback-Messages erfolgen.

Basilikum 28. Apr 2006 12:34

Re: Message wenn sich die IP einer NIC ändert?
 
Zitat:

Zitat von Sharky
Hai Ocimum basilicum *g*

würzige Sache: http://www.uni-graz.at/~katzer/germ/Ocim_bas.html :-)

Zitat:

Zitat von Sharky
Danke schon mal. Jetzt muss ich nur noch rausfinden wie ich das nutze :oops: Sharky und API-Funktionen: Zwei Welten treffen auf einander.

quick'n'dirty und ungetestet:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
  public
    _AddrChangeEventHandle : THandle;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Function NotifyAddrChange(Out Handle : THANDLE;Const Overlapped : OVERLAPPED) : DWORD; StdCall; External 'Iphlpapi.dll';

procedure TForm1.FormCreate(Sender: TObject);
Var
  H : THandle;
  O : OVERLAPPED;
  R : DWORD;
begin
  _AddrChangeEventHandle:=CreateEvent(Nil,False,False,Nil);

  O.hEvent:=_AddrChangeEventHandle;

  R:=NotifyAddrChange(H,O);
  If not ((R = NO_ERROR) or (R = ERROR_IO_PENDING)) Then RaiseLastOSError();
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  CloseHandle(_AddrChangeEventHandle);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  If (WaitForSingleObject(_AddrChangeEventHandle,0) = WAIT_OBJECT_0) Then Windows.Beep(1000,100);
end;

end.

SirThornberry 28. Apr 2006 12:52

Re: Message wenn sich die IP einer NIC ändert?
 
ich hab auch schnell mal nen Veranschauligungsbeispiel gebastelt:
Delphi-Quellcode:
var LDLLHandle: Cardinal;
    NotifyAddrChange: function(AHandle: PCardinal; AOverlapped: POverlapped): DWORD; stdcall;
    LRes: DWORD;
begin
  LDLLHandle := LoadLibrary('iphlpapi.dll');
  if (LDLLHandle > 0) then
  begin
    NotifyAddrChange := GetProcAddress(LDLLHandle, 'NotifyAddrChange');
    if Assigned(NotifyAddrChange) then
    begin
      LRes := NotifyAddrChange(nil, nil);
      if LRes = NOERROR then
        showmessage('ipchanged')
      else
        ShowMessage('error');
    end;
    FreeLibrary(LDLLHandle);
  end;
Das ganze müsste noch im Thread ausgeführt werden weil durch den Aufruf mit den "nil"-Parametern die Funktion erst zurück kehrt wenn es eine Änderung gibt.
Desweiteren hab ich die Funktion dynamich eingebunden da Sie wohl bei der XP-Home-Version nicht verfügbar ist.

Sharky 28. Apr 2006 12:53

Re: Message wenn sich die IP einer NIC ändert?
 
Hai Basilikum,

ersteinmal : Herzlich Dank :-D

Im Prinzip geht der Code ..... aber (es muss ja immer eines geben)... Es wird nur einmal pro Programmstart eine änderung der IP registriert. Ich starte also das Programm, ändere die IP -> Meldung kommt. Wenn ich sie jetzt noch einmal ändere passiert leider nichts.

Hast Du eine Idee woran das liegen kann?

SirThornberry 28. Apr 2006 12:58

Re: Message wenn sich die IP einer NIC ändert?
 
@sharky: Das liegt daran das du danach eigentlich wieder die Procedure aufrufen musst um zu siganlisieren das du weiterhin benachrichtigt werden willst. Wenn man das ganze mit einem Timer löst und WaitFor... könnte man auch das ganze im Timer mit den "nil"-Parametern aufrufen, da spaart man das erstellen der Events.

Dazu müsstet du dann die Funktion allerdings so implementieren (ohne var und out) das man auch nil übergeben kann (oder mit wildem gecaste nil dereferenzieren und übergeben)

[Edit]Das mit dem nil und dem Timer ist doch irrsinn weil dann die Nachrichtenschleife hängt, muss also dann schon in nen Thread[/Edit]

Basilikum 28. Apr 2006 12:59

Re: Message wenn sich die IP einer NIC ändert?
 
Zitat:

Zitat von Sharky
Im Prinzip geht der Code ..... aber (es muss ja immer eines geben)... Es wird nur einmal pro Programmstart eine änderung der IP registriert. Ich starte also das Programm, ändere die IP -> Meldung kommt. Wenn ich sie jetzt noch einmal ändere passiert leider nichts.

Hast Du eine Idee woran das liegen kann?

immer diese "abers"... :-)

vermutlich musst Du jedesmal nach einer Änderung wieder NotifyAddrChange aufrufen - Dir die nächste Änderung "abonnieren"...

Sharky 28. Apr 2006 13:17

Re: Message wenn sich die IP einer NIC ändert?
 
Hai ihr zwei,

ich habe das ganze jetzt mal so gemacht und es scheint zu gehen.
Allerdings werde ich mir auch noch mal ansehen wie das ganze in einem Thread aussehen würde.

Delphi-Quellcode:
  private
    _AddrChangeEventHandle: THandle;
    procedure CreateNotifyEvent;
  public
    { Public-Deklarationen }

  end;

var
  DemoForm: TDemoForm;

implementation

{$R *.dfm}

function NotifyAddrChange(out Handle: THANDLE;
  const Overlapped: OVERLAPPED): DWORD; stdcall; external 'Iphlpapi.dll';

procedure TDemoForm.FormCreate(Sender: TObject);
begin
  _AddrChangeEventHandle := CreateEvent(NIL, FALSE, FALSE, NIL);
  CreateNotifyEvent;
end;

procedure TDemoForm.CreateNotifyEvent;
var
  NotifyHandle: Cardinal;
  Overlapped: _OVERLAPPED;
  NotifyResult: Cardinal;
begin
  Overlapped.hEvent := _AddrChangeEventHandle;
  NotifyResult := NotifyAddrChange(NotifyHandle, Overlapped);
  if not ((NotifyResult = NO_ERROR) or (NotifyResult = ERROR_IO_PENDING)) then
  begin
    RaiseLastOSError;
  end;
end;

procedure TDemoForm.FormDestroy(Sender: TObject);
begin
  CloseHandle(_AddrChangeEventHandle);
end;

procedure TDemoForm.Timer1Timer(Sender: TObject);
begin
  if (WaitForSingleObject(_AddrChangeEventHandle, 0) = WAIT_OBJECT_0) then
  begin
    ShowMessage('IP wurde geändert.');
    CreateNotifyEvent;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz