RtmUpdateAndUnlockRoute を使用してルートをインプレースで更新する
次の手順では、ルートの更新に使用する手順の概要を示します。 次のサンプル コードは、 プロシージャを実装する方法を示しています。
ルートを更新するには、クライアントで次の手順を実行する必要があります
RtmLockRoute を呼び出してルートをロックします。 現在、この関数は実際にルートの宛先をロックします。 ルーティング テーブル マネージャーは、ルートへのポインターを返します。
ルートに必要な変更を行うには、手順 1 で取得したルーティング テーブル マネージャーの RTM_ROUTE_INFO 構造へのポインターを使用します。 更新時に変更できるのは 、RTM_ROUTE_INFO 構造体の特定のメンバーのみです。 これらのメンバーは、 ネイバー、 PrefInfo、 EntitySpecificInfo、 BelongsToViews、 NextHopsList です。
Note
クライアントが 近隣 メンバーまたは NextHopsList メンバーに情報を追加する場合、クライアントは RtmReferenceHandles を呼び出して、ルーティング テーブル マネージャーが次ホップ オブジェクトに保持する参照カウントを明示的にインクリメントする必要があります。 同様に、クライアントが NextHopsList メンバーから情報を削除する場合、クライアントは RtmReleaseNextHops を呼び出して参照カウントをデクリメントする必要があります。
RtmUpdateAndUnlockRoute を呼び出して、変更が行われたことをルーティング テーブル マネージャーに通知します。 ルーティング テーブル マネージャーは変更をコミットし、新しい情報を反映するように宛先を更新してから、ルートのロックを解除します。
次のサンプル コードは、ルーティング テーブル内の実際のルート情報へのポインターを使用して、ルートを直接更新する方法を示しています。
Status = RtmLockRoute(RtmRegHandle,
RouteHandle,
TRUE,
TRUE,
&RoutePointer);
if (Status == NO_ERROR)
{
// Update route parameters in place (i.e., directly on
// the routing table manager's copy)
// Update the metric and views of the route
RoutePointer->PrefInfo.Metric = 16;
// Change the views so that the route belongs to only the multicast view
RoutePointer->BelongsToViews = RTM_VIEW_MASK_MCAST;
// Set the entity-specific information to X
RoutePointer->EntitySpecificInfo = X;
// Note that the following manipulation of
// next-hop references is not needed when
// using RtmAddRouteToDest, as it is done
// by the routing table manager automatically
// Change next hop from NextHop1 to NextHop2
NextHop1 = RoutePointer->NextHopsList.NextHop[0];
// Explicitly dereference the old next hop
RtmReleaseNextHops(RtmRegHandle, 1, &NextHop1);
RoutePointer->NextHopsList.NextHop[0] = NextHop2;
// Explicitly reference next hop being added
RtmReferenceHandles(RtmRegHandle, 1, &NextHop2);
// Call the routing table manager to indicate that route information
// has changed, and that its position might
// have to be rearranged and the corresponding destination
// needs to be updated to reflect this change.
Status = RtmUpdateAndUnlockRoute(RtmRegHandle,
RouteHandle,
INFINITE, // Keep forever
NULL,
0,
NULL,
&ChangeFlags);
ASSERT(Status == NO_ERROR);
}