Winapi.Mtx.SafeRef
Delphi
function SafeRef(const rid: TGUID; Unk: IUnknown): Pointer;
プロパティ
種類 | 可視性 | ソース | ユニット | 親 |
---|---|---|---|---|
function | public | Winapi.Mtx.pas | Winapi.Mtx | Winapi.Mtx |
説明
オブジェクトによって,コンテキストの外部に安全に渡すことができるトランザクションオブジェクトへの参照を返します。
SafeRef 関数は,以下のものを渡す SafeRef MTS 関数をカプセル化します。
現在のオブジェクトがほかのオブジェクトまたはクライアントへ渡したいインターフェース(rid)のインターフェース ID への参照
and
現在のオブジェクト(pUnk)のインターフェースへの参照
SafeRef は,現在のオブジェクトのコンテキストの外部に安全に渡すことができる,rid パラメータで指定したインターフェースへのポインタを返します。
COM+ を使用している場合,自身への参照をクライアントやほかのオブジェクトに渡すのが安全です。このため,COM+ を実装した Windows のバージョンで実行中のアプリケーション内で SafeRef を呼び出すと,SafeRef は単純に pUnk として渡されるポインタを返します。したがって,SafeRef は COM+ アプリケーションで呼び出す必要はありません。また,MTS と COM+ の両方で使用されるアプリケーションに悪影響は及ぼしません。
MTS では,自身への参照をクライアントやほかのオブジェクトに渡す前に必ず SafeRef を呼び出し,その後,呼び出しによって返される参照を渡します。MTS では,オブジェクトが self ポインタ(Delphi)または this ポインタ(C++)や,QueryInterface への内部呼び出しで取得した自身への参照を,クライアントやほかのオブジェクトに渡すのは安全ではありません。それらの参照をオブジェクトのコンテキストの外部に渡すと,有効な参照ではなくなります。
すでに安全な参照で SafeRef を呼び出すと,インターフェースの参照カウントが増加されていなければ,変更されていない安全な参照が返されます。
安全である参照で QueryInterface をクライアントが呼び出した場合は,MTS は,クライアントに返される参照も安全な参照であることを保証します。
安全な参照を取得するオブジェクトは,処理を完了したら安全な参照を解放する必要があります。
MTS の場合,安全な参照は,安全でない参照とは異なるポインタ値を持っています。たとえば,self または this と self または this のセーフバージョンは同じ値を持ちません。2 つのポインタが同じオブジェクトを参照しているかどうかをテストするときは,この点に注意が必要です。それぞれのポインタで IID_IUnknown に対して QueryInterface を呼び出し,返されるポインタの値を比較してみると,誤った結果になることがあります。この場合,両方のポインタが同じオブジェクトを参照しているものの,一方は安全な参照で,他方はそうでない可能性があります。両方の参照が安全な参照であれば,通常の方法で比較できます。これは,クライアントが安全でない参照にアクセスできない MTS オブジェクトの場合だけの注意事項です。
メモ: MTS または COM+ でインストールされる可能性のあるトランザクションオブジェクトを記述する場合は,かわりに TMtsDll の SafeRef メソッドを使用してください。TMtsDll は,自動的に現在の環境を確認し,適切な参照を返します。