Verwendung der RASApi32.dll [ERLEDIGT]

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Verwendung der RASApi32.dll [ERLEDIGT]

Beitrag von Rolf »

Hallo

RAS steht für Remote-Access-Service und kann über die CMD mit rasDial und rasPhone aufgerufen werden. Soviel weiß ich erst einmal. Ziel ist ein Programm welches folgende Schritte durchführt.

1.) prüfen ob Verbindung besteht (z.B. alle 30 Minuten)
2.) ggf. DFÜ aufbauen
... Synchronisation
3.) DFÜ trennen (nach ca. einer Minute)

Ich habe schon Versuche mit Runshell durchgeführt doch es erscheint immer ein kleines schwarzes Fenster was wieder verschwindet. Dabei handelt es sich nicht um ein CMD sondern es liegt wohl an der Exe selbst.

Code: Alles auswählen

xReturn := RunShell( "rasphone.exe" )
Nun hab ich im Internet nach der Dll gesucht um es direkt in xBase einzubinden. Doch da komme ich an meine Grenzen.
Unter http://www.vb-fun.de/cgi-bin/loadframe. ... 0130.shtml gibt es ein
VB- Beispiel wie man den Status abfragen kann.
Könnte mir jemand bitte die Parameterübergabe übersetzen.
oder hat das ggf. schon jemand umgesetzt.

Vielen Dank
Rolf
Zuletzt geändert von Rolf am Di, 29. Sep 2009 17:02, insgesamt 1-mal geändert.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Verwendung der RASApi32.dll

Beitrag von AUGE_OHR »

hi,
Rolf hat geschrieben:1.) prüfen ob Verbindung besteht (z.B. alle 30 Minuten)
2.) ggf. DFÜ aufbauen
... Synchronisation
3.) DFÜ trennen (nach ca. einer Minute)
hm ... DFÜ Verbindung ... ISDN/Modem ? oder eine Internet Verbindung ?
und was verstehst du unter "... Synchronisation" ?

Ich sage mal so : kannst du das was du vorhast mit Windows "Bordmitteln" machen ?
Wenn ja "könnte" es mit API Aufrufen klappen, aber ich "denke" das du wohl eher eine COM LIB,
wie SEE4XB (http://www.marshallsoft.com) oder Xb2Net (http://www.xb2.net)

so und hier nur mal paar Antworten :

Code: Alles auswählen

DLLFUNCTION InternetGetConnectedState( @dwFlags,nReserved )  USING STDCALL FROM WININET.DLL
DLLFUNCTION RasDialA(Extensions,Phonbook,@CallingParam,nType,nHandler,@nConnHandle)USING STDCALL FROM RASAPI32.DLL
DLLFUNCTION RasHangUpA(nConnHandle)                          USING STDCALL FROM RASAPI32.DLL
DLLFUNCTION RasGetErrorStringA(nNr,@buf,nLen)                USING STDCALL FROM RASAPI32.DLL
DLLFUNCTION RasGetEntryDialParamsA(PhonBook,@EntryBuf,@lPwd) USING STDCALL FROM RASAPI32.DLL
DLLFUNCTION inet_addr( cIP  )                                USING STDCALL FROM wsock32.dll
DLLFUNCTION IcmpCreateFile(  )                               USING STDCALL FROM icmp.dll
DLLFUNCTION IcmpCloseHandle( IcmpHandle  )                   USING STDCALL FROM icmp.dll
DLLFUNCTION IcmpSendEcho( IcmpHandle , DestinationAddress, RequestData, RequestSize, RequestOptions, ReplyBuffer, ReplySize, Timeout ) USING STDCALL FROM icmp.dll
DLLFUNCTION WSAGetLastError(  )                              USING STDCALL FROM wsock32.dll


* Ras Dial
* Parametros :  cEntry = Nombrel del dial up
*               cPhone = Telefono del servidor o web server
*               cCallBack = Nose
*               cUserName = Nombre del usuario
*               cPassword = palabra clave del usuario
*               cDomain   = Nombre del dominio si es NT o Win2003 Server

FUNCTION RasDial ( cEntry, cPhone, cCallBack, cUserName, cPassword,cDomain )    // Rasverbindung öffnen
* Begin

  #define RAS_MaxEntryName      256
  #define RAS_MaxPhoneNumber    128
  #define RAS_MaxCallbackNumber 128
  #define UNLEN                 256
  #define PWLEN                 256
  #define DNLEN                 15

  LOCAL rasHandle := 0
  LOCAL erg
  LOCAL aDialParam
  LOCAL cDialParam
  LOCAL cBuf

  IF !EMPTY(cEntry)
    cEntry    = PADR(IIF(cEntry=NIL,'',cEntry),RAS_MaxEntryName+1,CHR(0))

    IF cPhone <> NIL
      cPhone    = PADR(IIF(cPhone=NIL,'',cPhone),RAS_MaxPhoneNumber+1,CHR(0))
      cCallBack = PADR(IIF(cCallBack=NIL,'',cCallBack),RAS_MaxCallbackNumber+1,CHR(0))
      cUserName = PADR(IIF(cUserName=NIL,'',cUserName),UNLEN+1,CHR(0))
      cPassword = PADR(IIF(cPassword=NIL,'',cPassword),PWLEN+1,CHR(0))
      cDomain   = PADR(IIF(cDomain=NIL,'',cDomain),DNLEN+1,CHR(0))

      aDialParam = BaInit(7)
      // DialParameter
      BaStruct(aDialParam,1052)                         // Size
      BaStruct(aDialParam,cEntry)                       // Entry
      BaStruct(aDialParam,cPhone)                       // Phone
      BaStruct(aDialParam,cCallBack)                    // Callbacknumber
      BaStruct(aDialParam,cUserName)                    // Username
      BaStruct(aDialParam,cPassword)                    // Password
      BaStruct(aDialParam,cDomain)                      // Domain
      cDialParam = BaAccess(aDialParam)
    ELSE
      cDialParam = RasGetEntryDialParamsA( , cEntry )   // Entryparameter holen
    ENDIF
    erg = RasDialA(0,0,@cDialParam,0,0,@rasHandle)
    RASERROR(erg,rasHandle,@cBuf)
  ENDIF

RETURN {iif(erg=0,.T.,.F.), rasHandle ,cBuf }

PROCEDURE RasHangUp ( rasHandle )
* Begin
  IF valtype( rasHandle ) == 'N'
    IF rasHandle > 0
      RasHangUpA(rasHandle)
    ENDIF
  ENDIF
RETURN

PROCEDURE RasError ( nNr, rasHandle  , cBuf )
* Begin
  LOCAL erg
    cBuf := space(256)
    erg := RasGetErrorStringA(nNr,@cbuf,256)

  IF nNr <> 0
    IF erg <> 0
      oGet:SetData( "No Conectando:"+STRZERO(nNr,3)+"-"+TRIM(ConvToOEMCP(cbuf)))
    ELSE
      oGet:SetData( "Conectando:"+STRZERO(nNr,3)+"-"+TRIM(ConvToOEMCP(cbuf)))
    ENDIF
    IF rasHandle <> NIL
      RasHangUp(rasHandle)
    ENDIF
  ENDIF
RETURN

FUNCTION RasActive(aConn)
* Begin
  LOCAL nDll,aRasPm:=BaInit(5),cRasPm,nLenBuf:=412,nNumCon:=0
  LOCAL nHnd,cEntry,nI
  aConn:={}
  BaStruct(aRasPm,l2bin(412))
  BaStruct(aRasPm,l2bin(0))
  BaStruct(aRasPm,Space(257))
  BaStruct(aRasPm,Space(17))
  BaStruct(aRasPm,Space(129))
  cRasPm:=BaAccess(aRasPm)
  IF ( nDll:=DllLoad("RASAPI32.DLL") )==0
   RETURN ( .F. )
  ENDIF
  IF DllCall(nDll,DLL_STDCALL,"RasEnumConnectionsA",@cRasPm,@nLenBuf,@nNumCon)==0
  ELSEIF nNumCon<>0
   aRasPm:=BaInit(5)
   FOR nI:=1 TO nNumCon
      BaStruct(aRasPm,l2bin(412))
      BaStruct(aRasPm,l2bin(0))
      BaStruct(aRasPm,Space(257))
      BaStruct(aRasPm,Space(17))
      BaStruct(aRasPm,Space(129))
   NEXT nI
   cRasPm:=BaAccess(aRasPm)
   nNumCon:=0
  ENDIF
  DllUnLoad(nDll)
  FOR nI:=1 TO nNumCon
   BaExtract(aRasPm,cRasPm)
   nHnd:=bin2l(BaExtract(aRasPm,cRasPm))
   cEntry:=BaExtract(aRasPm,cRasPm)
   cEntry:=subs(cEntry,1,at(chr(0),cEntry)-1)
   AAdd(aConn,{cEntry,nHnd})
  NEXT nI
RETURN ( .T. )

FUNCTION RasEntries(aEnt)
* Begin
  LOCAL nDll,aRasPm:=BaInit(2),cRasPm,nLenBuf:=264,nNumCon:=0,nI,cEntry
  aEnt:={}
  BaStruct(aRasPm,l2bin(264))
  BaStruct(aRasPm,Space(260))
  cRasPm:=BaAccess(aRasPm)
  IF ( nDll:=DllLoad("RASAPI32.DLL") )==0
   RETURN ( .F. )
  ENDIF
  IF DllCall(nDll,DLL_STDCALL,"RasEnumEntriesA",0,0,@cRasPm,@nLenBuf,@nNumCon)==0
  ELSEIF nNumCon<>0
   aRasPm:=BaInit(nNumCon*2)
   FOR nI:=1 TO nNumCon
      BaStruct(aRasPm,l2bin(264))
      BaStruct(aRasPm,Space(260))
   NEXT nI
   cRasPm:=BaAccess(aRasPm)
   nNumCon:=0
   DllCall(nDll,DLL_STDCALL,"RasEnumEntriesA",0,0,@cRasPm,@nLenBuf,@nNumCon)
ENDIF
DllUnLoad(nDll)
FOR nI:=1 TO nNumCon
   BaExtract(aRasPm,cRasPm)
   cEntry:=BaExtract(aRasPm,cRasPm)
   cEntry:=subs(cEntry,1,at(chr(0),cEntry)-1)
   AAdd(aEnt,cEntry)
NEXT nI
RETURN ( .T. )

FUNCTION Ping()
* Begin
  LOCAL IcmpHandle,Replicas
  LOCAL RequestData:="Esto es un ping" , RequestSize:=15, RequestOptions:="", ReplyBuffer:=space(278), ReplySize:=278, Timeout:=500

  PARA DestinationAddress

  DestinationAddress:=left(alltrim(DestinationAddress)+space(15),15)

  IcmpHandle:=IcmpCreateFile()

  Replicas := IcmpSendEcho(IcmpHandle, inet_addr(DestinationAddress), RequestData, RequestSize,0, ReplyBuffer, ReplySize, Timeout)
  IcmpCloseHandle(IcmpHandle)

RETURN iif( replicas > 0 , .T. , .F. )
gruss by OHR
Jimmy
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Re: Verwendung der RASApi32.dll

Beitrag von Rolf »

Hallo Jimmy,

wir haben einen Kunden der hat zwei Standorte auf dem einen geht DSL auf dem anderen nicht (höchsten UMTS). Aber da man dort keine "feste" IP bekommt sondern nur eine Vorgegaukelte sind wir auf ISDN umgeschwenkt. Also "DFÜ" -> [ISDN-Karte]----------[ISDN-Karte] -> "Eingehende Verbindung aktzeptieren" und schon hat man eine 64kBit/s Leitung.

Wir synchronisieren nur minimale Daten über "DropBox" nicht unsere ganze Anwendung, die läuft auf beiden Standorten lokal, aber der Terminplan soll schon von beiden verwaltet werden.

Danke schon mal, ich werde die Funktionen probieren und meld mich wieder
Liebe Grüße
Rolf
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Re: Verwendung der RASApi32.dll

Beitrag von Rolf »

ich hab mir nun die Bap182.zip von Alaska runtergeladen
*.dll und *.ch ins Projekt übernommen und fing an zu testen.

Der Aufruf:

Code: Alles auswählen

xReturn := RasDial( "User1_Anrufen", "46", NIL, "User1", "1", NIL )
funktioniert ohne Probleme. Aber ich müsste in einer INI das Passwort hinterlegen. Was ich nur im Notfall machen möchte.

Aber der Aufruf:

Code: Alles auswählen

xReturn := RasDial( "User1_Anrufen" )
springt in den anderen If-Zweig und wirft mir eine xppError.log mit falschen Parameter in der Dll.
In der folgenden Zeile

Code: Alles auswählen

cDialParam = RasGetEntryDialParamsA( ,cEntry )
Nach der Suche im Internet hab ich folgende Zeile gefunden:

Code: Alles auswählen

RasGetEntryDialParams(NULL, &pRasDialParams, &blPw)
Deshalb hab ich den Quellcode im ELSE-Zweig wie folgt umgestellt.

Code: Alles auswählen

          cPhone    = PADR(IIF(cPhone=NIL,'',cPhone),RAS_MaxPhoneNumber+1,CHR(0))
          cCallBack = PADR(IIF(cCallBack=NIL,'',cCallBack),RAS_MaxCallbackNumber+1,CHR(0))
          cUserName = PADR(IIF(cUserName=NIL,'',cUserName),UNLEN+1,CHR(0))
          cPassword = PADR(IIF(cPassword=NIL,'',cPassword),PWLEN+1,CHR(0))
          cDomain   = PADR(IIF(cDomain=NIL,'',cDomain),DNLEN+1,CHR(0))

          aDialParam = BaInit(7)
          // DialParameter
          BaStruct(aDialParam,1052)                         // Size
          BaStruct(aDialParam,cEntry)                       // Entry
          BaStruct(aDialParam,cPhone)                       // Phone
          BaStruct(aDialParam,cCallBack)                    // Callbacknumber
          BaStruct(aDialParam,cUserName)                    // Username
          BaStruct(aDialParam,cPassword)                    // Password
          BaStruct(aDialParam,cDomain)                      // Domain
          cDialParam = BaAccess(aDialParam)
          bPW := .T.
          //cDialParam = RasGetEntryDialParamsA( ,cEntry )
          cDialParam = RasGetEntryDialParamsA( ,@cDialParam, @bPW )   // Entryparameter holen
Problem, jetzt bekomme ich einen RASERROR: "632 Eine ungültige Strukturgröße wurde entdeckt".

Frage wie ist den die richtige Größe oder wie muss die Struktur aussehen??

Liebe Grüße
Rolf
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Verwendung der RASApi32.dll

Beitrag von AUGE_OHR »

hi,

versuche es hiermit mal:

Code: Alles auswählen

// Connecting...
// RasDial( <Entry Name> , <User-ID> , <PassWord> )  -->  {nError,nHandle}

#include "Dll.ch"

FUNCTION RasDial(cEntry,cUser,cPwd)
local nDll,nHnd:=0,aRasPm:=BaInit(7),cRasPm,nError
BaStruct(aRasPm,l2bin(1052))
BaStruct(aRasPm,PadR(cEntry,257,chr(0)))
BaStruct(aRasPm,PadR("",129,chr(0)))
BaStruct(aRasPm,PadR("",129,chr(0)))
BaStruct(aRasPm,PadR(cUser,257,chr(0)))
BaStruct(aRasPm,PadR(cPwd,257,chr(0)))
BaStruct(aRasPm,PadR("",16,chr(0)))
cRasPm:=BaAccess(aRasPm)
if ( nDll:=DllLoad("RASAPI32.DLL") )==0
   return ( 0 )
endif
nError := DllCall(nDll,DLL_STDCALL,"RasDialA",0,0,cRasPm,0,0,@nHnd)
DllUnLoad(nDll)
return ( {nError, nHnd} )
gruss by OHR
Jimmy
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Re: Verwendung der RASApi32.dll

Beitrag von Rolf »

Hi Jimmy ich meinte nicht die Funktion "RasdialA" sondern "RasGetEntryDialParamsA" da ich ja wie gesagt eigentlich nicht das Password in einer cfg stehen haben wollte. Naja aus Zeitdruck steht es jetzt doch in einer cfg-Datei. :x
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Verwendung der RASApi32.dll

Beitrag von brandelh »

Rolf hat geschrieben:Naja aus Zeitdruck steht es jetzt doch in einer cfg-Datei. :x
Verschlüssle es und nehme einen anderen Namen ;-)

statt einer INI-Datei mit Klartext:
[Kennwort]
RAS=Mein Kennwort
habe ich eine Datei generiert, die viele zufällige HEX Zeichen enthielt (HEX-MÜLL)
diese wurde benannt nach Anwendungsname.DLL

Code: Alles auswählen

93AED32SD... HEXMÜLL ...646464....HEXMÜLL...
                                   -------  AscII Code für Kennwort -> AA...
Egal wie man das Kennwort und eventuelle Lizenzinfos verschlüsselt, einfach genug
Müll drum herum und es ist ziemlich sicher :-) ... solange man es nicht mit dem Geheimdienst zu tun hat. 8)

PS: wenn man die Tools hat kann man natürlich auch die Funktion crypt() dafür nutzen.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Verwendung der RASApi32.dll

Beitrag von AUGE_OHR »

hi,
Rolf hat geschrieben:Hi Jimmy ich meinte nicht die Funktion "RasdialA" sondern "RasGetEntryDialParamsA" da ich ja wie gesagt eigentlich nicht das Password in einer cfg stehen haben wollte. Naja aus Zeitdruck steht es jetzt doch in einer cfg-Datei. :x
Es ist eine andere Funktion die eine andere API aufruft,ohne "RasGetEntryDialParamsA" ,aber das Ergebniss sollte das selbe sein ... er sollte wählen.

das Passwort wird doch per Parameter übergeben, deshalb verstehe ich nicht von welchen *.CFG oder *.INI du redest ... :-k
gruss by OHR
Jimmy
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Re: Verwendung der RASApi32.dll

Beitrag von Rolf »

@ Hubert
Ja das dachte ich mir auch. Welche Bitverschiebung und welches Zeichen, die Mühe macht sich niemand, vor allen Dingen für ein Programm was bisher nur einmal eingesetzt wird.

@ Jimmy
AUGE_OHR hat geschrieben:das Passwort wird doch per Parameter übergeben, deshalb verstehe ich nicht von welchen *.CFG oder *.INI du redest ... :-k
Der Paramter muss ja auch irgendwo her kommen. Und wenn der Anwender den nicht immer eingeben soll dann aus einer *.cfg oder *.ini in welcher Form dies dann auch geschieht.

Unter http://www.bytesandmore.de/rad/index.ht ... c08015.php bin ich auf eine C++ - Codestück gestoßen das mich hoffen ließ irgendwie ein Password zurück zu bekommen. Mit dem ich dann einfach die Verbindung starten könnte.

Code: Alles auswählen

bool RasDial(AnsiString slEntry)
{
  RASDIALPARAMS pRasDialParams;
  BOOL blPw = true;
  HRASCONN hndConnection = NULL;
  DWORD dwError = 0;
  // RASDIALPARAMS-Struktur füllen:
  ::ZeroMemory(&pRasDialParams, sizeof(pRasDialParams));
  pRasDialParams.dwSize = sizeof(RASDIALPARAMS);
  strcpy(pRasDialParams.szEntryName, slEntry.c_str());
  if(RasGetEntryDialParams(NULL, &pRasDialParams, &blPw))
    return false;
  if(!blPw) // falls Kennwort nicht gespeichert, fragen:
  {
    AnsiString slPw = InputBox("Daten nicht vollständig",
      "Kennwort für die Verbindung \"" + slEntry + "\" eingeben:","");
    if(slPw !=EmptyStr) strcpy(pRasDialParams.szPassword, slPw.c_str());
    else return false;
  }
  // Einwählen_
  dwError = ::RasDial(NULL, NULL, &pRasDialParams, 0,
    NULL, &hndConnection);
  if(dwError) return false;
  else return true;
}
Aber wie gesagt die Zeit fehlte für weitere Versuche deshalb *.cfg. Das Testprogramm läuft schon und Morgen ist Praxistest :shock:
Liebe Grüße
Rolf
Antworten