AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Message wenn sich die IP einer NIC ändert?
Thema durchsuchen
Ansicht
Themen-Optionen

Message wenn sich die IP einer NIC ändert?

Ein Thema von Sharky · begonnen am 28. Apr 2006 · letzter Beitrag vom 28. Apr 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#1

Message wenn sich die IP einer NIC ändert?

  Alt 28. Apr 2006, 12:21
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.
Stephan B.
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#2

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

  Alt 28. Apr 2006, 12:37
da dürfte dies genau das richtige sein: http://msdn.microsoft.com/library/en...addrchange.asp
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#3

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

  Alt 28. Apr 2006, 12:41
Hai Ocimum basilicum *g*

Danke schon mal. Jetzt muss ich nur noch rausfinden wie ich das nutze Sharky und API-Funktionen: Zwei Welten treffen auf einander.
Stephan B.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

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

  Alt 28. Apr 2006, 13:21
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#5

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

  Alt 28. Apr 2006, 13:34
Zitat von Sharky:
Hai Ocimum basilicum *g*
würzige Sache: http://www.uni-graz.at/~katzer/germ/Ocim_bas.html

Zitat von Sharky:
Danke schon mal. Jetzt muss ich nur noch rausfinden wie ich das nutze 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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

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

  Alt 28. Apr 2006, 13:52
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#7

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

  Alt 28. Apr 2006, 13:53
Hai Basilikum,

ersteinmal : Herzlich Dank

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?
Stephan B.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

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

  Alt 28. Apr 2006, 13:58
@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]
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#9

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

  Alt 28. Apr 2006, 13:59
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"...
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#10

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

  Alt 28. Apr 2006, 14:17
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;
Stephan B.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 Uhr.
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