Win32 API 日本語リファレンス
ホームSystem.ComponentServices › IObjectContext

IObjectContext

COM
IID51372ae0-cae7-11cf-be81-00aa00a2fa25継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

現在のオブジェクトのコンテキストへのアクセスを提供します。オブジェクトのコンテキストは、主にトランザクションを扱う場合や、オブジェクトのセキュリティを扱う場合に使用されます。(IObjectContext)

解説(Remarks)

他の COM オブジェクトと同様に、IObjectContext オブジェクトの使用を終えたら、ローカル変数である場合を除き、これを解放する必要があります。

メソッド 8

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT CreateInstance(GUID* rclsid, GUID* riid, void** ppv)

現在のオブジェクトのコンテキストを使用してオブジェクトを作成します。(IObjectContext.CreateInstance)

rclsidGUID*inインスタンス化するオブジェクトの型の CLSID。
riidGUID*inインスタンス化したいオブジェクトが実装している任意のインターフェイス。
ppvvoid**inout新しいオブジェクト上の要求されたインターフェイスへの参照。インスタンス化に失敗した場合、このパラメーターには NULL が設定されます。

戻り値

このメソッドは次の値を返すことがあります。

Return code Description
S_OK
メソッドは正常に完了しました。
REGDB_E_CLASSNOTREG
clsid で指定されたコンポーネントが COM コンポーネントとして登録されていません。
E_OUTOFMEMORY
オブジェクトをインスタンス化するのに十分なメモリがありません。
E_INVALIDARG
ppvObj パラメーターに渡された引数が無効です。
E_UNEXPECTED
予期しないエラーが発生しました。これは、あるオブジェクトが自身の IObjectContext ポインターを別のオブジェクトに渡し、その別のオブジェクトがこのポインターを使用して CreateInstance を呼び出した場合に発生することがあります。IObjectContext ポインターは、元々それを取得したオブジェクトのコンテキストの外では有効ではありません。

解説(Remarks)

CreateInstance は COM オブジェクトを作成します。ただし、そのオブジェクトがコンテキストを持つのは、そのコンポーネントが COM+ に登録されている場合のみです。

CreateInstance を使用してオブジェクトを作成すると、新しいオブジェクトのコンテキストは、現在のオブジェクトの IObjectContext と、新しいオブジェクトのコンポーネントの宣言的プロパティから導出されます。新しいオブジェクトは常に、それを作成したオブジェクトと同じアクティビティ内で実行されます。現在のオブジェクトがトランザクションを持っている場合、新しいオブジェクトのコンポーネントのトランザクション属性によって、新しいオブジェクトがそのトランザクションのスコープ内で実行されるかどうかが決まります。

コンポーネントのトランザクション属性の設定がトランザクションを必須とする、またはトランザクションをサポートするもののいずれかである場合、新しいオブジェクトは作成元のトランザクションを継承します。コンポーネントのトランザクション属性が新しいトランザクションを必須とする場合、COM+ は新しいオブジェクトのために新しいトランザクションを開始します。コンポーネントのトランザクション属性がトランザクションをサポートしない場合、新しいオブジェクトはどのトランザクションの下でも実行されません。

CreateInstance は常に、新しくインスタンス化されたオブジェクト上の IUnknown インターフェイスを返します。返された値は、新しいオブジェクトと通信するために使用したいインターフェイスへ直ちにキャストする必要があります。riid パラメーターに渡すインターフェイス ID は、返された値をキャストする先のインターフェイスと同じである必要はありませんが、インスタンス化するオブジェクトが実装しているインターフェイスでなければなりません。

vtbl 4 HRESULT SetComplete()

オブジェクトが実行されているトランザクションをコミットできること、および現在実行中のメソッド呼び出しから戻る際にオブジェクトを非アクティブ化すべきであることを宣言します。

戻り値

このメソッドは次の値を返すことがあります。

Return code Description
S_OK
メソッドは正常に完了しました。
E_UNEXPECTED
予期しないエラーが発生しました。これは、あるオブジェクトが自身の IObjectContext ポインターを別のオブジェクトに渡し、その別のオブジェクトがこのポインターを使用して SetComplete を呼び出した場合に発生することがあります。IObjectContext ポインターは、元々それを取得したオブジェクトのコンテキストの外では有効ではありません。

解説(Remarks)

オブジェクトは、SetComplete を呼び出したメソッドから戻る際に自動的に非アクティブ化されます。オブジェクトが自動トランザクションのルートである場合、COM+ はそのトランザクションのコミットを試みます。ただし、そのトランザクションに参加していたいずれかのオブジェクトが SetAbort を呼び出していた場合、または DisableCommit を呼び出した後に EnableCommitSetComplete をその後呼び出していない場合、トランザクションはアボートされます。

オブジェクトがメソッド呼び出しから戻った後に状態を保持する必要がない場合は、SetComplete を呼び出し、戻り次第自動的に非アクティブ化されてリソースを回収できるようにするべきです。

vtbl 5 HRESULT SetAbort()

オブジェクトが実行されているトランザクションをアボートしなければならないこと、および現在実行中のメソッド呼び出しから戻る際にオブジェクトを非アクティブ化すべきであることを宣言します。

戻り値

このメソッドは次の値を返すことがあります。

Return code Description
S_OK
メソッドは正常に完了しました。
E_UNEXPECTED
予期しないエラーが発生しました。これは、あるオブジェクトが自身の IObjectContext ポインターを別のオブジェクトに渡し、その別のオブジェクトがこのポインターを使用して SetAbort を呼び出した場合に発生することがあります。IObjectContext ポインターは、元々それを取得したオブジェクトのコンテキストの外では有効ではありません。

解説(Remarks)

オブジェクトは、SetAbort を呼び出したメソッドから戻る際に自動的に非アクティブ化されます。オブジェクトが自動トランザクションのルートである場合、COM+ はそのトランザクションをアボートします。オブジェクトがトランザクション対応であるものの自動トランザクションのルートではない場合、それが参加しているトランザクションはアボートが確定します。

エラーハンドラー内で SetAbort を呼び出すことで、エラーが発生したときにトランザクションが確実にアボートされるようにできます。また、メソッドの冒頭で SetAbort を呼び出しておくことで、予期しない戻りが発生した場合にオブジェクトが早まってコミットされるのを防ぎ、その後すべてが正常に進んだ場合には、メソッドが戻る直前に SetComplete を呼び出すこともできます。

vtbl 6 HRESULT EnableCommit()

オブジェクトの処理が必ずしも完了しているわけではないが、そのトランザクションによる更新は一貫した状態にあり、現在の形式でコミット可能であることを宣言します。

戻り値

このメソッドは次の値を返すことがあります。

Return code Description
S_OK
メソッドは正常に完了し、オブジェクトのトランザクションによる更新をコミットできるようになりました。
E_UNEXPECTED
予期しないエラーが発生しました。これは、あるオブジェクトが自身の IObjectContext ポインターを別のオブジェクトに渡し、その別のオブジェクトがこのポインターを使用して EnableCommit を呼び出した場合に発生することがあります。IObjectContext ポインターは、元々それを取得したオブジェクトのコンテキストの外では有効ではありません。

解説(Remarks)

オブジェクトが EnableCommit を呼び出すと、参加しているトランザクションのコミットを許可しますが、SetComplete または SetAbort を呼び出すまで、あるいはトランザクションが完了するまで、クライアントからの呼び出しをまたいで内部状態を保持します。

EnableCommit は、オブジェクトがアクティブ化されたときの既定の状態です。したがって、オブジェクトが次のクライアントからの呼び出しに備えて内部状態を保持したい場合を除き、メソッドから戻る前に常に SetComplete または SetAbort を呼び出すべきです。

vtbl 7 HRESULT DisableCommit()

オブジェクトのトランザクションによる更新が一貫しない状態にあり、現在の状態ではコミットできないことを宣言します。

戻り値

このメソッドは次の値を返すことがあります。

Return code Description
S_OK
メソッドは正常に完了しました。オブジェクトが EnableCommit または SetComplete のいずれかを呼び出すまで、オブジェクトのトランザクションによる更新はコミットできません。
E_UNEXPECTED
予期しないエラーが発生しました。これは、あるオブジェクトが自身の IObjectContext ポインターを別のオブジェクトに渡し、その別のオブジェクトがこのポインターを使用して DisableCommit を呼び出した場合に発生することがあります。IObjectContext ポインターは、元々それを取得したオブジェクトのコンテキストの外では有効ではありません。
CONTEXT_E_NOCONTEXT
現在のオブジェクトには、関連付けられたコンテキストがありません。これはおそらく、COM+ の CreateInstance メソッドのいずれかで作成されなかったためです。

解説(Remarks)

DisableCommit メソッドを使用すると、ステートフルなオブジェクトにおいて、メソッド呼び出しの間にトランザクションが早まってコミットされるのを防ぐことができます。オブジェクトが DisableCommit を呼び出すと、その処理が一貫しておらず、クライアントからのさらなるメソッド呼び出しを受け取るまで処理を完了できないことを示します。また、その処理を実行するために状態を保持する必要があることも示します。これにより、COM+ がメソッド呼び出しから戻る際にオブジェクトを非アクティブ化してそのリソースを回収するのを防ぎます。オブジェクトが DisableCommit を呼び出した後、そのオブジェクトが EnableCommit または SetComplete を呼び出す前にクライアントがトランザクションをコミットしようとすると、トランザクションはアボートします。

たとえば、データベースを更新する GeneralLedger コンポーネントがあるとします。クライアントは、さまざまな勘定に仕訳を記帳するために GeneralLedger オブジェクトに対して複数回の呼び出しを行います。最後のメソッド呼び出しが戻る時点で借方と貸方が一致していなければならず、そうでなければトランザクションをアボートしなければならない、という整合性制約があります。GeneralLedger オブジェクトには初期化メソッドがあり、クライアントはそこで、これから行う呼び出しのシーケンスをオブジェクトに通知し、GeneralLedger オブジェクトは DisableCommit を呼び出します。オブジェクトは呼び出しの間に状態を保持するため、シーケンスの最後の呼び出しが行われた後に、処理のコミットを許可する前に整合性制約が満たされていることを確認できます。

vtbl 8 BOOL IsInTransaction()

オブジェクトがトランザクション内で実行されているかどうかを示します。

戻り値

現在のオブジェクトがトランザクション内で実行されている場合、戻り値は TRUE です。そうでない場合は FALSE です。

解説(Remarks)

このメソッドを使用すると、トランザクションを必要とするオブジェクトがトランザクションなしで実行されることが決してないようにすることができます。たとえば、トランザクションを必要とするコンポーネントがコンポーネント サービス管理ツールで不適切に構成されている場合、このメソッドを使用してオブジェクトがトランザクションを持たないことを判定できます。その後、問題をユーザーに知らせるためにエラーを返したり、適切な処置を行ったりできます。

vtbl 9 BOOL IsSecurityEnabled()

現在のオブジェクトに対してセキュリティが有効かどうかを示します。COM+ のセキュリティは、オブジェクトがクライアントのプロセス内で実行されている場合を除き、有効です。

戻り値

このオブジェクトに対してセキュリティが有効な場合、戻り値は TRUE です。そうでない場合は FALSE です。

解説(Remarks)

COM+ 環境では、サーバー アプリケーションおよびライブラリ アプリケーションはロールベースのセキュリティを使用できます。IsSecurityEnabled は、アプリケーションがロールベースのセキュリティを使用し、そのアプリケーションとメソッドを呼び出した特定のコンポーネントの両方でロールベースのセキュリティが有効になっている場合に TRUE を返します。

MTS 2.0: MTS 2.0 では、MTS ライブラリ アプリケーションはロールベースのセキュリティを使用できないため、現在のオブジェクトがライブラリ アプリケーション内で実行されている場合、このメソッドは常に FALSE を返します。ただし、COM+ 環境では、ライブラリ アプリケーションは任意でロールベースのセキュリティを使用できます。

vtbl 10 HRESULT IsCallerInRole(LPWSTR bstrRole, BOOL* pfIsInRole)

オブジェクトの直接の呼び出し元が、指定されたロールに(直接またはグループの一員として)属しているかどうかを示します。(IObjectContext.IsCallerInRole)

bstrRoleLPWSTRinロールの名前。
pfIsInRoleBOOL*inout呼び出し元が指定されたロールに属している場合は TRUE、そうでない場合は FALSE。セキュリティが有効でない場合も、このパラメーターには TRUE が設定されます。

戻り値

このメソッドは次の値を返すことがあります。

Return code Description
S_OK
bstrRole パラメーターで指定されたロールは認識されるロールであり、pbIsInRole パラメーターで返されるブール値の結果が、呼び出し元がそのロールに属しているかどうかを示します。
CONTEXT_E_ROLENOTFOUND
bstrRole パラメーターで指定されたロールが存在しません。
E_INVALIDARG
渡された引数の 1 つ以上が無効です。
E_UNEXPECTED
予期しないエラーが発生しました。これは、あるオブジェクトが自身の IObjectContext ポインターを別のオブジェクトに渡し、その別のオブジェクトがこのポインターを使用して IsCallerInRole を呼び出した場合に発生することがあります。IObjectContext ポインターは、元々それを取得したオブジェクトのコンテキストの外では有効ではありません。

解説(Remarks)

このメソッドは、現在実行中のメソッドの直接の呼び出し元が特定のロールに関連付けられているかどうかを判定するために使用します。ロールとは、特定の COM+ アプリケーション内のすべてのコンポーネントに対する特定のアクセス許可を持つユーザーまたはユーザー グループを表す記号的な名前です。開発者はコンポーネントを作成する際にロールを定義し、ロールはデプロイ時に個々のユーザーまたはグループにマップされます。

IsCallerInRole は、現在実行中のメソッドの直接の呼び出し元にのみ適用されます。(直接の呼び出し元とは、現在のサーバー プロセスを呼び出しているプロセスのことです。これはベース クライアント プロセスの場合もサーバー プロセスの場合もあります。) IsCallerInRole は、現在のメソッドが呼び出された呼び出しシーケンスを開始したプロセスや、そのシーケンス内の他の呼び出し元には適用されません。

IsCallerInRole は、それを呼び出したオブジェクトがクライアントのプロセス内で実行されている場合に TRUE を返すため、IsCallerInRole を呼び出す前に IsSecurityEnabled を呼び出すのが賢明です。セキュリティが有効でない場合、IsCallerInRole は正確な結果を返しません。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IObjectContext "{51372AE0-CAE7-11CF-BE81-00AA00A2FA25}"
#usecom global IObjectContext IID_IObjectContext "{}"
#comfunc global IObjectContext_CreateInstance     3 var,var,sptr
#comfunc global IObjectContext_SetComplete        4
#comfunc global IObjectContext_SetAbort           5
#comfunc global IObjectContext_EnableCommit       6
#comfunc global IObjectContext_DisableCommit      7
#comfunc global IObjectContext_IsInTransaction    8
#comfunc global IObjectContext_IsSecurityEnabled  9
#comfunc global IObjectContext_IsCallerInRole     10 wstr,var
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。