首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RAS API规模(RASDIALPARAMS)是错误的。误差632

RAS API规模(RASDIALPARAMS)是错误的。误差632
EN

Stack Overflow用户
提问于 2014-04-03 11:49:13
回答 1查看 1.4K关注 0票数 0

我正在Windows 7 x32下使用RAS API。以下函数返回错误632 (ERROR_INVALID_SIZE):

代码语言:javascript
复制
int32_t set_username_passwd(wchar_t *entry_title)
{
    RASDIALPARAMS ras_param;
    ZeroMemory(&ras_param, sizeof(RASDIALPARAMS));
    ras_param.dwSize = sizeof(RASDIALPARAMS);
    memcpy(ras_param.szEntryName, entry_title, wcslen(entry_title));
    memcpy(ras_param.szUserName, L"username", wcslen(L"username"));
    memcpy(ras_param.szPassword, L"password", wcslen(L"password"));
    return RasSetEntryDialParams(0, &ras_param, 0);
}

sizeof(RASDIALPARAMS)返回错误的大小?怎么可能是?

或者我错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-03 23:47:35

多年来,RASDIALPARAMS增加了新的字段:

代码语言:javascript
复制
#define RASDIALPARAMSW struct tagRASDIALPARAMSW
RASDIALPARAMSW
{
    DWORD dwSize;
    WCHAR szEntryName[ RAS_MaxEntryName + 1 ];
    WCHAR szPhoneNumber[ RAS_MaxPhoneNumber + 1 ];
    WCHAR szCallbackNumber[ RAS_MaxCallbackNumber + 1 ];
    WCHAR szUserName[ UNLEN + 1 ];
    WCHAR szPassword[ PWLEN + 1 ];
    WCHAR szDomain[ DNLEN + 1 ];
#if (WINVER >= 0x401) // 95/NT4 and later
    DWORD dwSubEntry;
    ULONG_PTR dwCallbackId;
#endif
#if (WINVER >= 0x601) // Windows 7 and later
    DWORD dwIfIndex;
#endif
};

因此,RASDIALPARAMS的大小取决于RasSetEntryDialParams()所期望的特定版本。但是,应用程序中RASDIALPARAMS的实际大小取决于编译过程中的WINVER定义,如上面所示。

因此,当针对Windows7时,必须将WINVER设置为至少为0x601的值(Windows7为v6.1)。如果使用较低的WINVER值进行编译,那么RASDIALPARAMS的大小将太小,以致于Windows 7无法接受。

如果将WINVER设置为比所针对的Windows版本更高的值,则可以在运行时检测OS版本,并将ras_param.dwSize设置为适当的大小,因为sizeof(RASDIALPARAMS)将大于RasSetEntryDialParams()所期望的大小。例如:

代码语言:javascript
复制
int32_t set_username_passwd(wchar_t *entry_title)
{
    RASDIALPARAMSW ras_param;
    ZeroMemory(&ras_param, sizeof(ras_param));

    OSVERSIONINFO osvi;
    ZeroMemory(&osvi, sizeof(osvi));

    GetVersionEx(&osvi);

    #if (WINVER >= 0x401)
    if ((osvi.dwMajorVersion < 4) ||
       ((osvi.dwMajorVersion == 4) && (osvi.dwMinVersion < 1)) )
    {
        ras_param.dwSize = offsetof(RASDIALPARAMSW, dwSubEntry);
    }
    else
    #endif
    #if (WINVER >= 0x601)
    if ((osvi.dwMajorVersion < 6) ||
       ((osvi.dwMajorVersion == 6) && (osvi.dwMinVersion < 1)) )
    {
        ras_param.dwSize = offsetof(RASDIALPARAMSW, dwIfIndex);
    }
    else
    #endif
    {
        ras_param.dwSize = sizeof(ras_param);
    }

    wcsncpy(ras_param.szEntryName, entry_title, RAS_MaxEntryName);
    wcsncpy(ras_param.szUserName, L"username", UNLEN);
    wcsncpy(ras_param.szPassword, L"password", PWLEN);

    return RasSetEntryDialParamsW(0, &ras_param, 0);
}

或者,您可以跳过OS检查,只需处理ERROR_INVALID_SIZE错误:

代码语言:javascript
复制
int32_t set_username_passwd(wchar_t *entry_title)
{
    RASDIALPARAMSW ras_param;
    ZeroMemory(&ras_param, sizeof(ras_param));

    ras_param.dwSize = sizeof(ras_param);
    wcsncpy(ras_param.szEntryName, entry_title, RAS_MaxEntryName);
    wcsncpy(ras_param.szUserName, L"username", UNLEN);
    wcsncpy(ras_param.szPassword, L"password", PWLEN);

    DWORD dwRet = RasSetEntryDialParamsW(0, &ras_param, 0);
    #if (WINVER >= 0x601)
    if (dwRet == ERROR_INVALID_SIZE)
    {
        ras_param.dwSize = offsetof(RASDIALPARAMSW, dwIfIndex);
        dwRet = RasSetEntryDialParamsW(0, &ras_param, 0);
    }
    #elif (WINVER >= 0x401)
    if (dwRet == ERROR_INVALID_SIZE)
    {
        ras_param.dwSize = offsetof(RASDIALPARAMSW, dwSubEntry);
        dwRet = RasSetEntryDialParamsW(0, &ras_param, 0);
    }
    #endif

    return dwRet;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22836764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档