ObjectContext
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
現在のオブジェクトのコンテキストへのアクセスを提供します。オブジェクトのコンテキストは、主にトランザクションを扱う場合やオブジェクトのセキュリティを扱う場合に使用されます。(ObjectContext)
メソッド 13
vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。
現在のオブジェクトのコンテキストを使用してオブジェクトを作成します。(ObjectContext.CreateInstance)
| bstrProgID | LPWSTR | in | インスタンス化するオブジェクトの型の ProgID。 |
| pObject | VARIANT* | out | 新しいオブジェクトへの参照。 |
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_FAIL のほか、次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| メソッドが正常に完了しました。 | |
| 予期しないエラーが発生しました。これは、あるオブジェクトが自身の ObjectContext ポインターを別のオブジェクトに渡し、そのオブジェクトがこのポインターを使用して CreateInstance を呼び出した場合に発生することがあります。ObjectContext ポインターは、元々それを取得したオブジェクトのコンテキストの外部では有効ではありません。 |
解説(Remarks)
CreateInstance を使用してオブジェクトを作成すると、新しいオブジェクトのコンテキストは、現在のオブジェクトの ObjectContext と、新しいオブジェクトのコンポーネントの宣言的プロパティから導出されます。新しいオブジェクトは、常にそれを作成したオブジェクトと同じアクティビティ内で実行されます。現在のオブジェクトがトランザクションを持つ場合、新しいオブジェクトがそのトランザクションのスコープ内で実行されるかどうかは、新しいオブジェクトのコンポーネントのトランザクション属性によって決まります。
コンポーネントのトランザクション属性の設定がトランザクションを必須とするか、またはトランザクションをサポートする場合、新しいオブジェクトは作成元のトランザクションを継承します。コンポーネントのトランザクション属性が新しいトランザクションを必須とする場合、COM+ は新しいオブジェクトのために新しいトランザクションを開始します。コンポーネントのトランザクション属性がトランザクションをサポートしない場合、新しいオブジェクトはいかなるトランザクションの下でも実行されません。
オブジェクトが実行されているトランザクションをコミットできること、およびメソッドから戻る際にオブジェクトを非アクティブ化する必要があることを宣言します。
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_FAIL のほか、次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| メソッドが正常に完了しました。 | |
| 予期しないエラーが発生しました。これは、あるオブジェクトが自身の ObjectContext ポインターを別のオブジェクトに渡し、そのオブジェクトがこのポインターを使用して SetComplete を呼び出した場合に発生することがあります。ObjectContext ポインターは、元々それを取得したオブジェクトのコンテキストの外部では有効ではありません。 |
解説(Remarks)
オブジェクトは、SetComplete を呼び出したメソッドから戻る際に自動的に非アクティブ化されます。オブジェクトが自動トランザクションのルートである場合、COM+ はトランザクションのコミットを試みます。ただし、そのトランザクションに参加していたいずれかのオブジェクトが SetAbort を呼び出していた場合、または DisableCommit を呼び出してその後 EnableCommit や SetComplete を呼び出していない場合、トランザクションはアボートされます。
オブジェクトがメソッド呼び出しから戻った後に状態を維持する必要がない場合は、SetComplete を呼び出すべきです。そうすることで、戻るとすぐに自動的に非アクティブ化され、そのリソースを回収できます。
オブジェクトが実行されているトランザクションをアボートしなければならないこと、およびメソッドから戻る際にオブジェクトを非アクティブ化する必要があることを宣言します。
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_FAIL のほか、次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| メソッドが正常に完了しました。 | |
| 予期しないエラーが発生しました。これは、あるオブジェクトが自身の ObjectContext ポインターを別のオブジェクトに渡し、そのオブジェクトがこのポインターを使用して SetAbort を呼び出した場合に発生することがあります。ObjectContext ポインターは、元々それを取得したオブジェクトのコンテキストの外部では有効ではありません。 |
解説(Remarks)
オブジェクトは、SetAbort を呼び出したメソッドから戻る際に自動的に非アクティブ化されます。オブジェクトが自動トランザクションのルートである場合、COM+ はトランザクションをアボートします。オブジェクトがトランザクション対応であるが自動トランザクションのルートではない場合、そのオブジェクトが参加しているトランザクションはアボートが確定します。
エラーハンドラー内で SetAbort を呼び出すことで、エラー発生時にトランザクションが確実にアボートされるようにできます。また、メソッドの先頭で SetAbort を呼び出しておくことで、予期しない戻りが発生した場合にオブジェクトが早まってコミットされるのを防ぎ、その後すべてが正常に進んだら、メソッドが戻る直前に SetComplete を呼び出すこともできます。
現在のオブジェクトの処理が必ずしも完了していないが、そのトランザクションの更新は一貫性があり、現在の形式でコミット可能であることを宣言します。
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_FAIL のほか、次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| メソッドが正常に完了し、オブジェクトのトランザクションの更新をコミットできるようになりました。 | |
| 予期しないエラーが発生しました。これは、あるオブジェクトが自身の ObjectContext ポインターを別のオブジェクトに渡し、そのオブジェクトがこのポインターを使用して EnableCommit を呼び出した場合に発生することがあります。ObjectContext ポインターは、元々それを取得したオブジェクトのコンテキストの外部では有効ではありません。 |
解説(Remarks)
オブジェクトが EnableCommit を呼び出すと、それが参加しているトランザクションのコミットを許可しますが、SetComplete または SetAbort を呼び出すまで、あるいはトランザクションが完了するまで、クライアントからの呼び出しをまたいで内部状態を維持します。
EnableCommit は、オブジェクトがアクティブ化されたときの既定の状態です。したがって、オブジェクトが次のクライアントからの呼び出しのために内部状態を維持する必要がない限り、メソッドから戻る前に常に SetComplete または SetAbort を呼び出すべきです。
オブジェクトのトランザクションの更新が一貫しておらず、現在の状態ではコミットできないことを宣言します。
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_FAIL のほか、次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| メソッドが正常に完了しました。オブジェクトが EnableCommit または SetComplete のいずれかを呼び出すまで、オブジェクトのトランザクションの更新はコミットできません。 | |
| 予期しないエラーが発生しました。これは、あるオブジェクトが自身の ObjectContext ポインターを別のオブジェクトに渡し、そのオブジェクトがこのポインターを使用して DisableCommit を呼び出した場合に発生することがあります。ObjectContext ポインターは、元々それを取得したオブジェクトのコンテキストの外部では有効ではありません。 | |
| 現在のオブジェクトには、それに関連付けられたコンテキストがありません。これはおそらく、COM+ の CreateInstance メソッドのいずれかで作成されなかったためです。 |
解説(Remarks)
DisableCommit メソッドを使用すると、ステートフルなオブジェクトにおいて、メソッド呼び出しの間にトランザクションが早まってコミットされるのを防ぐことができます。オブジェクトが DisableCommit を呼び出すと、その処理が一貫しておらず、クライアントからさらにメソッド呼び出しを受け取るまで処理を完了できないことを示します。また、その処理を実行するために状態を維持する必要があることも示します。これにより、COM+ がメソッド呼び出しから戻る際にオブジェクトを非アクティブ化してそのリソースを回収するのを防ぎます。オブジェクトが DisableCommit を呼び出している場合、オブジェクトが EnableCommit または SetComplete を呼び出す前にクライアントがトランザクションをコミットしようとすると、トランザクションはアボートされます。
現在のオブジェクトがトランザクション内で実行されているかどうかを示します。(ObjectContext.IsInTransaction)
| pbIsInTx | VARIANT_BOOL* | out | 現在のオブジェクトがトランザクション内で実行されている場合は TRUE、それ以外の場合は FALSE。 |
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_FAIL のほか、次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| メソッドが正常に完了しました。 | |
| 予期しないエラーが発生しました。これは、あるオブジェクトが自身の ObjectContext ポインターを別のオブジェクトに渡し、そのオブジェクトがこのポインターを使用して IsInTransaction を呼び出した場合に発生することがあります。ObjectContext ポインターは、元々それを取得したオブジェクトのコンテキストの外部では有効ではありません。 |
解説(Remarks)
このメソッドを使用すると、トランザクションを必要とするオブジェクトがトランザクションなしで実行されることが決してないようにできます。たとえば、トランザクションを必要とするコンポーネントが Component Services 管理ツールで正しく構成されていない場合、このメソッドを使用してオブジェクトがトランザクションを持たないことを判定できます。その後、ユーザーに問題を知らせるためにエラーを返したり、適切な処置を行ったりできます。
現在のオブジェクトに対してセキュリティが有効になっているかどうかを示します。
| pbIsEnabled | VARIANT_BOOL* | out | このオブジェクトに対してセキュリティが有効になっている場合は TRUE、それ以外の場合は FALSE。 |
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_FAIL のほか、次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| メソッドが正常に完了しました。 | |
| 予期しないエラーが発生しました。これは、あるオブジェクトが自身の ObjectContext ポインターを別のオブジェクトに渡し、そのオブジェクトがこのポインターを使用して IsSecurityEnabled を呼び出した場合に発生することがあります。ObjectContext ポインターは、元々それを取得したオブジェクトのコンテキストの外部では有効ではありません。 |
解説(Remarks)
COM+ 環境では、サーバーアプリケーションおよびライブラリアプリケーションはロールベースのセキュリティを使用できます。IsSecurityEnabled は、アプリケーションがロールベースのセキュリティを使用しており、かつアプリケーションとメソッドを呼び出した特定のコンポーネントの両方でロールベースのセキュリティが有効になっている場合に TRUE を返します。
オブジェクトの直接の呼び出し元が、指定されたロールに(直接、またはグループの一部として)属しているかどうかを示します。(ObjectContext.IsCallerInRole)
| bstrRole | LPWSTR | in | ロールの名前。 |
| pbInRole | VARIANT_BOOL* | out | 呼び出し元が指定されたロールに属している場合は TRUE、それ以外の場合は FALSE。このパラメーターは、セキュリティが有効になっていない場合にも TRUE に設定されます。 |
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_FAIL のほか、次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| bstrRole パラメーターで指定されたロールは認識されているロールであり、pbIsInRole パラメーターで返される Boolean の結果は、呼び出し元がそのロールに属しているかどうかを示します。 | |
| bstrRole パラメーターで指定されたロールは存在しません。 | |
| 予期しないエラーが発生しました。これは、あるオブジェクトが自身の ObjectContext ポインターを別のオブジェクトに渡し、そのオブジェクトがこのポインターを使用して IsCallerInRole を呼び出した場合に発生することがあります。ObjectContext ポインターは、元々それを取得したオブジェクトのコンテキストの外部では有効ではありません。 |
解説(Remarks)
このメソッドを使用して、現在実行中のメソッドの直接の呼び出し元が特定のロールに関連付けられているかどうかを判定します。ロールとは、特定の COM+ アプリケーション内のすべてのコンポーネントに対して特定のアクセス権限を持つユーザーまたはユーザーグループを表すシンボリックな名前です。開発者はコンポーネントの作成時にロールを定義し、ロールはデプロイ時に個々のユーザーまたはグループにマッピングされます。
IsCallerInRole は、現在実行中のメソッドの直接の呼び出し元にのみ適用されます。(直接の呼び出し元とは、現在のサーバープロセスを呼び出しているプロセスです。ベースクライアントプロセスの場合もサーバープロセスの場合もあります。)IsCallerInRole は、現在のメソッドが呼び出された呼び出しシーケンスを開始したプロセスや、そのシーケンス内の他の呼び出し元には適用されません。
IsCallerInRole は、それを呼び出したオブジェクトがクライアントのプロセス内で実行されている場合に TRUE を返すため、IsCallerInRole を呼び出す前に IsSecurityEnabled を呼び出すことをお勧めします。セキュリティが有効になっていない場合、IsCallerInRole は正確な結果を返しません。
名前付きコンテキストオブジェクトプロパティの数を取得します。
| plCount | INT* | out | 名前付きコンテキストオブジェクトプロパティの数。 |
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTED、E_FAIL、および S_OK を返すことがあります。
名前付きプロパティを取得します。
| name | LPWSTR | in | 取得するプロパティの名前。 |
| pItem | VARIANT* | out | 取得されたプロパティへの参照。 |
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTED、E_FAIL、および S_OK を返すことがあります。
名前付きコンテキストオブジェクトプロパティの列挙子を取得します。
| ppEnum | IUnknown** | out | 返される IEnumVARIANT インターフェースへの参照。 |
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTED、E_FAIL、および S_OK を返すことがあります。
現在のオブジェクトのコンテキストのセキュリティオブジェクトを取得します。
| ppSecurityProperty | SecurityProperty** | out | 現在のオブジェクトのコンテキストのセキュリティプロパティを含む SecurityProperty インターフェースへの参照。 |
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTED、E_FAIL、および S_OK を返すことがあります。
現在のオブジェクトのコンテキストのコンテキスト情報オブジェクトを取得します。
| ppContextInfo | ContextInfo** | out | コンテキスト情報を含む ContextInfo インターフェースへの参照。 |
戻り値
このメソッドは、標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTED、E_FAIL、および S_OK を返すことがあります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ObjectContext "{74C08646-CEDB-11CF-8B49-00AA00B8A790}" #usecom global ObjectContext IID_ObjectContext "{}" #comfunc global ObjectContext_CreateInstance 7 wstr,var #comfunc global ObjectContext_SetComplete 8 #comfunc global ObjectContext_SetAbort 9 #comfunc global ObjectContext_EnableCommit 10 #comfunc global ObjectContext_DisableCommit 11 #comfunc global ObjectContext_IsInTransaction 12 var #comfunc global ObjectContext_IsSecurityEnabled 13 var #comfunc global ObjectContext_IsCallerInRole 14 wstr,var #comfunc global ObjectContext_get_Count 15 var #comfunc global ObjectContext_get_Item 16 wstr,var #comfunc global ObjectContext_get__NewEnum 17 sptr #comfunc global ObjectContext_get_Security 18 sptr #comfunc global ObjectContext_get_ContextInfo 19 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。#define global IID_ObjectContext "{74C08646-CEDB-11CF-8B49-00AA00B8A790}" #usecom global ObjectContext IID_ObjectContext "{}" #comfunc global ObjectContext_CreateInstance 7 wstr,sptr #comfunc global ObjectContext_SetComplete 8 #comfunc global ObjectContext_SetAbort 9 #comfunc global ObjectContext_EnableCommit 10 #comfunc global ObjectContext_DisableCommit 11 #comfunc global ObjectContext_IsInTransaction 12 sptr #comfunc global ObjectContext_IsSecurityEnabled 13 sptr #comfunc global ObjectContext_IsCallerInRole 14 wstr,sptr #comfunc global ObjectContext_get_Count 15 sptr #comfunc global ObjectContext_get_Item 16 wstr,sptr #comfunc global ObjectContext_get__NewEnum 17 sptr #comfunc global ObjectContext_get_Security 18 sptr #comfunc global ObjectContext_get_ContextInfo 19 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。