Разъединение через RAS
От: Bashtan Украина  
Дата: 12.06.11 16:17
Оценка:
Всем доброе время суток. Есть код и вопрос
Код
//---------------------------------------------------------------------------


#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
#include<conio.h>
#include<windows.h>
#include<iostream.h>
#include<ras.h>
#include "rasdlg.h"
#include "raserror.h"
 RASENTRYNAME rasentry[10];
 RASDIALPARAMS params[10];
 RASDIALDLG tt[10];
 RASCONN ff[10];
 LPRASCONN lpRasConn = NULL;
 RAS_STATS  RASCONSTAT;

int ListConection(){

    DWORD dSize,dNumber,i;

     dSize = sizeof(rasentry);
     rasentry[0].dwSize = sizeof(RASENTRYNAME);
      cout<<"\tВсе соединения на этом компьютере:"<<endl;
     if(RasEnumEntries(NULL,NULL,rasentry,&dSize,&dNumber)==0)
         for (i=0; i < dNumber;i++)
         {

             cout<<rasentry[i].szEntryName<<endl;

         }
         return i;
}

BOOL ConectRAS(colConetction){
int i;
DWORD dwErr = NO_ERROR;
BOOL nRet = FALSE;
HANDLE hHeap = NULL;
LPRASDIALDLG lpInfo = NULL;
cout<<colConetction;
cout<<"\n\tВыполняется подключение через одно из доступных соединений"<<endl;
cout<<"\n\tИмя соединения\t\t\t\tСостояние"<<endl;
 hHeap = GetProcessHeap();
if( NULL == hHeap )
{
dwErr = GetLastError();
printf("GetProcessHeap() failed: Error = %d\n", dwErr);
return dwErr;
}
lpInfo = (LPRASDIALDLG) HeapAlloc( hHeap, HEAP_ZERO_MEMORY, sizeof(RASDIALDLG));
if( NULL == lpInfo )
{
dwErr = ERROR_OUTOFMEMORY;
printf("HeapAlloc() failed\n");
return dwErr;
}
lpInfo->dwSize = sizeof(RASDIALDLG);
for (i = 0; i <3 ; i++) {

printf("%s",rasentry[i].szEntryName);
// Calling RasDialDlg()
nRet = RasDialDlg(NULL,rasentry[i].szEntryName, NULL, lpInfo);
if ( FALSE == nRet)
{
dwErr = lpInfo->dwError;
cout<<"\t\tНе подключено ошибка:";
       cout<<dwErr<<endl;
}
else

cout<<"\t\t\tПодключено";


if (TRUE == nRet)
{if( NULL != lpInfo )
{
HeapFree( hHeap, 0, lpInfo);
}
  break;
}
}}


 BOOL ListCONECTED()
{
DWORD dwCb = 0;
DWORD dwRet = ERROR_SUCCESS;
DWORD dwConnections = 0;
         //Deallocate memory for the connection buffer
        HeapFree(GetProcessHeap(), 0, lpRasConn);
        lpRasConn = NULL;
// Call RasEnumConnections with lpRasConn = NULL. dwCb is returned with the required buffer size and
    // a return code of ERROR_BUFFER_TOO_SMALL
    dwRet = RasEnumConnections(lpRasConn, &dwCb, &dwConnections);

    if (dwRet == ERROR_BUFFER_TOO_SMALL){
        // Allocate the memory needed for the array of RAS structure(s).
        lpRasConn = (LPRASCONN) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwCb);
        if (lpRasConn == NULL){
            wprintf(L"HeapAlloc failed!\n");
            return 0;
        }
        // The first RASCONN structure in the array must contain the RASCONN structure size
        lpRasConn[0].dwSize = sizeof(RASCONN);

        // Call RasEnumConnections to enumerate active connections
        dwRet = RasEnumConnections(lpRasConn, &dwCb, &dwConnections);

        // If successful, print the names of the active connections.
        if (ERROR_SUCCESS == dwRet){
        cout<<"\n\nСписок активных подключений:\n";
            for (DWORD i = 0; i < dwConnections; i++){
                         cout<<lpRasConn[i].szEntryName;

                  }
        }  cout<<sizeof(lpRasConn);


            return dwConnections;
    }

    // There was either a problem with RAS or there are no connections to enumerate
    if(dwConnections >= 1){
    cout<<"\n\nОперация прервана, не удалось определить розмер буфера для структур.\n";
    }else{
        cout<<"\n\nАктивных подключений нет.\n";
    }
    return 0;
}
 BOOL Disconect(i)
{
     DWORD erors,p;

          i=0;

 cout<<"\nРазединение "<<lpRasConn[i].szEntryName<<"...";

      erors=RasHangUp(lpRasConn[i].hrasconn);


Sleep(3000);
if (erors!=ERROR_SUCCESS) {
   cout<<"Ошибка\n";
   cout<<"Номер ошибки "<<erors;

}  else cout<<"Ok";
 }

 void main()
{SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 int colConetction,idConnection,dwConectionActive,i;
 DWORD todaybytes,limbytes;

colConetction=ListConection();

ConectRAS(colConetction);

dwConectionActive=ListCONECTED();

 Sleep(4000);
Disconect(dwConectionActive);


getch();
}

:

1.Так вот. Почему если подключение уже подключено и в диалоговом окне еще раз подключить, то потом при разъединении вродебы разъединено, но на самом деле нет?
2.Функцию по получении активных подключений взял с библиотеки MSDN, но на ХП эта функция не работает, а возвращает ошибку 632-некоректный размер структуры.Там коментах об этом писалось, но я так ничего и не понял?Почему она не работает?Если взять просто масив с ведомым количеством элементов, и убрать все с операции с выделением памяти.

Не судите строго, я только начинаю.Зарание спасибо!!!!!!!!!!



P.S. Буду завтра

14.06.11 12:43: Перенесено из 'C/C++'
с++ ras
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.