Autor Beitrag
SevenValues
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

XP, ME, 98
Delphi 6 PE
BeitragVerfasst: Do 25.09.03 16:28 
Damit das leidige Thema ein Ende findet. Ich war auch am Rande der Verzweiflung, als ich herausfinden wollte, ob mein Rechner online ist.
Nichts hat geholfen (!!!!! AUCH WinInet.GetConnectedState(NIL, 0) hat nichts genützt !!!!!!) Für all die Schlaumeier, die GetConnectedState für ein Allheilmittel in Sachen Onlinestatus halten: unter XP kannste das gleich wieder knicken!!!

Hier die Lösung:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
unit CheckInternetConnection1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Registry, WinSock, WinInet;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    private
      { Private-Deklarationen }
    public
      { Public-Deklarationen }
    end;

const
  cERROR_BUFFER_TOO_SMALL = 603;
  cRAS_MaxEntryName = 256;
  cRAS_MaxDeviceName = 128;
  cRAS_MaxDeviceType = 16;

type
  TConnectionType = (ctNone, ctProxy, ctDialup);
  ERasError = class(Exception);
    HRASConn = DWord;
    PRASConn = ^TRASConn;
    TRASConn = record
      dwSize: DWORD;
      rasConn: HRASConn;
      szEntryName: array[0..cRAS_MaxEntryName] of Char;
      szDeviceType: array[0..cRAS_MaxDeviceType] of Char;
      szDeviceName: array [0..cRAS_MaxDeviceName] of char;
    end;
    TRasEnumConnections = function (RASConn: PrasConn; var BufSize: DWord;
     var Connections: DWord): LongInt; stdcall;

var
  Form1: TForm1;

function ConnectedToInternet: TConnectionType;
function RasConnectionCount: Integer;

implementation

{$R *.DFM}

function ConnectedToInternet: TConnectionType;
var Reg: TRegistry;
  bUseProxy: Boolean;
  UseProxy: LongWord;
begin
  Result := ctNone;
  Reg := TRegistry.Create;
  with REG do
    try
      try
        RootKey := HKEY_CURRENT_USER;
        if OpenKey('Software\Microsoft\WindowsCurrentVersion\Internet settings',
        false) then begin
          if GetDataType('ProxyEnable') = rdBinary then
            ReadBinaryData('ProxyEnable', UseProxy, SizeOf(LongWord))
          else begin
            bUseProxy := ReadBool('ProxyEnable');
            if bUseProxy then UseProxy := 1
            else UseProxy := 0;
          end;
          if (UseProxy<>0and (ReadString('ProxyServer')<>'' ) then Result := ctProxy;
        end;
      except
      end;
    finally
      Free;
    end;
    if Result = ctNone then begin
      if RasConnectionCount > 0 then Result := ctDialup;
    end;
end;

function RasConnectionCount: Integer;
var RasDLL: HInst;
  Conns: array[1..4of TRasConn;
  RasEnums: TRasEnumConnections;
  BufSize: DWord;
  NumConns: DWord;
  RasResult: Longint;
begin
  Result := 0;
  RasDLL := LoadLibrary('rasapi32.dll');
  if RasDLL = 0 then exit;
  try
    RasEnums := GetProcAddress(RasDLL,'RasEnumConnectionsA');
    if @RasEnums = nil then
      raise ERasError.Create('RasEnumConnectionsA not found in rasapi32.dll');
    Conns[1].dwSize := Sizeof (Conns[1]);
    BufSize := SizeOf(Conns);
    RasResult := RasEnums(@Conns, BufSize, NumConns);
    if (RasResult = 0or (Result = cERROR_BUFFER_TOO_SMALL) then Result := NumConns;
  finally
    FreeLibrary(RasDLL);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Status: TConnectionType;
  sMsg: string;
begin
  Status := ConnectedToInternet;
  if Status = ctDialup then sMsg := 'Im Internet!';
  if Status = ctNone then sMsg := 'Nicht im Internet!';
  if Status = ctProxy then sMsg := 'Proxyserver';
  ShowMessage(string(sMsg));
end;

end.


Grüße
7

Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt

_________________
Nacht ist, wenn einer das Licht ausschaltet.
BungeeBug
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 901



BeitragVerfasst: Do 25.09.03 18:00 
Hi,

dann is da immer noch das Problem mit dem Router :)

Nich das ich deine Lösung schlecht machen will, aber evl. kannst du dir da ja auch noch was einfallen lassen :)
SevenValues Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

XP, ME, 98
Delphi 6 PE
BeitragVerfasst: Do 25.09.03 20:12 
Ich glaube Du bist der, der DSL und zwei Rechner am Router hängen hat und sich das Einwählen sparen will, wenn der eine Rechner bereits Online ist, oder?
Ich habe bereits darüber nachgedacht, allerdings wirst Du da wohl nicht drumherum kommen auf jedem Rechner einen Onlinechecker laufen zu lassen und diese beiden Onlinechecker miteinander kommunizieren zu lassen. Ähnlich wie eine True - False - Auswertung. Rechner 1: Ich bin online und petze das jetzt Rechner 2. Rechner 2 ist beleidigt und sperrt das Autodial auf Rechner 2. Dann wählt sich Dein Onlinenutzungsprogramm, wie Outlook oder Netscape nicht mehr automatisch ein.

Grüße
7

_________________
Nacht ist, wenn einer das Licht ausschaltet.
BungeeBug
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 901



BeitragVerfasst: Do 25.09.03 21:55 
Hi,

nein ich bin nicht der ... ich würd nie auf die abartige Idee kommen sowas zubasteln ;)

Aber ich hab nen Router. Und dein Tool sagt mir online egal was ich mache. Ganz einfacht weil ich ne Netzwerkverbindung an hab. Aber es soll auch Leute geben die nur nen Netzwerk haben :)
SevenValues Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

XP, ME, 98
Delphi 6 PE
BeitragVerfasst: Fr 26.09.03 11:15 
Wie stellst Du denn Deine Netzwerkverbindung her? Doch wohl nicht über Modem oder? Der Onlinestatus wird über die rasapi32.dll gecheckt. Die nutzt Du mit Sicherheit nicht, wenn Dein Netzwerk aktiviert wird. Es sei denn, Du wählst Dich via Modem in Dein Netzwerk ein, d.h. Deine kompletten Netzwerkverbindungen wären dann Modemverbindungen.

Ich hab XP mit zwei Rechnern, die zwar nicht über nen Router verbunden werden (warum auch), aber das Prinzip sollte das selbe sein. Vielleicht stimmt mit Deiner Auswertung da was nicht?

Grüße
7

PS:
Was hast Du eigentlich vor??

_________________
Nacht ist, wenn einer das Licht ausschaltet.
BungeeBug
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 901



BeitragVerfasst: Fr 26.09.03 14:49 
Ich hab garnix vor. ich wollte dich nur drauf hinweisen das wenn jmd. eine Netzwerkverbindung ins INet hat es zur folge hat das dein Tool die LAN IP wieder gibt. Nicht mehr und nicht weniger. Vielleicht lässt sich auch da noch was machn, das man zumindest feststellt das das ganze in einem netzwerk ist und nich im INet. Ich kenne genug Leute die auf die Frage "Wie ist deine IP" antworten 192...... und dem soll dadurch vorgegriffen werden. Verstehst du was ich meine? Ich denke es wird für dich bedeuten einfach das Standartgarteway auslesen und dann ganz pauschal feststellen das das auslesen der INet IP nicht möglich ist.
SevenValues Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

XP, ME, 98
Delphi 6 PE
BeitragVerfasst: Fr 26.09.03 15:52 
Hm..

Nur mit dem Problem, daß mein Tool keine IPs ausgibt, sondern am Rechner, der Online ist lediglich feststellt, ob er online ist.
Du hast in sofern recht, als daß man am Client-Rechner (also an dem Rechner, der im Netzwerk, aber NICHT am Internet hängt) die IP der Online-Verbindung nicht feststellen kann. Das kann dem Client-Rechner aber ein lauschprogramm übermitteln. Im Grunde ist das Tool da oben nichts weiter als ein Tool, das am Internetrechner den Onlinezustand feststellt. Letztenendes kann man doch mit den beiden Units machen, was man will. Man könnte z.B. per Indy die IP der Onlineverbindung übermitteln. Wie man die IP herausbekommt ist in diesem Forum divers dargestellt worden. Man sollte halt eben nur darauf auchten, daß die WinAPI von Betriebssystem zu Betriebssystem verschieden ist und daß gerade der Onlinesektor in der WinAPI unterschiedlicher nicht sein kann. Hat wohl mit der immerwährenden Kritik an MS zu tun, der MS ja gerecht werden will. Wohl oder übel MÜSSEN die von MS ja die Onlinefunktionen überarbeiten. Da aber wir beide 2000/XP-User sind, sollten wir schon über das gleiche reden können. Wie mir aber scheint, hast du die functions in der obigen Unit gar nicht ausprobiert, oder? Die gibt keine IP aus.
Natürlich liegt die IP eines Netzwerkrechners (ob mit ICS oder nicht, ob Proxy oder nicht) immer im privaten Bereich - also 192. ... Das ist aber auch gar nicht das Thema. Das Thema ist: Bin ich Online, oder nicht? Dazu steht oben die Lösung. Und zwar gleichermaßen für 2000 wie für XP. Ob das bei 98 funktioniert weiß ich jetzt gar nicht so genau und 95 - naja, wer nutzt schon noch 95???

Grüße
7

_________________
Nacht ist, wenn einer das Licht ausschaltet.
Chris1308
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 220

Win XP Prof.
D2005 Prof, D7 Prof, D7 Pers
BeitragVerfasst: Fr 26.09.03 21:37 
Hi,
das es nicht klappt, wenn man hinter einem Router sitzt stimmt.
Und wie soll das bitte auch gehen? Du liest die RAS-Connection aus. Das hilft dir aber nicht, wenn jemand per Gateway ins Internet geht (also per Router).

Wie BungeeBug schon gesagt hat: in diesem Fall muss derjenige den Standardgateway auslesen und dort prüfen, ob eine Verbindung besteht. Wobei letzteres schwierig wird, weil nicht gesagt ist, dass auf jedem Router bspw. fli4l drauf ist.

Chris
SevenValues Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

XP, ME, 98
Delphi 6 PE
BeitragVerfasst: Sa 27.09.03 00:59 
Achso - Achso - Achso!

An diese Leute ist ja diese Unit eigentlich auch nicht gerichtet. Jetzt verstehe ich erstmal, worauf Bungee hinaus will!
Hoppla!
In dem Falle wird tatsächlich nur auf die RAS-Connection aufgeprüft und per Routernetzwerk ist ja dann jeder Compi im Grunde "nur" ein Client und der Router der Host. Dann funzt das ganze nicht, es sei denn man nutz einen Compi als Router, aber dann wirds wirklich kompliziert. Da fällt mir spontan auch nur ein Ping nach google.de ein oder so. Da der Server aber auch mal nicht verfügbar sein kann, ist das auch schonwieder Asche!

Ich denke mal darüber nach und belese mich mal.

Grüße
7

_________________
Nacht ist, wenn einer das Licht ausschaltet.