RasEnumConnections返回错误为632的分析
按照MSDN调用RasEnumConnections的例子写成的代码如下:
RASCONN RasConn;
DWORD cb;
DWORD Connections = 0;
RasConn.dwSize = cb = sizeof(RASCONN);
DWORD nRet = RasEnumConnections(&RasConn, &cb, &Connections);
当时一运行,总是返回ERROR_INVALID_SIZE(632)。于是google了一下,CodeProject有人说了这个问题,要把RasConn.dwSize写成0x53c,试了一下不行。在另外一个网站说,要写成0x19c,试了一下居然可以。但是不明白为什么?又MSDN了一下,得到的解释是对于运行在不同版本的Windows,都要按照该版本重新定义WINVER,再重头编译。
在RAS.h中找到了RASCONN的定义,
RASCONNA
{
DWORD dwSize;
HRASCONN hrasconn;
CHAR szEntryName[ RAS_MaxEntryName + 1 ];
#if (WINVER >= 0x400)
CHAR szDeviceType[ RAS_MaxDeviceType + 1 ];
CHAR szDeviceName[ RAS_MaxDeviceName + 1 ];
#endif
#if (WINVER >= 0x401)
CHAR szPhonebook [ MAX_PATH ];
DWORD dwSubEntry;
#endif
#if (WINVER >= 0x500)
GUID guidEntry;
#endif
#if (WINVER >= 0x501)
DWORD dwFlags;
LUID luid;
#endif
};
然后分别把不同WINVER的大小数了一下,
WINDOWSNT4.0(0x400) 0x19c
WINDOWS9x/me 0x2A4
WINDOWS2k 0x2B4
WINDOWSxp/2003 0x2C0
再把Win2k的RasEnumConnections代码整出来,可以处理大小为0x2B4和0x19c,对于其他大小就返回632的错误。Win2003的RasEnumConnections代码,可以处理这四种大小,非以上四种大小才返回632的错误。
现在回想我的问题,全部明白了。我是用VS2003编译的程序,没有定义WINVER,编译器默认就给你定义为0x501,这样sizeof(RASCONN)=0x2c0,而我又是在2k下运行的程序,就得到了632的错误。因此如果不是需要取后面版本的信息,就直接把RasConn.dwSize写成0x19c,就可以做到通用了。