RAS - Verbindungen kontrollieren



  • hallo

    also ich schreibe gerade ein kleines server-programm und dieses soll mir die zur verfügung stehenden RasEntries anzeigen (1),zu einer bestimmten zeit feststellen, ob eine dsl verbindung besteht (2) und diese dann eventuell trennnen (3) bzw. eine verbindung herstellen (4).

    sind folgende befehle dafür richtig?
    zu 1) RasEnumEntries
    zu 2) RasEnumConnections
    zu 3) RasHangUp
    zu 4) RasDial

    ich hab mir schon in der MSDN die beispiele angeschaut und versucht diese in mein Programm zu integrieren, allerdings ohne erfolg.
    ich habe hier im forum aber schon ausführliche beschreibungen und beispiele gesehen, nur finde ich diese - wegen der fehlenden suchfunktion - nicht mehr.
    bin auch schon mit google über die seite gegangen ---> leider nix gefunden.

    hat vielleicht jemand einen gut kommentierten beispielcode dazu oder einen link zu den alten beiträgen?

    danke
    slower



  • hier ist mal mein testcode, welchen ich aus der MSND habe:

    #include <windows.h>
    #include <ras.h>
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        DWORD dwCb = sizeof(RASENTRYNAME);
        DWORD dwErr = ERROR_SUCCESS;
        DWORD dwRetries = 5;
        DWORD dwEntries = 0;
        RASENTRYNAME* lpRasEntryName = NULL;
    
        //
        // Loop through in case the information from RAS changes between calls.
        //
        while (dwRetries--)
        {
            //
            // If the memory is allocated, free it.
            //
            if (NULL != lpRasEntryName)
            {
                HeapFree(GetProcessHeap(), 0, lpRasEntryName);
                lpRasEntryName = NULL;
            }
            //
            // Allocate the size need for the RAS structure.
            //
            lpRasEntryName = HeapAlloc(GetProcessHeap(), 0, dwCb);
            if (NULL == lpRasEntryName)
            {
                dwErr = ERROR_NOT_ENOUGH_MEMORY;
                break;
            }
            //
            // Set the structure size for version checking purposes.
            //
            lpRasEntryName->dwSize = sizeof(RASENTRYNAME);
            //
            // Call the RAS API, bail on the loop if we are successful or an unknown
            // error occurs.
            //
            dwErr = RasEnumEntries(
                        NULL,
                        NULL,
                        lpRasEntryName,
                        &dwCb,
                        &dwEntries);
            if (ERROR_BUFFER_TOO_SMALL != dwErr)
            {
                break;
            }
        }
        //
        // In the success case print the names of the entries.
        //
        if (ERROR_SUCCESS == dwErr)
        {
            DWORD i;
    
            printf("Phone-book entries in the default phone book:\n\n");
            for (i = 0; i < dwEntries; i++)
            {
                printf("%s\n", lpRasEntryName[i]->szEntryName);
            }
        }
        else
        {
            printf("RasEnumEntries failed: Error = %d\n", dwErr);
        }
        //
        // Free the memory if necessary.
        //
        if (NULL != lpRasEntryName)
        {
            HeapFree(GetProcessHeap(), 0, lpRasEntryName);
            lpRasEntryName = NULL;
        }
    
      system("PAUSE");	
      return 0;
    }
    

    die RASAPI32.Lib habe ich gelinkt
    ich benutze DevC++ und bekomme folgende Fehlermeldungen:

    31 ANSI C++ forbids implicit conversion from `void *' in assignment
    in zeile:

    lpRasEntryName = HeapAlloc(GetProcessHeap(), 0, dwCb);
    

    51 `ERROR_BUFFER_TOO_SMALL' undeclared (first use this function)
    in zeile:

    if (ERROR_BUFFER_TOO_SMALL != dwErr)
    

    66 base operand of ->' has non-pointer typetagRASENTRYNAMEA'
    in zeile:

    printf("%s\n", lpRasEntryName[i]->szEntryName);
    

    wäre echt dankbar, wenn mir hier wer helfen könnte.

    danke slower



  • Hallo,

    31 ANSI C++ forbids implicit conversion from `void *' in assignment

    in C++ benötigt man einen cast auf den Ziel-Datentyp. Da dein Test-Code aber nur reine C-Sprachelemente beinhaltet, könntest du auch das Programm unter DevC++ mit dem C-Compiler kompilieren lassen, denn unter C ist kein cast nötig, allerdings weiß ich nicht, ob und wie man DevC++ dazu bringen kann, daß der C-Compiler angeworfen wird.

    51 `ERROR_BUFFER_TOO_SMALL' undeclared (first use this function)

    includiere zusätzlich <raserror.h>:

    #include <windows.h>
    #include <ras.h>
    #include <raserror.h>
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    

    66 base operand of ->' has non-pointer typetagRASENTRYNAMEA'

    richtig muß die bemängelte Zeile so lauten:

    printf("%s\n", lpRasEntryName[i].szEntryName);
    

    MfG



  • danke dir, fehler 2 und 3 sind jetzt eliminiert!

    also reines C macht sich schlecht bei meinem programm. kannst du mir das mit dem cast am beispiel erklären, hab schon versucht dazu was zu finden, leider bin ich da nicht weitergekommen.



  • also Casten ist eine grundsätzliche "Technik", die dir schon mindestens einmal begegnet sein sollte. Im folgenden der C-Style-Cast für die Problemzeile:

    lpRasEntryName = (RASENTRYNAME*) HeapAlloc(GetProcessHeap(), 0, dwCb);
    

    also einfach den Datentyp, der auf der linken Seite der Zuweisung steht, in Klammern vor die Anweisung (die hier eben einen, im C++-Fall, unpassenden LPVOID zurückgibt) stellen.

    Falls dich die C++-Lösung interessiert:

    lpRasEntryName = reinterpret_cast<RASENTRYNAME*>(HeapAlloc(GetProcessHeap(), 0, dwCb));
    

    hier steht der Zieldatentyp immer in spitzen Klammern

    MfG



  • vielen dank nochmal
    👍
    habs verstanden und es funktioniert auch


Anmelden zum Antworten