Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Anzeigen der IPAdresse UND Name der Verbindung (https://www.delphipraxis.net/115737-anzeigen-der-ipadresse-und-name-der-verbindung.html)

soulies 18. Jun 2008 10:54

Re: Anzeigen der IPAdresse UND Name der Verbindung
 
hoi,

'IpAddress' selbst ist ne Liste mit den entsprechenden Elementen.

Du müsstest also die Liste durchlaufen und dann jedes Element deiner Rückgabe-Liste hinzufügen.
(Ich glaub so ists richtig)


cya

SaltJohn 18. Jun 2008 12:22

Re: Anzeigen der IPAdresse UND Name der Verbindung
 
Verstehe dich leider nicht ganz. Wie mache ich das mit der Liste durchlaufen? Verstehe auch nicht warum das eine Liste sein soll da es ja nur eine IP gibt und diese in der WMI Demo auch nur in einer Zeile aufgeführt ist eben genauso wie bei den Adapternamen usw.

soulies 18. Jun 2008 12:26

Re: Anzeigen der IPAdresse UND Name der Verbindung
 
ein Adapter kann mehrere IpAdressen haben - alle IpAdressen werden in einer Liste gehalten, nicht in einem einzigen string

möglichkeit:
Delphi-Quellcode:
  if (WMI_VALUE='Name') then
    begin
      if not VarIsNull(l_WMIProperty.Get_Value) then
         result.Add(l_WMIProperty.Get_Value) else result.Add('<unbekannt>');
    end
  else // die IpAdressen
    begin
      if not VarIsNull(l_WMIProperty.Get_Value) then
        begin
          for i:=0 to VarArrayDimCount(l_WMIProperty.Get_Value) do // VarArrayDimCount müsste die Länge der Liste sein
             result.Add(l_WMIProperty.Get_Value[i]);
        end;
    end;
cya

SaltJohn 18. Jun 2008 14:37

Re: Anzeigen der IPAdresse UND Name der Verbindung
 
Hallo Soulis, erstmal danke für deine Geduld doch ich muss dir erneut sagen, dass ich dir leider nicht ganz folgen kann. Die "IPaddress" einer Instanz wird also nicht in einem String sondern in einem Array of Strings ausgegeben soviel habe ich glaube ich verstanden.
Ich habe mir jetzt eine andere laufende Funktion zusammengebastelt in der ich die Instanzen mit einem zuvor definierten Adapternamen "FAdapter" vergleiche. Sobald dieser gefunden wurde soll die IP-Adresse ausgelesen werden. Zum testen habe ich anstatt "IPAdress" einfach "SettingID" (ein anderes Atribut) genommen da hier ein String pro Instanz übergeben wird. Das ganze funktioniert soweit. Es gilt also "nur" nur noch das mit "Address" statt wie im Code zu sehen "SettingID" hinzubekommen. Da bräuchte eben noch Hilfe

Delphi-Quellcode:
function GetIPAddress : string;

var
 wmi : variant;
 wmiService : variant;
 nicstatus : variant;
 card : Olevariant;
 cnt : integer;
 Enum: IEnumVariant;
 P : IUnknown;
 F : Cardinal;
 cardCap : String;
 strSettingID : String;
 

begin

  WMI:=CreateOleObject('WbemScripting.SWbemLocator');
  wmiService := wmi.ConnectServer('.', 'root\CIMV2');
  nicstatus := wmiService.InstancesOf('Win32_NetworkAdapterConfiguration');
  p := nicstatus._NewEnum;
  p.QueryInterface(IEnumVariant, Enum);
  for cnt := 0 to nicstatus.Count - 1 do
   begin
     Enum.Next(1, card, F);
     cardCap := Copy(card.Caption, 12, MaxInt);
     if cardCap = FAdapter then //Wenn Adapter in der jeweiligen Instanz gleich von mir definierter Adapter
        begin
          strSettingID := card.SettingID; // statt card.SettingID müsste IPAddress stehen
          result := (cardCap + ' : ' + strSettingID); //hier der String mit der richtigen IP aus dem Array von IPAddress
          break;
        end
   end;
   
end;

soulies 18. Jun 2008 15:25

Re: Anzeigen der IPAdresse UND Name der Verbindung
 
hoi,

Delphi-Quellcode:
function getWMIValue(WMI_CLASS:string;WMI_VALUE:string;Adapter:string): string;
var
   l_WMILocator: ISWbemLocator;
   l_WMIServices: ISWbemServices;
   l_WMIObjectDefinition: ISWbemObject;
   l_WMIObjectSet: SWbemObjectSet;
   l_WMIObjectInstances: IEnumVariant;
   l_WMIObject: ISWbemObject;
   l_WMIPropertySet: ISWbemPropertySet;
   l_WMIProperty: ISWbemProperty;
   l_TempObj: OleVariant;  
   l_ObjValue: Cardinal;
   i : integer ;    
begin
   Result := '' ;
   l_WMILocator := CoSWbemLocator.Create;
   l_WMIServices := L_WMILocator.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0, nil);
   l_WMIObjectDefinition := l_WMIServices.Get(WMI_CLASS, wbemFlagUseAmendedQualifiers, nil);  
   l_WMIObjectSet:= l_WMIServices.execquery('Select * from '+wmiClass+' where caption like '+#39+#37+Adapter+#39,'WQL',0,nil);
   l_WMIObjectInstances := (l_WMIObjectSet._NewEnum) as IEnumVariant;
       
   while (l_WMIObjectInstances.Next(1, l_TempObj, l_ObjValue) = S_OK) do
   begin
      l_WMIObject:= IUnknown(l_TempObj) as SWBemObject;
      l_WMIPropertySet := l_WMIObject.Properties_;
      l_WMIProperty := l_WMIPropertySet.Item(WMI_VALUE, 0);

      if not VarIsNull(l_WMIProperty.Get_Value) then
        begin
          for i:=0 to VarArrayDimCount(l_WMIProperty.Get_Value) do
             result := result + l_WMIProperty.Get_Value[i] + ' ; ' ;
        end;
   end;
end;
und denn deine funktion

Delphi-Quellcode:
function GetIPAddress : string;

var
wmi : variant;
wmiService : variant;
nicstatus : variant;
card : Olevariant;
cnt : integer;
Enum: IEnumVariant;
P : IUnknown;
F : Cardinal;
cardCap : String;
strSettingID : String;


begin

  WMI:=CreateOleObject('WbemScripting.SWbemLocator');
  wmiService := wmi.ConnectServer('.', 'root\CIMV2');
  nicstatus := wmiService.InstancesOf('Win32_NetworkAdapterConfiguration');
  p := nicstatus._NewEnum;
  p.QueryInterface(IEnumVariant, Enum);
  for cnt := 0 to nicstatus.Count - 1 do
   begin
     Enum.Next(1, card, F);
     cardCap := Copy(card.Caption, 12, MaxInt);
     if cardCap = FAdapter then //Wenn Adapter in der jeweiligen Instanz gleich von mir definierter Adapter
        begin        
          result := getWMIValue('Win32_NetworkAdapterConfiguration','IPAddress',FAdapter);
          break;
        end
   end;
   
end;

auf die schnelle zusammen gebastelt ...

cya

SaltJohn 18. Jun 2008 16:58

Re: Anzeigen der IPAdresse UND Name der Verbindung
 
Hi soulies,

zunächst einmal DANKE!

hätte nicht gedacht dass ich für die IP noch so eine große Funktion benötige :)

Bisher lief mein Programm ohne zusätzliche Units wie WbemScripting_TLB welche ich nun eingebunden habe. Was muss denn noch eingebunden werden damit die Funktion läuft? Er bringt mir nämlich

Zitat:

[Pascal Fehler] : E2003 Undefinierter Bezeichner: 'wmiClass'
im Abschnnitt
Delphi-Quellcode:
l_WMIObjectSet:= l_WMIServices.execquery('Select * from '+wmiClass+' where caption like '+#39+#37+Adapter+#39,'WQL',0,nil);
oder muss ich "wmiClass" noch deklarieren?

Alter Mann 18. Jun 2008 19:03

Re: Anzeigen der IPAdresse UND Name der Verbindung
 
Hi SaltJohn,

'wmiClass' sollte WMI_CLASS heißen, so wie in der Funktionsdeklaration:
Delphi-Quellcode:
function getWMIValue(WMI_CLASS:string;WMI_VALUE:string;Adapter:string): string;
Gruß

SaltJohn 18. Jun 2008 20:40

Re: Anzeigen der IPAdresse UND Name der Verbindung
 
Hallo Alter Mann, das wars vielen Dank für den Hinweis!

Das Programm läuft jetzt aber nur solange bis ich die Funktion aufrufe. Dann bricht er in der Zeile
Delphi-Quellcode:
result := result + l_WMIProperty.Get_Value[i] + ' ; ' ;
ab

mit der Meldung:
Zitat:

Erste Gelegenheit für Exception bei $7C812A5B. Exception-Klasse EVariantBadIndexError mit Meldung 'Variant or safe array index out of bounds'. Prozess Project1.exe (368)

soulies 19. Jun 2008 06:19

Re: Anzeigen der IPAdresse UND Name der Verbindung
 
hi,

ich hab eben mal den code durchlaufen lassen - und bei mir hängt er sich net auf.
Rückgabe der IPAdressen war OK.

hab allerdings Fadapter/Adapter direkt eingetragen, da ich die variable net habe.

Frage:
Delphi-Quellcode:
cardCap := Copy(card.Caption, 12, MaxInt);
die zeichen davor, die du net mitkopierst entsprechen die : '[000000xx]' ?

Was passiert wenn Du testweise auch den Adapter direkt einträgst ?

cya

SaltJohn 19. Jun 2008 07:57

Re: Anzeigen der IPAdresse UND Name der Verbindung
 
Moin soulies!

Zitat:

Zitat von soulies

Frage:
Delphi-Quellcode:
cardCap := Copy(card.Caption, 12, MaxInt);
die zeichen davor, die du net mitkopierst entsprechen die : '[000000xx]' ?

Ja, das ist korrekt. Wusste mir nicht anders zu helfen :)

Habe es jetzt auch zum laufen bekommen. War wohl ein klassischer "off-by-one-error" bei mir.

mit...

Delphi-Quellcode:
if not VarIsNull(l_WMIProperty.Get_Value) then
        begin
          for i:=0 to VarArrayDimCount(l_WMIProperty.Get_Value)-1 do
             result := result + l_WMIProperty.Get_Value[i] + ' ; ' ;
        end;
hat es dann funktioniert. Super :)


Was mir allerdings keine Ruhe läßt... Mich würde noch interessieren ob es nicht doch möglich ist die IPAdresse ohne "WbemScripting_TLB" einzubinden. Ich meine ich kann ja auf die Instanz zugreifen nur eben nicht auf den String.

Edit: Leider zu früh gefreut... habe ich eben bemerkt dass es unter win2000 Probleme gibt. Es kommt die Fehlermeldung "Die Anfrage ist ungültig". Komisch... Die Klassen Caption und IPAddress sind in der WMI von Win2000 vorhanden.


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

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-2025 by Thomas Breitkreuz