那位用过RasGetEntryProperties和RasSetEntryProperties两个函数?帮忙看看我的代码错在那里了?

lchy20cn 2003-09-09 09:27:16
#include "Ras.h"

typedef DWORD(*RASGETPRO)(LPCTSTR,LPCTSTR,LPRASENTRY,LPDWORD,LPBYTE,LPDWORD);

RASENTRY Info = {0};
DWORD dwSize,dwDevInfo,code;

dwSize = Info.dwSize = sizeof(RASENTRY);
dwDevInfo = 0;

HINSTANCE hinstLib;
RASGETPRO hsRasGetEntryProperties;
BOOL FreeSuccess,RunTimeLinkSuccess = FALSE;

hinstLib = LoadLibrary("Rasapi32");
if (NULL != hinstLib)
{
hsRasGetEntryProperties = (RASGETPRO)GetProcAddress(hinstLib,"RasGetEntryProperties");
if (NULL != hsRasGetEntryProperties)
{
RunTimeLinkSuccess = TRUE;
//--------------------------------------------------------------
RASENTRY *pRasEntry;
DWORD dw=0;
DWORD ret = (hsRasGetEntryProperties)(NULL, "GPRS", NULL, &dw, NULL, NULL);
// (hsRasGetEntryProperties)(NULL, "GPRS", NULL, &dw, NULL, NULL);
// if(ret == ERROR_BUFFER_TOO_SMALL)
// {
pRasEntry=(RASENTRY *)HeapAlloc(GetProcessHeap(),0,dw);
pRasEntry->dwSize = sizeof(RASENTRY);;
// ret = (hsRasGetEntryProperties)(NULL, "GPRS", pRasEntry, &dw, NULL, NULL);
// if(ret!=NULL)
// {
// GetRasErr(ret);
// return 0;
// }
// }

//--------------------------------------------------------------

}
FreeSuccess = FreeLibrary(hinstLib);
}
else
{
AfxMessageBox("加载DLL失败!");
}
if ( ! RunTimeLinkSuccess )
{
AfxMessageBox("不能确定对应函数地址!");
}


注释部分一放开更是错误重重。现在是运行到DWORD ret = (hsRasGetEntryProperties)(NULL, "GPRS", NULL, &dw, NULL, NULL);这句就出错。



另外我加载自己的测试DLL,却没问题,看来问题出在函数参数设置上,有谁调用过RasGetEntryProperties,和RasSetEntryProperties函数的?请帮忙指点一下。谢谢~!

DLL的CPP中:
int hytestdll( int x )
{
int i=0;
i=x+1;
return i;
}

DLL的DEF中:
LIBRARY FINGER
EXPORTS
………………
hytestdll @4


应用程序的CPP中:
typedef int (*TESTDLLFUN)( int );

HINSTANCE hinstLib;
TESTDLLFUN testdllfunhy;
BOOL FreeSuccess,RunTimeLinkSuccess = FALSE;
int i=5;

hinstLib = LoadLibrary("UserHsRasDll2");
if (NULL != hinstLib)
{
testdllfunhy = (TESTDLLFUN)GetProcAddress(hinstLib,"hytestdll");
if (NULL != testdllfunhy)
{
RunTimeLinkSuccess = TRUE;
i = (testdllfunhy)(i);
switch (i)
{
case 6:
AfxMessageBox("调用成功!");
break;
case 5:
AfxMessageBox("调用失败!");
break;
}
}
FreeSuccess = FreeLibrary(hinstLib);
}
else
{
AfxMessageBox("加载DLL失败!");
}
if ( ! RunTimeLinkSuccess )
{
AfxMessageBox("不能确定对应函数地址!");
}

这是我写的小测试代码,已经在WIN98,VC6下通过
...全文
1140 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingzai 2003-09-16
  • 打赏
  • 举报
回复
查windows帮助可以找到对应的错误解释,我的邮箱akingzai@163.com
lchy20cn 2003-09-16
  • 打赏
  • 举报
回复
能教我怎么查错误信息对应的解释吗?

不如上面我说的返回1784错误,610错误,这些数字都代表着什么?怎么找它们具体的意思呢?
lchy20cn 2003-09-16
  • 打赏
  • 举报
回复
您有信箱吗?方便帮我调试一下吗?我把代码发过去给你。
lchy20cn 2003-09-16
  • 打赏
  • 举报
回复
在WIN98下,按照你的方法,我定义如下:
#define OLDWINVER WINVER
#undef WINVER
#define WINVER 0x400
#include "Ras.h"
并同时把大于0X400版本的成员初始化去掉,能成功编译。

目前有两个问题没弄明白
首先执行RasSetEntryProperties,返回是87,对应的宏是ERROR_INVALID_PARAMETER:
DWORD dwRet=RasSetEntryProperties (NULL, mName, &rasEntry, ENTRYSIZE, NULL, 0);
if (ERROR_INVALID_PARAMETER == dwRet)
{ AfxMessageBox("doesn't contain values for the szDeviceName and szDeviceType members"); }

第二个问题,还是有的返回值的宏我不能用,比如ERROR_BUFFER_INVALID、ERROR_CANNOT_OPEN_PHONEBOOK。这是为什么?
kingzai 2003-09-16
  • 打赏
  • 举报
回复
你如果只使用98支持的参数则可以通用,如果要使用2000的参数则必须在2000系统下编译。换言之,你可能需要编译多个不同的操作系统版本
lchy20cn 2003-09-16
  • 打赏
  • 举报
回复
我在跟踪检查,然后详细累加一下这个结构的总长度。
lchy20cn 2003-09-16
  • 打赏
  • 举报
回复
呀,要这样啊;那不是通用性很不好?我想我的软件能在98、2K、XP下都能运行,用这样的方法就不太好了吧?你看我可不可以这样来解决呢?
OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsVersionInfo); //获取操作系统版本信息
// if(WINVER >= 0X400)// WIN98系统
if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)// WIN98系统
{
rasEntry.dwDialMode = RASEDM_DialAsNeeded;
rasEntry.dwIdleDisconnectSeconds=0;
rasEntry.dwSubEntries=0;
rasEntry.dwDialExtraPercent=0;
rasEntry.dwDialExtraSampleSeconds=0;
rasEntry.dwHangUpExtraPercent=0;
rasEntry.dwHangUpExtraSampleSeconds=0;
}
// if(WINVER >= 0x500)// WIN2K系统
if (OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)// WINNT系统
{
rasEntry.dwDialMode = RASEDM_DialAsNeeded;
rasEntry.dwIdleDisconnectSeconds=0;
rasEntry.dwSubEntries=0;
rasEntry.dwDialExtraPercent=0;
rasEntry.dwDialExtraSampleSeconds=0;
rasEntry.dwHangUpExtraPercent=0;
rasEntry.dwHangUpExtraSampleSeconds=0;
rasEntry.dwType = RASET_Vpn;
rasEntry.dwVpnStrategy=VpnStrategy;
rasEntry.dwCustomAuthKey=600;
GUID guid;
CoCreateGuid(&guid);
rasEntry.guidId=guid;
rasEntry.dwEncryptionType=0;
strcpy(rasEntry.szCustomDialDll,"");
// rasEntry.dwfOptions2=0;
// rasEntry.dwfOptions3=0;
if(WINVER >= 0x501)
{
// rasEntry.dwfOptions2=0;
// rasEntry.dwfOptions3=0;
}

更细的划分可以用这上面的例子,我这样来赋初值可以吗?http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getting_the_system_version.asp
kingzai 2003-09-15
  • 打赏
  • 举报
回复
注意#define WINVER 0x400,比如我在win2000,我定义的就是#define WINVER 0x500,假如你定义0x400结构就可能不对,同样的道理,假如你在98,定义0x500,可能编译不过,主要是结构大小不一致的问题
lchy20cn 2003-09-15
  • 打赏
  • 举报
回复
我已经更新了DUN到1.4版本了。
lchy20cn 2003-09-15
  • 打赏
  • 举报
回复
RasSetEntryProperties函数返回值ERROR_BUFFER_INVALID,ERROR_CANNOT_OPEN_PHONEBOOK,ERROR_INVALID_PARAMETER;前面两个宏我就不能用,为什么?提示说没有定义这个宏。

RasSetEntryProperties函数跟RasSetEntryDialParams函数都能建立拨号连接,我用RasSetEntryDialParams测试了一下。结果还是不正确,错误返回码是610。
这个函数的三个返回值ERROR_BUFFER_INVALID、ERROR_CANNOT_OPEN_PHONEBOOK、ERROR_CANNOT_FIND_PHONEBOOK_ENTRY我都不能用,也是提示没有定义宏。

错误码去那里能对照看具体意思呢?

以下是代码,win98、VC6编译通过。

RASDIALPARAMS dialParm;
DWORD dwError;
char mName[10];
char strPhoneNumber[20];

strcpy (strPhoneNumber, "*99***1#");
strcpy(mName ,"GPRSHY");

dialParm.dwSize = sizeof (RASDIALPARAMS);

strcpy (dialParm.szEntryName, mName);
strcpy (dialParm.szPhoneNumber, strPhoneNumber);
strcpy (dialParm.szCallbackNumber,"");
strcpy (dialParm.szUserName, "");
strcpy (dialParm.szPassword, "");
strcpy (dialParm.szDomain, "");
dwError =RasSetEntryDialParams(NULL, &dialParm, FALSE);

if (dwError)
{
CString str;
str.Format("RasSetEntryDialParams failed. You need DUN 1.2 or better.\n The error code: %d\n",dwError);
AfxMessageBox(str);
}
kingzai 2003-09-15
  • 打赏
  • 举报
回复
Error 1784 is "The supplied user buffer is not valid for the requested
operation."

There is a known WINVER conflict in the RAS header file that effects the
size of certain RAS structures, such as RASCONN and RASENTRY (which is used
by RasSetEntryProperties). At the top of your source file, where you
include the header files, try this known workaround:


#define OLDWINVER WINVER
#undef WINVER
#define WINVER 0x400

#include <ras.h>
// #include any other RAS header you use

#undef WINVER
#define WINVER OLDWINVER
#undef OLDWINVER
lchy20cn 2003-09-15
  • 打赏
  • 举报
回复
kingzai(kingzai)你好,我还是没有调试通过。

我已经更新了SDK,也指定了他们的.H、.LIB路径,并提前顺序了

编译可以通过,但调用到RasSetEntryProperties()函数时就出错,返回错误值为1784。

我把原码贴出来,麻烦你帮看看


//----------------------------------------------------------------
void CDriverDlg::OnButton4()
{

RASENTRY rasEntry;
DWORD dw=sizeof(RASENTRY);
DWORD ret = 0;
char mName[10];
DWORD VpnStrategy = 0;
DWORD RasOptions = 0;//RASEO_UseCountryAndAreaCodes (是否使用区号与拨号属性)
//RASEO_SpecificIpAddr (服务类型->TCP/IP设置->是否指定IP地址项)
//* //RASEO_SpecificNameServers (设置DNS是否选用)
//RASEO_IpHeaderCompression (是否选用IP头指针压缩)
//* //RASEO_RemoteDefaultGateway (是否选用远程网上默认网关)
//RASEO_DisableLcpExtensions (是否决定在PPP里不使用LCP,一般不使用这个选项)
//RASEO_TerminalAfterDial (是否拨号后出现终端窗口<常规->连接方式->设置->选项->连接控制>)
//RASEO_ModemLights (此选项只对WIN2K有效,选用后在任务栏出现一个状态监测器)
//RASEO_SwCompression (是否选用软件压缩<服务器类型->高级选项>)
//RASEO_RequireEncryptedPw (是否选用需要加密的密码<作用是PPP使用PAP明文>)
//RASEO_RequireMsEncryptedPw (是否选用需要微软加密的密码)
//RASEO_RequireDataEncryption (是否选用需要数据加密)
//RASEO_NetworkLogon (此选项对NT/2K没有影响,是否选用登陆网络)
//RASEO_UseLogonCredentials (是否当前用户采用用户名、密码、域等信息进行拨号连接)
//RASEO_PromoteAlternates (是否选用交替号码)

RasOptions = RASEO_SpecificNameServers | RASEO_RemoteDefaultGateway;
VpnStrategy = VS_Default;
strcpy(mName ,"GPRSHY");
// rasEntry Num values
rasEntry.dwSize = sizeof (RASENTRY);
rasEntry.dwfOptions = RasOptions;
rasEntry.dwAlternateOffset = 0;
rasEntry.dwCountryID = 86;//china
rasEntry.dwCountryCode = 86;//china
rasEntry.dwFrameSize = 0;
rasEntry.dwfNetProtocols = RASNP_Ip; // TCP/IP
rasEntry.dwFramingProtocol = RASFP_Ppp; //PPP
rasEntry.dwChannels = 0;
rasEntry.dwReserved1 = 0;
rasEntry.dwReserved2 = 0;

if(WINVER >= 0X400)// WIN98系统
{
rasEntry.dwDialMode = RASEDM_DialAsNeeded;
rasEntry.dwIdleDisconnectSeconds=0;
rasEntry.dwSubEntries=0;
rasEntry.dwDialExtraPercent=0;
rasEntry.dwDialExtraSampleSeconds=0;
rasEntry.dwHangUpExtraPercent=0;
rasEntry.dwHangUpExtraSampleSeconds=0;
if(WINVER >= 0x500)// WIN2K系统
{
rasEntry.dwType = RASET_Vpn;
rasEntry.dwVpnStrategy=VpnStrategy;
rasEntry.dwCustomAuthKey=600;
GUID guid;
CoCreateGuid(&guid);
rasEntry.guidId=guid;
rasEntry.dwEncryptionType=0;
strcpy(rasEntry.szCustomDialDll,"");
// rasEntry.dwfOptions2=0;
// rasEntry.dwfOptions3=0;
if(WINVER >= 0x501)
{
// rasEntry.dwfOptions2=0;
// rasEntry.dwfOptions3=0;
}
}
}

// Strings values
char strPhoneNumber[20];
char strDevType[50];
char strDevName[50];
strcpy (strPhoneNumber, "*99***1#");
strcpy (strDevType, "RASDT_Modem");
strcpy (strDevName, "Hawsna Wireless Modem");
strcpy (rasEntry.szAreaCode, " ");
strcpy (rasEntry.szLocalPhoneNumber, strPhoneNumber);
strcpy (rasEntry.szScript, "");
strcpy (rasEntry.szAutodialDll, "");
strcpy (rasEntry.szAutodialFunc, "");
strcpy (rasEntry.szX25PadType, "");
strcpy (rasEntry.szX25Address, "");
strcpy (rasEntry.szX25Facilities, "");
strcpy (rasEntry.szX25UserData, "");
strcpy (rasEntry.szDeviceType, strDevType);
strcpy (rasEntry.szDeviceName, strDevName);

// IP addresses
RASIPADDR struipaddrDns,struipaddrDnsAlt,struipaddrWins,struipaddrWinsAlt;
struipaddrDns.a = 211;
struipaddrDns.b = 136;
struipaddrDns.c = 20;
struipaddrDns.d = 203;
struipaddrDnsAlt.a = 202;
struipaddrDnsAlt.b = 96;
struipaddrDnsAlt.c = 128;
struipaddrDnsAlt.d = 68;
struipaddrWins.a = 0;
struipaddrWins.b = 0;
struipaddrWins.c = 0;
struipaddrWins.d = 0;
struipaddrWinsAlt.a = 0;
struipaddrWinsAlt.b = 0;
struipaddrWinsAlt.c = 0;
struipaddrWinsAlt.d = 0;
rasEntry.ipaddrDns = struipaddrDns;
rasEntry.ipaddrDnsAlt = struipaddrDnsAlt;
rasEntry.ipaddrWins = struipaddrWins;
rasEntry.ipaddrWinsAlt = struipaddrWinsAlt;


// Call RAS
DWORD dwRet=RasSetEntryProperties (NULL, mName, &rasEntry, sizeof (RASENTRY), NULL, 0);
if (dwRet)//ERROR_INVALID_PARAMETER == dwRet)
{
CString str;
str.Format("RasSetEntryProperties failed %s\n The error code: %d\n", mName,dwRet);
AfxMessageBox(str);
// return FALSE;
}

}

lchy20cn 2003-09-09
  • 打赏
  • 举报
回复
编译出错,凡是在判断系统版本后再定义赋值的结构成员都出错,甚至连一些宏也出错。是什么原因造成的呢?
d:\98\program files\microsoft visual studio\vc98\include\ras.h(587) : see declaration of 'tagRASENTRYA'
E:\workfold\VC\driver\driverDlg.cpp(499) : error C2065: 'RASEDM_DialAsNeeded' : undeclared identifier
E:\workfold\VC\driver\driverDlg.cpp(500) : error C2039: 'dwIdleDisconnectSeconds' : is not a member of 'tagRASENTRYA'
d:\98\program files\microsoft visual studio\vc98\include\ras.h(587) : see declaration of 'tagRASENTRYA'
E:\workfold\VC\driver\driverDlg.cpp(501) : error C2039: 'dwSubEntries' : is not a member of 'tagRASENTRYA'
d:\98\program files\microsoft visual studio\vc98\include\ras.h(587) : see declaration of 'tagRASENTRYA'

………………………………………………………………
lchy20cn 2003-09-09
  • 打赏
  • 举报
回复
感谢kingzai(kingzai) !

问个笨问题,RasGetEntryProperties、RasSetEntryProperties这两个函数可以直接就用吗?不需要加载DLL吗?

在研究中。。。

再次表示感谢!
kingzai 2003-09-09
  • 打赏
  • 举报
回复
notice function params,i think this is the error.this is my example,maybe help you.
// Creates a PhoneBook Entry in the diaulp network
//创建一个VPN拨号连接,注意整个数据结构都必须填充
BOOL CRasLib::CreatePhoneBookEntry(CString& strName,
CString& strPhoneNumber,
CString& strUserName,
CString& strUserPassword,
CString& strDevType,
CString& strDevName,
DWORD VpnStrategy,
DWORD RasOptions)
{

RASENTRY rasEntry;
if (RasValidateEntryName(NULL, strName)!=ERROR_SUCCESS)
{
TRACE ("RasValidateEntryName cannot validate name %s\n", strName);

}
// Num values
rasEntry.dwSize = sizeof (RASENTRY);
rasEntry.dwfOptions = RasOptions;
// rasEntry.dwfOptions = RASEO_RemoteDefaultGateway | RASEO_SpecificNameServers;
rasEntry.dwAlternateOffset = 0;
rasEntry.dwCountryID = 86;//china
rasEntry.dwCountryCode = 86;//china
rasEntry.dwFrameSize = 0;
rasEntry.dwfNetProtocols = RASNP_Ip; // TCP/IP
rasEntry.dwFramingProtocol = RASFP_Ppp; //PPP
rasEntry.dwChannels = 0;
rasEntry.dwReserved1 = 0;
rasEntry.dwReserved2 = 0;
int version=GetSystemVersion();
if(version >= win98)
{
rasEntry.dwDialMode = RASEDM_DialAsNeeded;
rasEntry.dwIdleDisconnectSeconds=0;
rasEntry.dwSubEntries=0;
rasEntry.dwDialExtraPercent=0;
rasEntry.dwDialExtraSampleSeconds=0;
rasEntry.dwHangUpExtraPercent=0;
rasEntry.dwHangUpExtraSampleSeconds=0;
if(version >= win2000)
{
rasEntry.dwType = RASET_Vpn;
rasEntry.dwVpnStrategy=VpnStrategy;
rasEntry.dwCustomAuthKey=600;
GUID guid;
CoCreateGuid(&guid);
rasEntry.guidId=guid;
rasEntry.dwEncryptionType=0;
strcpy(rasEntry.szCustomDialDll,"");
// rasEntry.dwfOptions2=0;
// rasEntry.dwfOptions3=0;
if(version >= winxp)
{
// rasEntry.dwfOptions2=0;
// rasEntry.dwfOptions3=0;
}
}
}
// Strings
strcpy (rasEntry.szAreaCode, " ");
strcpy (rasEntry.szLocalPhoneNumber, strPhoneNumber.GetBuffer(0));
strcpy (rasEntry.szScript, "");
strcpy (rasEntry.szAutodialDll, "");
strcpy (rasEntry.szAutodialFunc, "");
strcpy (rasEntry.szX25PadType, "");
strcpy (rasEntry.szX25Address, "");
strcpy (rasEntry.szX25Facilities, "");
strcpy (rasEntry.szX25UserData, "");
strcpy (rasEntry.szDeviceType, strDevType.GetBuffer(0));
strcpy (rasEntry.szDeviceName, strDevName.GetBuffer(0));

// IP addresses
InitRASIP (rasEntry.ipaddr);
InitRASIP (rasEntry.ipaddrDns);
InitRASIP (rasEntry.ipaddrDnsAlt);
InitRASIP (rasEntry.ipaddrWins);
InitRASIP (rasEntry.ipaddrWinsAlt);

// Call RAS
if (DWORD dwRet=RasSetEntryProperties (NULL, strName, &rasEntry, sizeof (RASENTRY), NULL, 0))
{
CString str;
str.Format("RasSetEntryProperties failed %s\n", strName);
AfxMessageBox(str);
return FALSE;
}
RASDIALPARAMS dialParm;
DWORD dwError;

dialParm.dwSize = sizeof (RASDIALPARAMS);

strcpy (dialParm.szEntryName, strName.GetBuffer(0));
strcpy (dialParm.szPhoneNumber, "");
strcpy (dialParm.szCallbackNumber,"");
strcpy (dialParm.szUserName, strUserName);
strcpy (dialParm.szPassword, strUserPassword);
strcpy (dialParm.szDomain, "");
dwError =RasSetEntryDialParams(NULL, &dialParm, FALSE);

if (dwError)
{
TRACE ("RasSetEntryDialParams failed. You need DUN 1.2 or better.\n");

}
return TRUE;

}
lchy20cn 2003-09-09
  • 打赏
  • 举报
回复
好的,谢谢~~

我这就去更新SDK去
kingzai 2003-09-09
  • 打赏
  • 举报
回复
RasGetEntryProperties可以直接用,这个没什么关系。
注意ras.h的版本时间,我的platform sdk 已经更新过,所以ras.h为最新的头文件。更新后,注意头文件的包括顺序。
lchy20cn 2003-09-09
  • 打赏
  • 举报
回复
我采用你的思路,先判断系统版本后再做赋值,可是编译时候提示出错,在版本判断之前的代码可以编译的。
OSVERSIONINFO OsVersionInfo; OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsVersionInfo);
// WIN98系统
if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
rasEntry.dwDialMode = RASEDM_DialAsNeeded;
rasEntry.dwIdleDisconnectSeconds=0;
………

E:\workfold\VC\driver\driverDlg.cpp(499) : error C2039: 'dwDialMode' : is not a member of 'tagRASENTRYA'
d:\98\program files\microsoft visual studio\vc98\include\ras.h(587) : see declaration of 'tagRASENTRYA'
E:\workfold\VC\driver\driverDlg.cpp(499) : error C2065: 'RASEDM_DialAsNeeded' : undeclared identifier

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧