Russian Qt Forum
Апрель 25, 2024, 08:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Список RAS подобных соединений...  (Прочитано 4547 раз)
zoro86
Гость
« : Май 24, 2010, 14:04 »

Стаяло задача вытащить список соединений, использую Ras Api...

Код:
#ifdef Q_OS_WIN32
    #include "windef.h"
    #include "winbase.h"
    #include "wingdi.h"
    #include "winuser.h"
    #include "psapi.h"
    #include "winsvc.h"
    #include "shellapi.h"
    #include "ras.h"
    #include "tchar.h"
    #include "raserror.h"
    #include "rasdlg.h"
    #include "winreg.h"
#else
#endif

void rasPrimer()
{

    RASENTRYNAME *lpRasEntryName;
    DWORD cb = 0;
    DWORD cEntries = 0;
    DWORD nRet;
    lpRasEntryName = (LPRASENTRYNAME)GlobalAlloc(GPTR, sizeof(RASENTRYNAME));
    lpRasEntryName->dwSize = sizeof(RASENTRYNAME);
    nRet = RasEnumEntries(NULL, NULL, lpRasEntryName, &cb, &cEntries);
    if (nRet == ERROR_BUFFER_TOO_SMALL)
    {
        lpRasEntryName = (LPRASENTRYNAME)GlobalAlloc(GPTR, cb);
        lpRasEntryName->dwSize = sizeof(RASENTRYNAME);
    }

    // Calling RasEnumEntries to enumerate the phone-book entries
    nRet = RasEnumEntries(NULL, NULL, lpRasEntryName, &cb, &cEntries);

    if (nRet != ERROR_SUCCESS)
    {
        printf("RasEnumEntries failed: Error %d\n", nRet);
    }
    else
    {
        printf("Phone-book entries in the default phone book:\n\n");
        for(int i=0;i < cEntries;i++)
        {
            printf("%s\n",lpRasEntryName->szEntryName);
           
            lpRasEntryName++;
        }
    }
}

дело в том что мне показывает только первую букву моего соединения...

если например beeline то вытаскивает b
Как быть.... Непонимающий
Записан
Friar
Гость
« Ответ #1 : Май 24, 2010, 14:47 »

я бы советовал вместо #include "windef.h" и #include "winbase.h" использовать #include "windows.h", а ниже пример кода.

Код:
qint32 connectionEntries(QStringList& connectionEntries)
{
#ifdef Q_OS_WIN32
    DWORD dwCb = 0;
    DWORD dwRet = ERROR_SUCCESS;
    DWORD dwEntries = 0;
    RASENTRYNAME qwe;
    qwe.dwSize=sizeof(qwe);
    LPRASENTRYNAME lpRasEntryName = &qwe;

    // Call RasEnumEntries with lpRasEntryName = NULL. dwCb is returned with the required buffer size and
    // a return code of ERROR_BUFFER_TOO_SMALL
    dwRet = RasEnumEntries(NULL, NULL, lpRasEntryName, &dwCb, &dwEntries);

    if (dwRet == ERROR_BUFFER_TOO_SMALL)
    {
        // Allocate the memory needed for the array of RAS entry names.
        lpRasEntryName = (LPRASENTRYNAME) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwCb);
        if (lpRasEntryName == NULL)
        {
            qDebug()<<"connectionEntries: HeapAlloc failed!";
            return 0;
        }
        // The first RASENTRYNAME structure in the array must contain the structure size
        lpRasEntryName[0].dwSize = sizeof(RASENTRYNAME);

        // Call RasEnumEntries to enumerate all RAS entry names
        dwRet = RasEnumEntries(NULL, NULL, lpRasEntryName, &dwCb, &dwEntries);

        // If successful, print the RAS entry names
        if (ERROR_SUCCESS == dwRet)
        {
            qDebug()<<"The following RAS entry names were found:";
            for (DWORD i = 0; i < dwEntries; i++)
            {
                qDebug()<<QString("connectionEntries: %1\n").arg(TCHARToQString(&(lpRasEntryName[i].szEntryName)));
                connectionEntries.append(TCHARToQString(&(lpRasEntryName[i].szEntryName)));
            }
        }
        //Deallocate memory for the connection buffer
        HeapFree(GetProcessHeap(), 0, lpRasEntryName);
        lpRasEntryName = NULL;
        return 0;
    }
    else qDebug()<<QString("dwRet=%1").arg(dwRet);

    // There was either a problem with RAS or there are RAS entry names to enumerate
    if(dwEntries >= 1)
    {
        qDebug()<<"connectionEntries: The operation failed to acquire the buffer size.";
    }
    else
    {
        qDebug()<<"connectionEntries: There were no RAS entry names found:.";
    }

    return 0;
#else
    qDebug()<<"Only for Windiws";
    Q_UNUSED(connectionEntries)
    return -1;
#endif
}
Записан
zoro86
Гость
« Ответ #2 : Май 24, 2010, 14:58 »

матюкает на TCHARToQString... и обратно
Записан
Friar
Гость
« Ответ #3 : Май 24, 2010, 15:05 »

пардон

Код:
#ifdef UNICODE
#define QStringToTCHAR(x)     (wchar_t*) x.utf16()
#define PQStringToTCHAR(x)    (wchar_t*) x->utf16()
#define TCHARToQString(x)     QString::fromUtf16((x))
#define TCHARToQStringN(x,y)  QString::fromUtf16((x),(y))
#else
#define QStringToTCHAR(x)     x.local8Bit().constData()
#define PQStringToTCHAR(x)    x->local8Bit().constData()
#define TCHARToQString(x)     QString::fromLocal8Bit((x))
#define TCHARToQStringN(x,y)  QString::fromLocal8Bit((x),(y))
#endif
Записан
zoro86
Гость
« Ответ #4 : Май 24, 2010, 15:11 »

я успел отгуглить
 http://code.google.com/p/qextserialport/source/browse/src/qextserialenumerator_win.cpp?r=81b89662f93ae16626c1651053460c52012cb8b6

там так же..

Код:
#ifdef UNICODE
    #define QStringToTCHAR(x)     (wchar_t*) x.utf16()
    #define PQStringToTCHAR(x)    (wchar_t*) x->utf16()
    #define TCHARToQString(x)     QString::fromUtf16((ushort*)(x))
    #define TCHARToQStringN(x,y)  QString::fromUtf16((ushort*)(x),(y))
#else
    #define QStringToTCHAR(x)     x.local8Bit().constData()
    #define PQStringToTCHAR(x)    x->local8Bit().constData()
    #define TCHARToQString(x)     QString::fromLocal8Bit((x))
    #define TCHARToQStringN(x,y)  QString::fromLocal8Bit((x),(y))
#endif /*UNICODE*/


Смеющийся

терь буду знать.... спасибо большое...

А вот вопросик как список локальных подключений (ЛВС) получить ...
Записан
Friar
Гость
« Ответ #5 : Май 24, 2010, 15:37 »

Тут к сожаления помочь ничем не могу, не стояло такой задачи. :-(
Записан
zoro86
Гость
« Ответ #6 : Май 25, 2010, 07:16 »

Спасибо ... за помощь...

на счет локальных соединений можно в принцепе там пункт добавить Локальное соединение... чтобы было постоянно...
Записан
crackedmind
Гость
« Ответ #7 : Май 26, 2010, 01:39 »

Цитировать
А вот вопросик как список локальных подключений (ЛВС) получить ...
Код:
#include <netcon.h>

void DisableNIC(char* InterfaceName)
{
    INetConnectionManager* pNet;
    INetConnection* pConn;
    IEnumNetConnection* pEnum;
    NETCON_PROPERTIES* pProps;
    wchar_t Temp[255];
    ULONG uCount = 0;

    swprintf(Temp, L"%S", InterfaceName);
    CoInitialize(NULL);
    CoCreateInstance(CLSID_ConnectionManager, NULL, CLSCTX_SERVER, IID_INetConnectionManager, (void**)&pNet);
    pNet->EnumConnections(NCME_DEFAULT, &pEnum);

    while (pEnum->Next(1, &pConn, &uCount) == S_OK)
    {
        pConn->GetProperties( &pProps );
        if (!wcscmp(pProps->pszwName, Temp))
        {
            printf("Found %S\n", pProps->pszwName);
            printf("Going to disable connection now!\n");
            pConn->Disconnect();
            printf("Disabled!");
            CoTaskMemFree(pProps->pszwName);
            CoTaskMemFree(pProps->pszwDeviceName);
            CoTaskMemFree(pProps);
            pConn->Release();
        }
    }
    pEnum->Release();
    pNet->Release();
    CoUninitialize();
}

Надеюсь из кода понятно, что он отключает нужный сетевой интерфейс, предварительно получив список интерфейсов и найдя в нем нас интересующий.

По непонятным причинам данные интерфейсы не описаны в MSDN Грустный Тоже в свое время потратил кучу времени на поиски такого кода Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 20.