65,210
社区成员
发帖
与我相关
我的任务
分享
HRESULT CPortForwardEngine::GetNextMapping( IEnumVARIANT* piEnumerator, CPortForwardEngine::PortMappingContainer& mappingContainer )
{
// uses the enumerator to get the next mapping and fill in a mapping container structure
USES_CONVERSION; // for conversion to CString's
if ( piEnumerator == NULL )
{
return E_FAIL;
}
VARIANT varCurMapping;
VariantInit(&varCurMapping);
HRESULT result = piEnumerator->Next( 1, &varCurMapping, NULL);
if( !SUCCEEDED(result) )
{
return E_FAIL;
}
if ( varCurMapping.vt == VT_EMPTY )
{
return E_FAIL;
}
IStaticPortMapping* piMapping = NULL;
IDispatch* piDispMap = V_DISPATCH(&varCurMapping);
result = piDispMap->QueryInterface(IID_IStaticPortMapping, (void **)&piMapping);
if( !SUCCEEDED(result) )
{
return E_FAIL;
}
// get external address
BSTR bStr = NULL;
result = piMapping->get_ExternalIPAddress( &bStr );
if( !SUCCEEDED(result) )
{
piMapping->Release();
piMapping = NULL;
return E_FAIL;
}
if( bStr != NULL )
mappingContainer.ExternalIPAddress = CString( OLE2T( bStr ) );
SysFreeString(bStr);
bStr = NULL;
// get external port
long lValue = 0;
result = piMapping->get_ExternalPort( &lValue );
if( !SUCCEEDED(result) )
{
piMapping->Release();
piMapping = NULL;
return E_FAIL;
}
mappingContainer.ExternalPort.Format( _T("%d"), lValue );
// get internal port
result = piMapping->get_InternalPort( &lValue );
if( !SUCCEEDED(result) )
{
piMapping->Release();
piMapping = NULL;
return E_FAIL;
}
mappingContainer.InternalPort.Format( _T("%d"), lValue );
// get protocol
result = piMapping->get_Protocol( &bStr );
if( !SUCCEEDED(result) )
{
piMapping->Release();
piMapping = NULL;
return E_FAIL;
}
if( bStr != NULL )
mappingContainer.Protocol = CString( OLE2T( bStr ) );
SysFreeString(bStr);
bStr = NULL;
// get internal client
result = piMapping->get_InternalClient( &bStr );
if( !SUCCEEDED(result) )
{
piMapping->Release();
piMapping = NULL;
return E_FAIL;
}
if( bStr != NULL )
mappingContainer.InternalClient = CString( OLE2T( bStr ) );
SysFreeString(bStr);
bStr = NULL;
// determine whether it's enabled
VARIANT_BOOL bValue = VARIANT_FALSE;
result = piMapping->get_Enabled( &bValue );
if( !SUCCEEDED(result) )
{
piMapping->Release();
piMapping = NULL;
return E_FAIL;
}
mappingContainer.Enabled = CString( ( (bValue==VARIANT_FALSE) ? _T("No") : _T("Yes") ) );
// get description
result = piMapping->get_Description( &bStr );
if( !SUCCEEDED(result) )
{
piMapping->Release();
piMapping = NULL;
return E_FAIL;
}
if( bStr != NULL )
mappingContainer.Description = CString( OLE2T( bStr ) );
SysFreeString(bStr);
bStr = NULL;
// clean up
piMapping->Release();
piMapping = NULL;
VariantClear( &varCurMapping );
return S_OK;
}
for(int i=0;i<n;i++)
{
}
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
do{
//...
}while(false);