Avatar billede eht Nybegynder
05. maj 2008 - 20:45 Der er 13 kommentarer og
1 løsning

Online eller offline.

Hvordan afgør jeg på den mest hensigtmæssige måde om computeren er online ller offline.

Spørgsmålet er tidlige stillet og besvaret af  Borrisholt, men linket til løsningen fungerer ikke længere.

http://www.eksperten.dk/spm/388340
Avatar billede kroning Nybegynder
05. maj 2008 - 21:05 #1
Avatar billede hrc Mester
06. maj 2008 - 08:31 #2
Er der ikke noget helt galt med det eksempel i About? Den forbinder til et dll, returnerer true hvis funktionen findes, returnerer desuden pointer til funktionen ... men hvor frigives handle igen?
Avatar billede kroning Nybegynder
06. maj 2008 - 09:09 #3
Er det eneste der mangler ikke et kald til FreeLibrary.
Avatar billede hrc Mester
06. maj 2008 - 09:09 #4
Har ikke testet, men her er en omskrivning:

// if aFunctionName exists in aFileName it returns handle to dll and pointer to function
function IfAvailableGetDLLFunction(const aFileName, aFunctionName: string;
                                  var aHandle: THandle;
                                  var aFunctionPointer: pointer): boolean;
begin
  result := false;
  if LoadLibrary(pchar(aFileName)) <> 0 then
  begin
    aHandle := GetModuleHandle(pchar(aFileName));
    if aHandle <> 0 then
    begin
      aFunctionPointer := GetProcAddress(aHandle, pchar(aFunctionName));
      result := assigned(aFunctionPointer)
    end;
  end;
end;

// Call SHELL32.DLL for Win < Win98 otherwise call URL.dll }
function IsInternetAvailable: boolean;
var
  Handle: THandle;
  InetIsOffline: function(dwFlags: DWORD): BOOL; stdcall;
begin
  result := false;
  if IfAvailableGetDLLFunction('URL.DLL','InetIsOffline',Handle,@InetIsOffline) then
  begin
    try
      result := not InetIsOffLine(0); // Coming here it's assigned, no need to check!
    finally
      FreeLibrary(Handle); // Ditto here. At this point it's assigned
    end;
  end
  else if assigned(Handle) then
    FreeLibrary(Handle); // Need to check here
end;
Avatar billede hrc Mester
06. maj 2008 - 09:11 #5
else if assigned(Handle) then

skulle være

  else if Handle <> 0 then
Avatar billede kroning Nybegynder
06. maj 2008 - 09:29 #6
Kunne man ikke droppe kaldet til GetModuleHandle med lidt omskrivning, LoadLibrary retunerer jo også handlen.
Avatar billede kroning Nybegynder
06. maj 2008 - 09:53 #7
Her er en lidt forkortet udgave: Jeg har fjernet check før FreeLibrary da der ikke sker noget ved det.


// if aFunctionName exists in aFileName it returns handle to dll and pointer to function
function IfAvailableGetDLLFunction(const aFileName, aFunctionName: string;
                                  var aHandle: THandle;
                                  var aFunctionPointer: pointer): boolean;
begin
  result := false;
  aHandle:=LoadLibrary(pchar(aFileName));
  if aHandle<>0 then
  begin
    aFunctionPointer := GetProcAddress(aHandle, pchar(aFunctionName));
    result := assigned(aFunctionPointer)
  end;
end;

// Call SHELL32.DLL for Win < Win98 otherwise call URL.dll }
function IsInternetAvailable: boolean;
var
  Handle: THandle;
  InetIsOffline: function(dwFlags: DWORD): BOOL; stdcall;
begin
  result := false;
  if IfAvailableGetDLLFunction('URL.DLL','InetIsOffline',Handle,@InetIsOffline) then
  begin
    try
      result := not InetIsOffLine(0); // Coming here it's assigned, no need to check!
    except
    end;
  end;
  FreeLibrary(Handle);
end;
Avatar billede hrc Mester
06. maj 2008 - 10:07 #8
Kroning: Her er jeg ikke helt enig. Funktionen kan godt returnere en handle men ikke en pointer til funktionen - men selvfølgelig, hvis FreeLibrary er ligeglad så er jeg også (det står der bare ikke noget om i MS' hjælp)
Avatar billede kroning Nybegynder
06. maj 2008 - 10:14 #9
Der står i hjælpen:
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

Dvs. der sker ikke noget ved at kalde den selv om Handle er 0

"Funktionen kan godt returnere en handle men ikke en pointer til funktionen"
Jeg ved ikke helt hvad du mener med det?
Avatar billede hrc Mester
06. maj 2008 - 12:12 #10
kroning: Funktionen IfAvailableGetDLLFunction kalder LoadLibrary og derved levere et handle til filen, uden det behøver returnere en funktions-pointer. Derfor skal man huske at kalde FreeLibrary uanset hvad.
Avatar billede eht Nybegynder
06. maj 2008 - 17:56 #11
Hej hrc + kroning
I har haft en længere diskussion mens jeg har været på arbejde.

Jeg har afprøvet funktionen IsInternetAvailable, men den returnerer "true" uanset om jeg er online eller afbryder forbindelsen til nettet ved at afbryde mit trådløse netværk ?

Jeg får for øvrigt en compilerfejl, hvis jeg benytter forslaget med at checke om Handlen er assigned:

else if assigned(Handle) then FreeLibrary(Handle); // Need to check here

Den siger: E2008 Incompatible types

Jeg bruger Delphi 2006

Nogen forslag?
Avatar billede kroning Nybegynder
07. maj 2008 - 20:29 #12
Den eneste måde at finde ud af om man nu har forbindelse helt ud til internettet er måske at pinge en server, men jeg ved det ikke.

Ang. fejlen så se 06/05-2008 09:11:18
Avatar billede eht Nybegynder
07. maj 2008 - 22:33 #13
Jeg tror det med at pinge er løsningen.
Har fundet denne kode til at pinge.

http://delphi.about.com/od/internetintranet/l/aa081503a.htm

Det fungerer fint med at pinge ip-addressen til min website.
Er IP-addressen altid den samme på et bestemt website?
Ellers kan man vist også pinge med web-addressen i stedet for ip-addressen.

Konklusion: kroning læg et svar.

Tak begge to.
Avatar billede kroning Nybegynder
08. maj 2008 - 12:24 #14
IP burde altid være den samme og så slipper man for et DNS opslag.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Ringkjøbing Landbobank – Nordjyske Bank

Forretningsudvikler til procesoptimering

Politiets Efterretningstjeneste

Teamledere til PETs indhentningsafdeling

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Tech Lead til Datacenter Operations

Netcompany A/S

Test Consultant