Cześć
Mam dość poważny problem - chodzi mi o pobranie nazwy hosta i domeny
pod XP (zwłaszcza domeny)
Sorki że się tu rozpisze - ale nie chcĘ ale muszem ;)
Chcę obrazowo to przedstawić , a więc jest kod z 98 który pięknie pobiera to co powyżej z jednym MANKAMENTEM > w XP wyświetla tylko host np. Komp-Mariana
zamiast w całości Komp-Mariana.mojadomena.pl
//Pobranie nazwy Hosta (dla XP - host bez domeny)
FUNCTION TForm1.GetHost98:String;
var
WSAData :TWSAData;
nazwa :array[0..MAX_PATH] of char;
hostEnt :PHostEnt;
Begin
Result:= '';
if WSAStartup($0101, WSAData) = 0 then
try
GetHostName(@nazwa, MAX_PATH);
hostEnt:= GetHostByName(@nazwa);
Result:= hostEnt^.h_name; //pobranie nazwy hosta
finally
WSACleanup; //zwalnia bibliotekę WinSock
end;
End;
Dla Xp zrobiłem takie coś które działa ok:
{ Pobranie nazwy Hosta oraz Domeny (wykorzystanie biblioteki IPHLPAPI.DLL)
pobiera i w 98 i w XP}
PROCEDURE GetDomena(var NazwaHosta,NazwaDomeny:String);
type
PTdane = ^TDane;
TDane = packed record
nHosta :array[1..132] of Char;
nDomeny :array[1..132] of Char;
end;
var
dane :PTDane;
rozmiar :Longint;
wynik :Integer;
GetNetPar :function(dane:PTDane; pOutPutLen:PULONG):DWORD; Stdcall;
Begin
try
rozmiar:= 0;
//załadowanie biblioteki...
uchwytDll:= LoadLibrary('IPHLPAPI.DLL');
//jeżeli nie załadowana to wyjście...
if uchwytDll = 0 then
begin
Exit;
end;
//wskażnik na pobranie funkcji z biblioteki ...
@GetNetPar:= GetProcAddress (uchwytDll,'GetNetworkParams');
//zabezpieczenie przed błędem (np. brak funkcji w bibliotece)...
if @GetNetPar = nil then
begin
FreeLibrary(uchwytDll);
Exit;
end;
wynik:= GetNetPar(nil,@rozmiar);
if wynik <> ERROR_BUFFER_OVERFLOW then Exit;
GetMem(dane,rozmiar);
try
wynik:= GetNetPar(dane,@rozmiar);
if wynik <> ERROR_SUCCESS then Exit;
with dane^ do
begin
NazwaHosta:= Trim (nHosta);
NazwaDomeny:= Trim (nDomeny);
end;
finally
FreeMem(dane);
end;
finally
//jeżeli biblioteka załadowana to zwalnia tą bibliotekę
if uchwytDLL <> 0 then FreeLibrary(uchwytDLL);
end;
End; //ok. - Win98/XP
Zapytacie więc w czym problem - otóż musze pobierać domenę i host w wątku albo
w timerze (nie pytajcie dlaczego muszę non stop ;) )
i wtedy ta procedura robi mi zwieszki programu - dawałem opóżnienia sleep itp.
ale od czasu do czasu robi mi zwis , a to dlatego że w tym samym programie w innym miejscu do czego innego - też mam wywołaną IPHLPAPI.DLL - i to sie widać gryzie.
Powiecie "nie zwalniaj bibli" - ale znowu muszę zwalniać ;)
dam przykład dlaczego :
ponieważ siedzą w pamięci pobrane dane za pierwszym razem (host domena) ,
nawet wtedy kiedy wyjmiesz karte sieciową :)) a powinnno przy takim rozłączeniu
pokazywać brak domeny bo nie jesteś połączony ;)
I trzeba zgasić i ponownie włączyć progsa by odświeżyć dane - a ja to robie zwalnianiem biblioteki
Troche to pomylone ale musze tak mieć i tyle ;)
Pytanie:
Czy jakoś nie można inaczej pobierać pod XP tych danych ? nie korzystając z
IPHLPAPI.DLL ?
Albo coś dodać do tej pierwszej procki dla 98 aby działało też pod XP ?