Verwenden einer Client-Specific Routenliste
Die folgenden Verfahren beschreiben die Schritte zur Verwendung der clientspezifischen Routenlisten. Der folgende Beispielcode zeigt, wie die Prozedur implementiert wird.
Um dieses Feature zu verwenden, muss ein Client die folgenden Schritte ausführen:
- Rufen Sie RtmCreateRouteList auf, um ein Handle vom Routingtabellen-Manager abzurufen.
- Rufen Sie RtmInsertInRouteList auf, wenn der Client dieser Liste eine Route hinzufügen muss.
- Wenn der Client die Liste nicht mehr benötigt, sollte er RtmDeleteRouteList aufrufen, um die Liste zu entfernen.
Wenn der Client die Routen in der Liste auflisten muss, sollte der Client die folgenden Schritte ausführen.
- Rufen Sie RtmCreateRouteListEnum auf, um ein Enumerationshandle vom Routingtabellen-Manager abzurufen.
- Rufen Sie RtmGetListEnumRoutes auf, um die Handles für die Routen in der Liste abzurufen.
- Rufen Sie RtmReleaseRoutes auf, um die Handles freizugeben, wenn sie nicht mehr benötigt werden.
Der folgende Beispielcode zeigt, wie Sie eine clientspezifische Routenliste erstellen und verwenden.
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);