gpt4 book ai didi

c++ - RAS API。 sizeof(RASDIALPARAMS) 是错误的。错误 632

转载 作者:太空宇宙 更新时间:2023-11-04 06:28:56 26 4
gpt4 key购买 nike

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

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) 返回错误大小?怎么可能?

或者我错过了什么?

最佳答案

RASDIALPARAMS 多年来添加了新字段:

#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
};

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

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

如果将 WINVER 设置为高于目标 Windows 版本的值,则可以在运行时检测操作系统版本并将 ras_param.dwSize 设置为适当的size 因为 sizeof(RASDIALPARAMS) 会比 RasSetEntryDialParams() 预期的要大。例如:

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);
}

或者,您可以跳过操作系统检查,只处理 ERROR_INVALID_SIZE 错误:

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;
}

关于c++ - RAS API。 sizeof(RASDIALPARAMS) 是错误的。错误 632,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22836764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com