![]() |
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. |
Re: Message wenn sich die IP einer NIC ändert?
da dürfte dies genau das richtige sein:
![]() |
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. |
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.
|
Re: Message wenn sich die IP einer NIC ändert?
Zitat:
![]() Zitat:
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. |
Re: Message wenn sich die IP einer NIC ändert?
ich hab auch schnell mal nen Veranschauligungsbeispiel gebastelt:
Delphi-Quellcode:
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.
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; Desweiteren hab ich die Funktion dynamich eingebunden da Sie wohl bei der XP-Home-Version nicht verfügbar ist. |
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? |
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] |
Re: Message wenn sich die IP einer NIC ändert?
Zitat:
vermutlich musst Du jedesmal nach einer Änderung wieder NotifyAddrChange aufrufen - Dir die nächste Änderung "abonnieren"... |
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 02:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz