Usar una lista de rutas de Client-Specific
En los procedimientos siguientes se describen los pasos para usar las listas de rutas específicas del cliente. El código de ejemplo siguiente muestra cómo implementar el procedimiento.
Para usar esta característica, un cliente debe realizar los pasos siguientes:
- Llame a RtmCreateRouteList para obtener un identificador del administrador de tablas de enrutamiento.
- Llame a RtmInsertInRouteList siempre que el cliente deba agregar una ruta a esta lista.
- Cuando el cliente ya no requiere la lista, debe llamar a RtmDeleteRouteList para quitar la lista.
Si el cliente debe enumerar las rutas de la lista, el cliente debe realizar los pasos siguientes:
- Llame a RtmCreateRouteListEnum para obtener un identificador de enumeración del administrador de tablas de enrutamiento.
- Llame a RtmGetListEnumRoutes para obtener los identificadores de las rutas de la lista.
- Llame a RtmReleaseRoutes para liberar los identificadores cuando ya no sea necesario.
En el código de ejemplo siguiente se muestra cómo crear y usar una lista de rutas específica del cliente.
HANDLE RouteListHandle1;
HANDLE RouteListHandle2;
// Create two entity-specific lists to add routes to
Status = RtmCreateRouteList(RtmRegHandle,
&RouteListHandle1);
// Check Status
//...
Status = RtmCreateRouteList(RtmRegHandle,
&RouteListHandle2);
// Check Status
//...
// Assume you have added a bunch of routes
// by calling RtmAddRouteToDest many times
// with 'RouteListHandle1' specified similar to
// Status = RtmAddRouteToDest(RtmRegHandle,
// ...
// RouteListHandle1,
// ...
// &ChangeFlags);
// Enumerate routes in RouteListHandle1 list
// Create an enumeration on the route list
Status = RtmCreateRouteListEnum(RtmRegHandle,
RouteListHandle1,
&EnumHandle);
if (Status == NO_ERROR)
{
// Allocate space on the top of the stack
MaxHandles = RegnProfile.MaxHandlesInEnum;
RouteHandles = _alloca(MaxHandles * sizeof(HANDLE));
// Note how the termination condition is different
// from other enumerations - the call to the function
// RtmGetListEnumRoutes always returns NO_ERROR
// Quit when you get fewer handles than requested
do
{
// Get next set of routes from the list enumeration
NumHandles = MaxHandles;
Status = RtmGetListEnumRoutes(RtmRegHandle,
EnumHandle,
&NumHandles,
RouteHandles);
for (i = 0; i < NumHandles; i++)
{
Print("Route Handle %5lu: %p\n", i, RouteHandles[i]);
}
// Move all these routes to another route list
// They are automatically removed from the old one
Status = RtmInsertInRouteList(RtmRegHandle,
RouteListHandle2,
NumHandles,
RouteHandles);
// Check Status...
// Release the routes that have been enumerated
RtmReleaseRoutes(RtmRegHandle, NumHandles, RouteHandles);
}
while (NumHandles == MaxHandles);
RtmDeleteEnumHandle(RtmRegHandle, EnumHandle);
}
// Destroy all the entity-specific route lists
// after removing all routes from these lists;
// the routes themselves are not deleted
Status = RtmDeleteRouteList(RtmRegHandle, RouteListHandle1);
ASSERT(Status == NO_ERROR);
Status = RtmDeleteRouteList(RtmRegHandle, RouteListHandle2);
ASSERT(Status == NO_ERROR);