Einzelnen Beitrag anzeigen

Mephistopheles
(Gast)

n/a Beiträge
 
#8

Re: DFÜ-Verbindung aufbauen, ohne DFÜ-Eintrag zu nutzen

  Alt 25. Apr 2005, 19:23
Ich habe da mal ganz schnell etwas vorbereitet. Im Anhang befindet sich das vollständige Projekt und die Includedateien.
Der Einfachheit halber ist es ein Konsolenprogramm, weil das den Code auf das nötigste beschränkt.

Das ist ab jetzt PUBLIC DOMAIN. Darf also beliebig weiterverwendet werden.

Einschränkungen: Dieser Quelltext funktioniert unverändert maximal unter NT4/2000 und Nachfolgern, jedoch nicht unter Win9x. Für letzteres wären Anpassungen notwendig.
Getestet wurde er mit Delphi 4 Pro unter Windows 2000.

Delphi-Quellcode:
program MiniDialer;
{$APPTYPE CONSOLE}
uses
  SysUtils,
  Windows;

{$INCLUDE Ras.pas}

function ListRASDevices(var NumDevices: DWORD): LPRASDEVINFOA; // Must be freed with GlobalFree()
var
  Buffer, temp: LPRASDEVINFOA;
  NumDev, SizeNeeded: DWORD;
  i: Integer;
begin
  result := nil;
  RasEnumDevices(nil, @SizeNeeded, @NumDev);
  Buffer := LPRASDEVINFOA(GlobalAlloc(GPTR, SizeNeeded));
  if Assigned(Buffer) then
  begin
    Buffer^.dwSize := sizeof(RASDEVINFOA);
    RasEnumDevices(Buffer, @SizeNeeded, @NumDev);
    temp := Buffer;
    // Iterate through devices!
    for i := 0 to NumDev - 1 do
    begin
      Writeln(Format('%d -> %s [%s]', [i + 1, temp^.szDeviceName, temp^.szDeviceType]));
      // Go to next entry in the list
      temp := LPRASDEVINFOA(DWORD(temp) + sizeof(RASDEVINFOA));
    end;
    // Return buffer. It MUST BE FREED using GlobalFree()!
    NumDevices := NumDev;
    result := Buffer;
  end;
end;

function CreatePbkEntry(
  Phonebook,
  EntryName,
  DeviceName,
  DeviceType,
  NumberToDial,
  Username,
  Password: string
  ): Boolean;
var
  dwError: DWORD;
  pbk: PChar;
  EntryParams: RASENTRYA;
  DialParams: RASDIALPARAMSA;
begin
  result := False;
  if (Length(EntryName) > 0) then
  begin
    if (Length(PhoneBook) > 0) then
      pbk := @PhoneBook[1]
    else
      pbk := nil;
    dwError := RasValidateEntryName(pbk, @EntryName[1]);
    if (dwError = ERROR_SUCCESS) then
    begin
      ZeroMemory(@EntryParams, sizeof(EntryParams));
      // Parameters of RAS entry
      EntryParams.dwSize := sizeof(EntryParams);
      EntryParams.dwfOptions := RASEO_ModemLights or RASEO_SwCompression;
      EntryParams.dwFramingProtocol := RASFP_Ppp;
      EntryParams.dwfNetProtocols := RASNP_Ip;
      lstrcpy(@EntryParams.szLocalPhoneNumber[0], @NumberToDial[1]);
      lstrcpy(@EntryParams.szDeviceName[0], @DeviceName[1]);
      lstrcpy(@EntryParams.szDeviceType[0], @DeviceType[1]);
      dwError := RasSetEntryProperties(
        pbk,
        @EntryName[1],
        @EntryParams,
        sizeof(EntryParams),
        nil,
        0);
      // Upon success set the password and username
      if (dwError = ERROR_SUCCESS) then
      begin
        ZeroMemory(@DialParams, sizeof(DialParams));
        // Dial parameters of an entry
        DialParams.dwSize := sizeof(DialParams);
        lstrcpy(@DialParams.szEntryName[0], @EntryName[1]);
        lstrcpy(@DialParams.szUserName[0], @Username[1]);
        lstrcpy(@DialParams.szPassword[0], @Password[1]);
        dwError := RasSetEntryDialParams(pbk, @DialParams, false);
        if (dwError <> ERROR_SUCCESS) then
          Writeln('RasSetEntryDialParams() Fehler: ', dwError); // FIXME: Andere Fehlerbehandlung
      end;
      if (dwError <> ERROR_SUCCESS) then
        Writeln('RasSetEntryProperties() Fehler: ', dwError); // FIXME: Andere Fehlerbehandlung
    end; // FIXME: Fehlerbehandlung
  end; // FIXME: Fehlerbehandlung
end;

var
  devices, temp: LPRASDEVINFOA;
  i, numdev: DWORD;
  Device, DeviceType: string;
begin
  // Initialisiere die Include-Datei, bzw. die enthaltenen APIs
  InitRAS();
  Writeln('Wähle ein Gerät, über welches die Verbindung erfolgen soll:');
  devices := ListRASDevices(numdev);
  Write('Gib die Zahl des Eintrags an: ');
  Readln(i);
  // Find the device chosen
  if (i > 0) and (i <= numdev) then
  begin
    i := i - 1;
    temp := LPRASDEVINFOA(DWORD(devices) + sizeof(RASDEVINFOA) * i);
    SetString(Device, temp^.szDeviceName, lstrlen(@temp^.szDeviceName[0]));
    SetString(DeviceType, temp^.szDeviceType, lstrlen(@temp^.szDeviceType[0]));
    Writeln(Format('Folgendes Gerät gewählt: %s [%s]', [Device, DeviceType]));
    GlobalFree(HGLOBAL(devices)); // Free buffer with RAS devices
  end
  else
  begin
    Writeln('Ungültiges Gerät ausgewählt!');
    GlobalFree(HGLOBAL(devices)); // Free buffer with RAS devices
    ExitProcess(0);
  end;
  CreatePbkEntry('',
    'Testeintrag',
    Device,
    DeviceType,
    '0193670',
    'msn@easysurfer-power.de',
    'msn'
    );

  Writeln('Press ENTER to quit'); Readln;
end.
Angehängte Dateien
Dateityp: zip minidial_110.zip (19,3 KB, 96x aufgerufen)
  Mit Zitat antworten Zitat