Utiliser une liste de routes Client-Specific
Les procédures suivantes décrivent les étapes à suivre pour utiliser les listes de routes spécifiques au client. L’exemple de code qui suit montre comment implémenter la procédure.
Pour utiliser cette fonctionnalité, un client doit effectuer les étapes suivantes
- Appelez RtmCreateRouteList pour obtenir un handle à partir du gestionnaire de tables de routage.
- Appelez RtmInsertInRouteList chaque fois que le client doit ajouter un itinéraire à cette liste.
- Lorsque le client n’a plus besoin de la liste, il doit appeler RtmDeleteRouteList pour supprimer la liste.
Si le client doit énumérer les itinéraires de la liste, il doit effectuer les étapes suivantes
- Appelez RtmCreateRouteListEnum pour obtenir un handle d’énumération à partir du gestionnaire de table de routage.
- Appelez RtmGetListEnumRoutes pour obtenir les handles des itinéraires de la liste.
- Appelez RtmReleaseRoutes pour libérer les handles lorsque vous n’en avez plus besoin.
L’exemple de code suivant montre comment créer et utiliser une liste de routes spécifique au client.
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);