Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Čteni IP s adapteru (Delphi)

Dobry den.
Potřebují v mem programu vypsat IP adresu,masku,branu a DNS připojeneho adapteru.
Pohrála jsem si tady s tímto zdrojakem a obrátila ho.

http://delphi.cjcsoft.net/viewthread.php?tid=43310

Pokud je IP necvakaná ručně tak mi to funguje.
Pokud je adapter nastaven pro získání IP s DHCP tak to IP nenačte.
Mužů mít v mem zdrojaku něco špatně nebo to fakt neumí vyčíst IP získanou s DHCP.

Popřipadě poradite nějaky jiny zpusob jak tu IP ziskat.

Předmět Autor Datum
Ano, můžeš mít ve svém zdrojáku nějakou chybu. Bohužel jsi zdrojak neposlala, takže nejde říct, jako…
Jan Fiala 30.05.2012 08:29
Jan Fiala
Zkus se podivat sem: http://www.delphitricks.com/source-code/internet/g et_your_own_ip_address.html…
Jan Fiala 30.05.2012 08:30
Jan Fiala
podla mna ten tvoj program cita nastavenia adapteru v tvojich Windowsoch, nie adresu zo sietoveho in…
nl12345... 30.05.2012 15:56
nl12345...
A jak zjistím tu IP se síťovým interface. Bracha po mně chce na plochu průhledný form a v něm aby se…
Marcelka.S 31.05.2012 06:21
Marcelka.S
Divala jsi se na ty 2 priklady,m na ktere jsem daval odkazy? Delphi od 2009 prave maji unicode. Ty s…
Jan Fiala 31.05.2012 06:25
Jan Fiala
Koukala jsem na tento a i zkoušela. http://www.delphitricks.com/source-code/internet/g et_your_own_i…
Marcelka.S 31.05.2012 07:14
Marcelka.S
Pokud mas Delphi 2009, tak vsude, kde je deklarovany Char pouzij AnsiChar, kde je string, tak nahrad…
Jan Fiala 31.05.2012 07:58
Jan Fiala
Funguje :-).Moc dik. Mam IP, jak s toho však vymačknu zbytek. Masku,branu a obě dns.
Marcelka.S 01.06.2012 05:30
Marcelka.S
To bude trosku slozitejsi. Podivej se sem: http://forum.builder.cz/read.php?18,1954040,197301 9,quot…
Jan Fiala 01.06.2012 08:28
Jan Fiala
alebo prestat pouzivat delphi (nezmyselne v tomto pripade) a zacat pouzivat C++ a priame volania Win…
MM.. 01.06.2012 11:46
MM..
Tam bys musel deklarovat struktury stejne jako v Delphi. O nic jineho nejde nez o deklaraci struktur…
Jan Fiala 01.06.2012 11:56
Jan Fiala
struktura sa do C++ programu copy-pastuje z msdn.microsoft.com, alebo uz je v nejakom .h vo visual s…
MM.. 01.06.2012 14:06
MM..
Jasne, ale to je jediny rozdil. Ty hlavickove soubory pro knihovny musel nekdo napsat. Stejne jako j…
Jan Fiala 01.06.2012 15:00
Jan Fiala
Tak jsem přečetla to co psal Snoop a jsem si jista že to určitě nedám. Teda jsem se rozhodla pro tu…
Marcelka.S 01.06.2012 18:20
Marcelka.S
K tomu nepotrebujes zadnou komponentu Spust si: uses ShellApi; procedure xxxxx var s: AnsiString; s…
Jan Fiala 02.06.2012 09:12
Jan Fiala
31 s := ChangeFileExt(Application.ExeName, '.LOG'); 32 ShellExecute(0, 'C:\Windows\System32\IPConfig…
Marcelka.S 07.06.2012 07:48
Marcelka.S
Tiež sa s podobným trápim "v mŕtvom jazyku"... Podarilo sa mi niečo narýchlo "zosmoliť". Nájde sa ni…
pme 01.06.2012 20:48
pme
nerozumiem celkom na co sa pytas, ale u mna to vypise tiez prvy adapter, co je wifina. Win 7 Pro
nl12345... 01.06.2012 23:31
nl12345...
A nevypisuje to nahodou ten adapter, ktery je pravě aktivi. Prozrad prosim jak tu komponentu dostat…
Marcelka.S 02.06.2012 05:54
Marcelka.S
Tu komponentu nemusis dostavat do Delphi. Muzes si ji za behu vytvorit. Pokud ji chces nainstalovat…
Jan Fiala 02.06.2012 09:17
Jan Fiala
No tak jsem se až včera k tomu dostala a nějak nevím jak na to. Component - Install Component a v pr…
Marcelka.S 05.06.2012 05:43
Marcelka.S
DosCommand neudela nic jineho nez spusteni IPCOnfig a odchyceni vyberu. Nebudes mit jednodussi, kdyz…
Jan Fiala 05.06.2012 05:57
Jan Fiala
Nenajde se tu nějaky profik, ktery vysvětli ubohe blondyně, jak přidat tu komponentu do XE2
Marcelka.S 06.06.2012 18:30
Marcelka.S
"Úbohá blondýno"...:-) Netráp sa ťažkými API funkciami alebo zachytávaním výstupu príkazového riadku…
pme 06.06.2012 21:59
pme
A tohle mela jako odpoved uz nahore, i vcetne tech knihoven :-( Jen to nebylo takto takto zabalene s…
Jan Fiala 07.06.2012 06:43
Jan Fiala
Děkují moc chrabrý zachránče :)) Vyzkoušeno a funguje. Stejnak by mně však zajímalo jak přidat tu k…
Marcelka.S 07.06.2012 06:12
Marcelka.S
Dobry den. Pan Jan Fiala tu dal zdrojaček. Marně se to snažim rozchodit v XE2. Rad bych to použil ne…
Borisek 30.06.2012 08:19
Borisek
A kde ti to konkretne hlasi problem?
Jan Fiala 30.06.2012 10:20
Jan Fiala
To same co psala nahoře Marcelka. [DCC Warning] Unit1.pas(32): W1044 Suspicious typecast of string…
Borisek 30.06.2012 10:49
Borisek
PAnsiChar() nahrad za PWideChar()
Jan Fiala 30.06.2012 12:02
Jan Fiala
Ještě posledni [DCC Error] Unit1.pas(32): E2010 Incompatible types: 'PWideChar' and 'Integer'
Borisek 30.06.2012 14:44
Borisek
Zkontroluj si parametry funkce podle napovedy s tim, co tam posilas. Zkus to takto: ShellExecute(0,…
Jan Fiala 30.06.2012 15:42
Jan Fiala
Dobrý den. Nějak nemohu pohnout s tým co tu dal pan Jan Fiala. var s: String; sl: TStringList; beg… poslední
Martin.Ma 12.12.2013 18:08
Martin.Ma

A jak zjistím tu IP se síťovým interface.
Bracha po mně chce na plochu průhledný form a v něm aby se zobrazovala IP,maska brana a DNS právě používaného připojení.

Půjde to pomoci WinSock ????
Zkouším to na tomto http://delphi.about.com/od/networking/l/aa103100a. htm.
A nějak to nemohu rozchodit.

if GetHostName(HName^, SizeOf(Name)) = 0 then

[DCC Error] Unit1.pas(44): E2010 Incompatible types: 'PAnsiChar' and 'Name'

Něco málo jsem četla na netu že delphi od roku 2009 už nemají Unicode.
Nevím však jak to převést.

Divala jsi se na ty 2 priklady,m na ktere jsem daval odkazy?
Delphi od 2009 prave maji unicode. Ty se snazis pouzivat funkci, ktera chce ANSI stringy a ty ji tam posilas unicode stringy.
Zkus jen nahradit jmeno funkce GetHostName() za GetHostNameW(), vse ostatni nechej tak, jak mas.

Koukala jsem na tento a i zkoušela.
http://www.delphitricks.com/source-code/internet/g et_your_own_ip_address.html
[DCC Error] Unit1.pas(38): E2010 Incompatible types: 'PAnsiChar' and 'array[0..63] of Char'
[DCC Warning] Unit1.pas(44): W1057 Implicit string cast from 'AnsiChar' to 'string'

A to GetHostNameW() mi to vůbec nesežere, červena vlnovka.
Asi by to chtělo něco přečist o AnsiChar, ale bohužel je konec školního roku a každý dohání co za cely rok zanedbal.
Lituji že jsem vůbec brachovi něco takového slíbila,delphi máme ve škole první rok takže ???
Asi to odložím po zkouškách.

Pokud mas Delphi 2009, tak vsude, kde je deklarovany Char pouzij AnsiChar, kde je string, tak nahrad za AnsiString.
Kde se funkce PChar(), tak pouzij PAnsiChar()

Zkus tohle:

uses  Winsock; 

function getIPs: Tstrings; 
type 
  TaPInAddr = array[0..10] of PInAddr; 
  PaPInAddr = ^TaPInAddr; 
var 
  phe: PHostEnt; 
  pptr: PaPInAddr; 
  Buffer: array[0..63] of AnsiChar; 
  I: Integer; 
  GInitData: TWSAData; 
begin 
  WSAStartup($101, GInitData); 
  Result := TstringList.Create; 
  Result.Clear; 
  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.Add(inet_ntoa(pptr^[I]^)); 
    Inc(I); 
  end; 
  WSACleanup; 
end;

To bude trosku slozitejsi.
Podivej se sem:
http://forum.builder.cz/read.php?18,1954040,197301 9,quote=1

Budou te zajimat prispevky od uzivatele Snoop a budes muset stahnout prepis hlavicek Windows API do Objekt pascalu - o to se stara projekt JeDi. Nevim, zda to muzes pouzit.

Pokud ne, jsou tu dalsi cesty, treba na pozadi zavolat IPConfig a vycist z nej informace

Tam bys musel deklarovat struktury stejne jako v Delphi.
O nic jineho nejde nez o deklaraci struktury (promennych) a importu knihovny - stejne jako v C++

Jedi projekt nedela nic jineho, nez, ze ti pripravi import + deklarace, abys to mohl volat.

Tady je priklad:

//
// IP_ADDR_STRING - store an IP address with its corresponding subnet mask,
// both as dotted decimal strings
//

  PIP_ADDR_STRING = ^IP_ADDR_STRING;
  {$EXTERNALSYM PIP_ADDR_STRING}
  _IP_ADDR_STRING = record
    Next: PIP_ADDR_STRING;
    IpAddress: IP_ADDRESS_STRING;
    IpMask: IP_MASK_STRING;
    Context: DWORD;
  end;
  {$EXTERNALSYM _IP_ADDR_STRING}
  IP_ADDR_STRING = _IP_ADDR_STRING;
  {$EXTERNALSYM IP_ADDR_STRING}
  TIpAddrString = IP_ADDR_STRING;
  PIpAddrString = PIP_ADDR_STRING;

...

  GetIpStatistics: function (var pStats: MIB_IPSTATS): DWORD; stdcall;
  {$EXTERNALSYM GetIpStatistics}

...

function GetIpStatistics; external iphlpapilib name 'GetIpStatistics';

A podobnemu zapisu se v C++ taky nevyhnes, nebo se mylim?

Tak jsem přečetla to co psal Snoop a jsem si jista že to určitě nedám.
Teda jsem se rozhodla pro tu 2 variantu
Zavolat IPConfig a vyčíst z něj informace.
To bych mohla zvladnout.
Neproradí někdo jak přidat do delphi komponentu doscommand.
Máme ve škole ve třidách vice verzi Delphi ale nejraději bych to rozchodila na XE2.
Prý v 2 ročníku pojedeme jen na nich , a ja budu o krok dopředu.
Už se těším :-/.

K tomu nepotrebujes zadnou komponentu
Spust si:

uses
 ShellApi;

procedure xxxxx
var
  s: AnsiString;
  sl: TStringList;
begin  
  s := ChangeFileExt(Application.ExeName, '.LOG');
  ShellExecute(0, 'C:\Windows\System32\IPConfig.exe', PAnsiChar('>'+s), nil, SW_Hide);
  Sleep(200);
  sl := TStringList.Create;
  sl.LoadFromFile(s);
  { tady si to zpracuj, pripadne to primo zobraz treba v Memo: Memo.Lines.LoadFromFile(s) }
  ...
  sl.Free;
end;

Samozrejme ciste je zjistit systemovy adresar pomoci napr. SHGetSpecialFolderLocation(), ale pro skolni priklad by to melo stacit

31  s := ChangeFileExt(Application.ExeName, '.LOG');
32  ShellExecute(0, 'C:\Windows\System32\IPConfig.exe', PAnsiChar('>'+s), nil, SW_Hide);
33  Sleep(200);
34  sl := TStringList.Create;
35  sl.LoadFromFile(s);
[DCC Warning] Unit1.pas(31): W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'
[DCC Error] Unit1.pas(32): E2010 Incompatible types: 'PWideChar' and 'PAnsiChar'
[DCC Error] Unit1.pas(32): E2010 Incompatible types: 'PWideChar' and 'Integer'
[DCC Warning] Unit1.pas(35): W1057 Implicit string cast from 'AnsiString' to 'string'

Tu 31 jsem pochopila s: String a ne AnsiString takže 31 a 35 vyřešen,zbyvji 2 chyby na řadku 32
Jinak bych chtěla i vám poděkovat za pomoc a trapení se mnou.
Jsem vděčna každemu kdo pomuže a poradí.

Tiež sa s podobným trápim "v mŕtvom jazyku"... Podarilo sa mi niečo narýchlo "zosmoliť".
Nájde sa niekto kto vyskúša?

Mne to síce funguje, ale mám pocit, že systémový ipconfig vypisuje všetky adaptéry (Tunel adapter, pseudo interface apod.), v nejakom poradí...
V Delphi som zistil, že mám na PC 4 adaptéry podľa typu:
0. Ethernet
1. Loopback
2. Tunnel
3. Tunnel
Keďže u mňa je prvý Ethernet adaptér - výpis je správny. Môže niekto potvrdiť,vyvrátiť? Treba testovať, prechádzať všetky adaptéry?

App -exe je v prílohe. Ď.

Edit: zabudol som moje PC - Win 7-64bit, LAN kábel...

Tu komponentu nemusis dostavat do Delphi. Muzes si ji za behu vytvorit.
Pokud ji chces nainstalovat do Delphi, tak v menu Component / Install Component si vyber unitu, vysledny balicek (uzivatelsky) a nech Delphi kompoenntu nainstalovat.

Pokud to v D XE zmenili a tato moznost tam neni, pak musis editovat uzivatelsky balicek, pripadne vytvorit novy Package, do nej pridat unitu DosCommand, balicek oznacit jako runtime i designtime a prekompilovat.

No tak jsem se až včera k tomu dostala a nějak nevím jak na to.
Component - Install Component a v prvním okně unit file name vyberu DosCommand.pas a nechám Instal existing package.
Next a jsem v ????
Našla jsem na netu tohle compinstall.html
V kolonce Search Patch mam
$(BDSLIB)\$(Platform)\release;$(BDSUSERDIR)\Import s;$(BDS)\Imports;$(BDSCOMMONDIR)\Dcp;$(BDS)\includ e;C:\Program Files\FastReports\LibD16;$(BDS)\RaveReports\Lib;C: \Program Files\Raize\CS5\Lib\RS-XE2\Win32
Kde najdu baličky (Package name) do kterych to mohu strčit.
Ja hledala ten baliček co je použit v tom navodu a mam ho c:\Program Files\Embarcadero\RAD Studio\9.0\lib\win32\release\dclusr.dpk

Zajimalo by mně i jak vytvořit tu komponentu za běhu.
Mame ve škole užasneho učitele, ktery na každou otazku, ktera je mimo probiranou osnovu da jasnou odpověd.
Kdo si počka,ten se dočka :-/
I s instalovaním te komponenty mně poslal do haje.

DosCommand neudela nic jineho nez spusteni IPCOnfig a odchyceni vyberu.
Nebudes mit jednodussi, kdyz to udelas tak, ze vysledek ulozis do souboru a ten zpracujes, jak jsem popisoval vys?

Pokud chces komponentu vytvaret za behu, vydrz, vecer to vyzkousim a napisu. Krome vytvoreni bude treba napsat i obsluhu udalosti prave pro odchyceni vystupu a z hlavy nevim, jake udalosti DosCommand ma ;-)

"Úbohá blondýno"...:-) Netráp sa ťažkými API funkciami alebo zachytávaním výstupu príkazového riadku a pozri sa sem: www.magsys.co.uk

Stačí stiahnuť: magiphlp25.zip rozbaliť a nakopírovať do adresára, kde máš projekt iba 2 unity:
IPHelper.pas, IPHLPAPI.pas.

Vytvor si projekt, na form si pridaj napr. TMemo, TButton, použi funkciu: IpHlpAdaptersInfo(var AdpTot: integer;var AdpRows: TAdaptorRows): integer; z knižnice IPHelper.

príklad:

uses IPHelper;

procedure TForm2.Button1Click(Sender: TObject);
var
  A: TAdaptorRows;
  I: Integer;
begin
  IpHlpAdaptersInfo(I,A);
  Memo1.Lines.Add(A[0].Description);
  Memo1.Lines.Add(A[0].MacAddress);
  Memo1.Lines.Add(A[0].IPAddressList[0]);
  Memo1.Lines.Add(A[0].IPMaskList[0]);
  Memo1.Lines.Add(A[0].GatewayList[0]);
  Memo1.Lines.Add(A[0].DHCPServer[0]);
  Memo1.Lines.Add(A[0].DNSServerList[0]);
end;

Testované "narýchlo" v XE2 a funguje...

Děkují moc chrabrý zachránče :))
Vyzkoušeno a funguje.

Stejnak by mně však zajímalo jak přidat tu komponentu do XE2.
Pokud se nenaučím v Delphi přidávat komponenty, tak se moc daleko nedostanu a čekat na toho vola ve škole se mi nechce.
Kdyby jste měl někdy v budoucnu chvilku času a kouk na to.
Budu pravidelně tento topik sledovat.
Ještě jednou moooc dik.

Dobry den.
Pan Jan Fiala tu dal zdrojaček.
Marně se to snažim rozchodit v XE2.
Rad bych to použil ne pro IPConfig ale tracert.
Pujde to nějak.

uses
 ShellApi;

procedure xxxxx
var
  s: AnsiString;
  sl: TStringList;
begin  
  s := ChangeFileExt(Application.ExeName, '.LOG');
  ShellExecute(0, 'C:\Windows\System32\IPConfig.exe', PAnsiChar('>'+s), nil, SW_Hide);
  Sleep(200);
  sl := TStringList.Create;
  sl.LoadFromFile(s);
  { tady si to zpracuj, pripadne to primo zobraz treba v Memo: Memo.Lines.LoadFromFile(s) }
  ...
  sl.Free;
end;

To same co psala nahoře Marcelka.

[DCC Warning] Unit1.pas(32): W1044 Suspicious typecast of string to PAnsiChar
[DCC Error] Unit1.pas(32): E2010 Incompatible types: 'PWideChar' and 'PAnsiChar'
[DCC Error] Unit1.pas(32): E2010 Incompatible types: 'PWideChar' and 'Integer'

řadek 32 je

ShellExecute(0, 'C:\Windows\System32\IPConfig.exe', PAnsiChar('>'+s), nil, SW_Hide);

Dobrý den.
Nějak nemohu pohnout s tým co tu dal pan Jan Fiala.

var
s: String;
sl: TStringList;
begin
s := ChangeFileExt(Application.ExeName, '.LOG');
ShellExecute(0, 'Open', 'C:\Windows\System32\IPConfig.exe', PWideChar('>'+s), nil, SW_normal);
Sleep(200);
sl := TStringList.Create;
sl.LoadFromFile(s);

Ve stringu s mi to vrací cestu k souboru .LOG
Pokud jsem to pochopil tak si to uloží do toho souboru LOG výpis s IPConfig a pak načte do s.

Je to to same, když použijí toto?
ShellExecute( handle, 'open', 'cmd.exe', '/q /c ipconfig -all > C:\logs1.txt', nil ,SW_SHOWNORMAL );

Zpět do poradny Odpovědět na původní otázku Nahoru