1

正如对MSDN RasEnum 代码的评论,我面临同样的问题:

注释部分中可能对 lpcb 参数不准确。调用 RasEnumConnections 并将 lprasconn 设置为 NULL 以确定所需的缓冲区大小,它似乎不适用于 Window ver < Vista。

我在调用 RasEnumConnections 之前添加了以下两行,它工作正常。这样对吗?如果我错了,请纠正我。

lpRasConn = (LPRASCONN) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwCb); lpRasConn[0].dwSize = sizeof(RASCONN);

请添加您的建议。

#include <windows.h>
#include <stdio.h>
#include "ras.h"
#include "raserror.h"
#pragma comment(lib, "rasapi32.lib")

DWORD __cdecl wmain(){

    DWORD dwCb = 0;
    DWORD dwRet = ERROR_SUCCESS;
    DWORD dwConnections = 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
    /*I ADDED THE BELOW TWO LINES */

    lpRasConn = (LPRASCONN) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwCb);
    lpRasConn[0].dwSize = sizeof(RASCONN);

    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){
            wprintf(L"The following RAS connections are currently active:\n");
            for (DWORD i = 0; i < dwConnections; i++){
                         wprintf(L"%s\n", lpRasConn[i].szEntryName);
                  }
        }
        //Deallocate memory for the connection buffer
        HeapFree(GetProcessHeap(), 0, lpRasConn);
        lpRasConn = NULL;
        return 0;
    }

    // There was either a problem with RAS or there are no connections to enumerate    
    if(dwConnections >= 1){
        wprintf(L"The operation failed to acquire the buffer size.\n");
    }else{
        wprintf(L"There are no active RAS connections.\n");
    }

    return 0;
}
4

1 回答 1

0

Psiphon 项目程序员已经解决了这个问题,请参见源代码323 -394。

贝娄是源代码的第一行:

HRASCONN rasConnection = 0;
RASCONN conn;
memset(&conn, 0, sizeof(conn));
conn.dwSize = sizeof(conn);
LPRASCONN rasConnections = &conn;
DWORD bufferSize = sizeof(conn);
DWORD connections = 0;

DWORD returnCode = RasEnumConnections(rasConnections, &bufferSize, &connections);

// On Windows XP, we can't call RasEnumConnections with rasConnections = 0 because it
// fails with 632 ERROR_INVALID_SIZE.  So we set rasConnections to point to a single
// RASCONN, and we'll always reallocate, even if there is only one RASCONN and the
// first call succeeds.
if (ERROR_SUCCESS == returnCode)
{
    returnCode = ERROR_BUFFER_TOO_SMALL;
}

// NOTE: Race condition where a new connection is added between the buffersize check
//       and the second call.
if (ERROR_BUFFER_TOO_SMALL != returnCode && connections > 0)
{
    my_print(false, _T("RasEnumConnections failed (%d)"), returnCode);
}
else if (ERROR_BUFFER_TOO_SMALL == returnCode && connections > 0)
{
    // See "A fix to work with older versions of Windows"
    if (bufferSize < (connections * sizeof(RASCONN)))
    {
        bufferSize = connections * sizeof(RASCONN);
    }

    // Allocate the memory needed for the array of RAS structure(s).
    rasConnections = (LPRASCONN)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bufferSize);
于 2013-04-22T21:08:50.247 回答