Entwickler-Ecke

Internet / Netzwerk - DFÜ-Verbindung trennen


willi - So 17.10.04 15:24
Titel: DFÜ-Verbindung trennen
Hallo,
ich möchte gerne eine DFÜ-Verbindung ins Internet trennen. Ich kann zwar rausbekommen, ob eine DFü-Verbindung besteht, aber ich kann sie leider nicht trennen. Mit der Methode InternetAutodialHangup(0); klappt es leider nicht. :(
Ich möchte mir nun auch nicht alle möglichen Komponenten runterladen um rauszubekommen, dass die dies auch nicht schaffen...
weiß jemand, wie ich das selber programmieren kann??

Vielen Dank schonmal
MFG


wulfskin - So 17.10.04 16:59

Hallo Willi,

ich helf dir gleich, muss aber davor meine Delphi-Festplatte anstecken ;).
Zunächst brauchst du aber die API Überseztzung der RAS-Schnittstelle. Diese findest du bei Jedi-Delphi: ftp://delphi-jedi.org/api/RAS.zip.

So hier schonmal die Prozedur, mit der du eine Verbindung, anhand des Handles, trennen kannst:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure Disconnect(const hRasConn: THRasConn);
var
  Status: TRasConnStatusA;
begin
  if hRas <> 0 then begin
    RasHangUp(hRasConn);
    FillChar(Status, SizeOf(Status), 0);
    Status.dwSize := SizeOf(Status);
    while RasGetConnectStatus(hRasConn, Status) <> ERROR_INVALID_HANDLE do
      Sleep(0);
  end;
end;
Jetzt kannst du schon mal die Verbindung trennen. Nun musst du nur noch wissen, welche Verbindung gerade läuft. Ich schau mal, ob ich dir da noch was zusammen basteln kann.

Gruß,
Hape


Anonymous - So 17.10.04 17:12

Die zauberhafte Welt des Herrn Professor S. D. Kit :

- RasEnumConnections()
- RasHangUp()

sind deine besten Freunde für dein Ansinnen ;)

Eine weitere RAS-Übersetzung gibts von mir:
http://assarbad.net/stuff/api_conversions.zip


willi - So 17.10.04 18:21

Vielen Dank für die schnelle Antwort.
Aber das PSDK ist für meine isdn-leitung leider etwas zu groß.
Und bei dem Download der RAS-Schnittstelle habe ich leider auch Probleme... er will sie einfach nicht downloaden, keine Ahnung warum. Ich werd es später nochmal versuchen, vielleicht nur ein Server-Problem oder sowas.

Trotzdem nochmal danke


wulfskin - So 17.10.04 19:16

Hallo Willi,

vielleicht liegt es ja am Server. Ich hab mal die Ras-Header mit einem Beispiel (nicht von mir, dafür besser ;)) hochgeladen:

http://programs.hippieclan.net/d_ras.zip

Viele Grüße,
Hape


willi - So 17.10.04 23:45

oh, super,
hab grad das Testprogramm ausprobiert und kann ja nun daraus mir das trennen etwas abschauen... jedenfalls funktioniert das trennen.

vielen dank


CABALxx - Do 11.11.04 15:05

moin moin
ich weiss das thema is paar tage alt aber eigentlich immernoch interessant

das testprogramm habe ich auch heruntergeladen
es funktioniert vorzüglich !! :D

ich wollt mir nun diesen teil hier


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:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Ras,
  StdCtrls, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListView1: TListView;
    procedure Button1Click(Sender: TObject);
  private
  function StatusString(state: TRasConnState; error: Longint): String;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


function tform1.StatusString(state: TRasConnState; error: Longint): String;
  var
    c: Array[0..100of Char;
    s: String;
  begin
  if error <> 0 then
    begin
    RasGetErrorString(error, c, 100);
    Result := c;
    end
  else
    begin
    s := '';
    case State of
      RASCS_OpenPort:
        s := 'Opening port';
      RASCS_PortOpened:
        s := 'Port opened';
      RASCS_ConnectDevice:
        s := 'Connecting device';
      RASCS_DeviceConnected:
        s := 'Device connected';
      RASCS_AllDevicesConnected:
        s := 'All devices connected';
      RASCS_Authenticate:
        s := 'Start authenticating';
      RASCS_AuthNotify:
        s := 'Authentication: notify';
      RASCS_AuthRetry:
        s := 'Authentication: retry';
      RASCS_AuthCallback:
        s := 'Authentication: callback';
      RASCS_AuthChangePassword:
        s := 'Authentication: change password';
      RASCS_AuthProject:
        s := 'Authentication: projecting';
      RASCS_AuthLinkSpeed:
        s := 'Authentication: link speed';
      RASCS_AuthAck:
        s := 'Authentication: acknowledge';
      RASCS_ReAuthenticate:
        s := 'Authentication: reauthenticate';
      RASCS_Authenticated:
        s := 'Authenticated';
      RASCS_PrepareForCallback:
        s := 'Preparing for callback';
      RASCS_WaitForModemReset:
        s := 'Waiting for modem reset';
      RASCS_WaitForCallback:
        s := 'Waiting for callback';
      RASCS_Projected:
        s := 'Projected';
      RASCS_StartAuthentication:
        s := 'Start authentication';
      RASCS_CallbackComplete:
        s := 'Callback complete';
      RASCS_LogonNetwork:
        s := 'Logging on network';

      RASCS_Interactive:
        s := 'Interactive';
      RASCS_RetryAuthentication:
        s := 'Retry Authentication';
      RASCS_CallbackSetByCaller:
        s := 'Callback set by caller';
      RASCS_PasswordExpired:
        s := 'Password expired';

      RASCS_Connected:
        s := 'Connected';
      RASCS_Disconnected:
        s := 'Disconnected';
      end;
    Result := s;
    end;
  end;


procedure TForm1.Button1Click(Sender: TObject);
var
    bufsize: Longint;
    numEntries: Longint;
    x: Integer;
    entries: Array[1..100of TRasConn;
    stat: TRasConnStatus;
  begin
  entries[1].dwSize := SizeOf(TRasConn);
  bufsize := SizeOf(TRasConn) * 100;
  ListView1.Items.Clear;
  FillChar(stat, Sizeof(TRasConnStatus), 0);
  stat.dwSize := Sizeof(TRasConnStatus);
  if RasEnumConnections(@entries[1], bufsize, numEntries) = 0 then
    begin
    if numEntries > 0 then
      begin
      for x := 1 to numEntries do
        with ListView1.Items.Add, entries[x] do
          begin
          Data := Pointer(hrasconn);
          Caption := szEntryName;
          SubItems.Add(szDeviceType);
          SubItems.Add(szDeviceName);
          RasGetConnectStatus(hrasconn, stat);
          SubItems.Add(StatusString(stat.rasconnstate, stat.dwError));
          end;
      ListView1.ItemFocused := ListView1.Items[0];
      end;
    end
  else
    ShowMessage('RasEnumConnections failed.');
  end;

end.


mal benutzen um in einem eigenen programm die internetverbindung zu kappen....

aber:

An dieser stelle


Delphi-Quelltext
1:
if RasEnumConnections(@entries[1], bufsize, numEntries) = 0 then                    


gibt er mir für bufsize und numentries nen fehler aus:
er meint folgendes:

" Die typen der tatsächlichen und Formalen Var- Parameter müssen übereinstimmen"

ich hab selbst versucht es zu beheben

ich bin dran verzweifelt

vielleicht könnt ihr mir ja sagen wo der fehler liegt?


Anonymous - Do 11.11.04 16:53

Da mußt du schonmal den Prototypen der Funktion hier zeigen. Es hängt nämlich durchaus von der Übersetzung ab, wie man Parameter übergeben muß.


CABALxx - Do 11.11.04 18:37

prototypen der function?

also weiter als das was ich als source gepostet hab bin ich ja noch nicht mal :oops:

oder was versteht man unter dem prototypen der funktion ?