由于要对客户端网络流量进行监控,使用了如下函数:
              RasGetConnectionStatistics
用grep查找,发现ras.h下并没有其定义。我以前的解决办法是直接在其头文件里面加入其定义,结果一点问题也没有!
现在重新装了英文版的VC,于是改成了调用dll, 从网上下了一个程序。
单独测试一点问题也没有!但是集成到系统中却有大问题:
错误如下:
i386/chkesp.c 42 line
错误大意是esp值保存不对,函数调用方式错误,调用了其他的函数指针!下面是我的关键代码:
LPRASDEVINFO lpRasDevInfo;
HINSTANCE hDLLib;      // Handle to DLL. typedef struct _RAS_STATS {
  DWORD   dwSize;
  DWORD   dwBytesXmited;
  DWORD   dwBytesRcved;
  DWORD   dwFramesXmited;
  DWORD   dwFramesRcved;
  DWORD   dwCrcErr;
  DWORD   dwTimeoutErr;
  DWORD   dwAlignmentErr;
  DWORD   dwHardwareOverrunErr;
  DWORD   dwFramingErr;
  DWORD   dwBufferOverrunErr;
  DWORD   dwCompressionRatioIn;
  DWORD   dwCompressionRatioOut;
  DWORD   dwBps;
  DWORD   dwConnectDuration;
} RAS_STATS, *PRAS_STATS;typedef DWORD (*lpfnDllFuncRGCS)(HRASCONN hRasConn,RAS_STATS *lpStatistics);//RasGetConnectionStatistics
typedef DWORD (*lpfnDllFuncRENCS)( LPRASCONN lprasconn, LPDWORD lpcb, LPDWORD lpcConnections );//RasEnumConnectionslpfnDllFuncRGCS lpfnDllFuncConnstat;
lpfnDllFuncRENCS lpfnDllFuncEnumConn;// load function;
hDLLib= LoadLibrary(_T("rasapi32"));
if(!hDLLib)
{
::MessageBox(0,"Error in Loading rasapi32.lib file.","Internet Connection Status",MB_ICONERROR);
PostQuitMessage(0);
}

lpfnDllFuncConnstat = (lpfnDllFuncRGCS)GetProcAddress(hDLLib,"RasGetConnectionStatistics");
if(!lpfnDllFuncConnstat )
{
::MessageBox(0,"Error in Loading RasGetConnectionStatistics funciton.","Internet Connection Status",MB_ICONERROR);
FreeLibrary(hDLLib);
} lpfnDllFuncEnumConn = (lpfnDllFuncRENCS)GetProcAddress(hDLLib,"RasEnumConnectionsA");
if(!lpfnDllFuncEnumConn )
{
::MessageBox(0,"Error in Loading RasEnumConnectionsA funciton.","Internet Connection Status",MB_ICONERROR);
FreeLibrary(hDLLib);
}// 得到流量统计
void CGetStatusDlg::GetConStatus()
{ try
{
RASCONN * lpRasConn;
DWORD     lpcb;
DWORD     lpcConnections; lpRasConn = (LPRASCONN) GlobalAlloc(GPTR, sizeof(RASCONN));
lpRasConn->dwSize = sizeof(RASCONN);
lpcb = sizeof(RASCONN);
 
DWORD nRet = lpfnDllFuncEnumConn(lpRasConn, &lpcb, &lpcConnections);
if (nRet != 0)
{ FreeLibrary(hDLLib);
KillTimer(1);
EndDialog(TRUE);

}
else
{
RAS_STATS *lpStatistics;
lpStatistics= (RAS_STATS *)GlobalAlloc(GPTR, sizeof(RAS_STATS));
lpStatistics->dwSize=sizeof(RAS_STATS);
if(lpRasConn->hrasconn)
{
this->m_connectedto.Format("%s", lpRasConn->szEntryName);

DWORD nR=lpfnDllFuncConnstat(lpRasConn->hrasconn,lpStatistics);
if(nR == ERROR_SUCCESS)
{
this->m_bytesreceived.Format("%d",lpStatistics->dwBytesRcved);
this->m_bytessent.Format("%d",lpStatistics->dwBytesXmited);
this->m_connectionspeed.Format("%d bps",lpStatistics->dwBps); CString strsec;
int nSec = lpStatistics->dwConnectDuration/1000;
nSec %=  60;
int nMin = lpStatistics->dwConnectDuration/60000;
nMin %= 60;
int nHour =lpStatistics->dwConnectDuration/(60000*60);
nHour %= 24;
this->m_connectionduration.Format("%2d hrs : %2d mins : %2d secs",nHour,nMin,nSec); this->m_comprecvd.Format("%d%%",lpStatistics->dwCompressionRatioIn);
this->m_compsent.Format("%d%%",lpStatistics->dwCompressionRatioOut); this->m_framercvd.Format("%d",lpStatistics->dwFramesRcved);
this->m_framesent.Format("%d",lpStatistics->dwFramesXmited);
UpdateData(FALSE);
}
else
{
try
{
FreeLibrary(hDLLib);
KillTimer(1);
EndDialog(TRUE);
}
catch(CException* theException2)
{
theException2->Delete();
}
}
}
else
{
try
{
FreeLibrary(hDLLib);
KillTimer(1);
EndDialog(TRUE);
}
catch(CException* theException)
{
theException->Delete();
}
}
}
}
catch(CException* theException1)
{
theException1->Delete();
}

}错误出现在函数调用的地方。
这种错误我还没有遇到过,什么原因呢?
感觉使用dll总是问题多多,出错也不知道什么原因!

解决方案 »

  1.   

    DWORD RasGetConnectionStatistics(
      HRASCONN hRasConn,       // handle to the connection
      RAS_STATS *lpStatistics  // buffer to receive statistics
    );
    Header: Declared in Ras.h.
      Library: Use Rasapi32.lib.
    ras.h 有定义的
      

  2.   

    我是在老版本的VC6.0下开发,他没有定义,并且我的winver = 0x0401
    我改在VS.net 2003下采用直接调用一点问题都没有!所以,我觉得太怪了!
      

  3.   

    当然有定义了。要不下个PlatformSdk.