アプリケーションコントロール
OLE では、アプリケーションとそのオブジェクトを大幅に制御する必要があります。 OLE システム DLL は、アプリケーションを自動的に起動および解放したり、オブジェクトの生成と変更を調整したりできる必要があります。 このトピックの関数は、これらの要件を満たしています。 OLE システム DLL によって呼び出されるだけでなく、これらの関数もアプリケーションによって呼び出される必要があります。
アプリケーションコントロール
名前 | 説明 |
---|---|
AfxOleCanExitApp | アプリケーションを終了できるかどうかを示します。 |
AfxOleGetMessageFilter | アプリケーションの現在のメッセージ フィルターを取得します。 |
AfxOleGetUserCtrl | 現在のユーザー コントロール フラグを取得します。 |
AfxOleSetUserCtrl | ユーザー コントロール フラグを設定またはクリアします。 |
AfxOleLockApp | アプリケーション内のアクティブなオブジェクトの数のフレームワークのグローバルカウントをインクリメントします。 |
AfxOleLockControl | 指定したコントロールのクラス ファクトリをロックします。 |
AfxOleUnlockApp | アプリケーション内のアクティブなオブジェクトの数のフレームワークの数をデクリメントします。 |
AfxOleUnlockControl | 指定したコントロールのクラス ファクトリのロックを解除します。 |
AfxOleRegisterServerClass | OLE システム レジストリにサーバーを登録します。 |
AfxOleSetEditMenu | typename Object コマンドのユーザー インターフェイスを実装します。 |
AfxOleCanExitApp
アプリケーションを終了できるかどうかを示します。
BOOL AFXAPI AfxOleCanExitApp();
戻り値
アプリケーションが終了できる場合は 0 以外。それ以外の場合は 0。
解説
オブジェクトへの未処理の参照がある場合は、アプリケーションを終了しないでください。 グローバル関数は、アプリケーションのオブジェクトへの参照のカウンターをそれぞれ AfxOleLockApp
し、インクリメントとデクリメントを AfxOleUnlockApp
します。 このカウンターが 0 以外の場合は、アプリケーションを終了しないでください。 カウンターが 0 以外の場合、ユーザーがシステム メニューから [閉じる] または [ファイル] メニューから [終了] を選択すると、アプリケーションのメイン ウィンドウは非表示になります (破棄されません)。 フレームワークは、 CFrameWnd::OnClose
でこの関数を呼び出します。
例
// Helper exit function for automation server
BOOL CMainFrame::CanExit()
{
if (AfxOleCanExitApp())
{
// No outstanding object counts - go ahead and exit
return TRUE;
}
else
{
// There are outstanding OLE object counts...
// hide app to give user impression that application has exited.
ShowWindow(SW_HIDE);
// take user out of control of the app
AfxOleSetUserCtrl(FALSE);
return FALSE;
}
}
要件
ヘッダー : afxdisp.h
AfxOleGetMessageFilter
アプリケーションの現在のメッセージ フィルターを取得します。
COleMessageFilter* AFXAPI AfxOleGetMessageFilter();
戻り値
現在のメッセージ フィルターへのポインター。
解説
現在のアプリケーション オブジェクトにアクセスするAfxGetApp
を呼び出すのと同様に、現在のCOleMessageFilter
派生オブジェクトにアクセスするには、この関数を呼び出します。
例
COleMessageFilter *pFilter = AfxOleGetMessageFilter();
ASSERT_VALID(pFilter);
pFilter->BeginBusyState();
// do things requiring a busy state
pFilter->EndBusyState();
// Another example
//CWinApp-derived class
BOOL CCMFCAutomationApp::InitInstance()
{
CWinApp::InitInstance();
// Initialize OLE libraries
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
CWinThread *pThread = AfxGetThread();
if (pThread != NULL)
{
// Destroy message filter, thereby unregistering it.
delete pThread->m_pMessageFilter;
pThread->m_pMessageFilter = NULL;
// Create the new message filter object.
//CMyMessageFilter is derived from COleMessageFilter
pThread->m_pMessageFilter = new CMyMessageFilter;
ASSERT(AfxOleGetMessageFilter() != NULL);
// Register the new message filter object.
AfxOleGetMessageFilter()->Register();
}
//...
//...
//...
}
要件
ヘッダー: afxwin.h
AfxOleGetUserCtrl
現在のユーザー コントロール フラグを取得します。
BOOL AFXAPI AfxOleGetUserCtrl();
戻り値
ユーザーがアプリケーションを制御している場合は 0 以外。それ以外の場合は 0。
解説
ユーザーが明示的に開いたり、新しいドキュメントを作成したりすると、ユーザーはアプリケーションを制御できます。 ユーザーは、OLE システム DLL によってアプリケーションが起動されなかったかどうか(つまり、ユーザーがシステム シェルを使用してアプリケーションを起動した場合)も制御できます。
要件
ヘッダー : afxdisp.h
AfxOleSetUserCtrl
AfxOleGetUserCtrl
のリファレンスで説明されているユーザー コントロール フラグを設定またはクリアします。
void AFXAPI AfxOleSetUserCtrl(BOOL bUserCtrl);
パラメーター
bUserCtrl
ユーザー コントロール フラグを設定するかクリアするかを指定します。
解説
フレームワークは、ユーザーがドキュメントを作成または読み込むときにこの関数を呼び出しますが、コンテナー アプリケーションから埋め込みオブジェクトを読み込むなどの間接的なアクションによってドキュメントが読み込まれたり作成されたりした場合は呼び出しません。
アプリケーション内の他のアクションによってユーザーがアプリケーションを制御する必要がある場合は、この関数を呼び出します。
要件
ヘッダー : afxdisp.h
AfxOleLockApp
アプリケーション内のアクティブなオブジェクトの数のフレームワークのグローバルカウントをインクリメントします。
void AFXAPI AfxOleLockApp();
解説
フレームワークは、アプリケーションでアクティブなオブジェクトの数を保持します。 AfxOleLockApp
関数とAfxOleUnlockApp
関数はそれぞれ、このカウントをインクリメントおよびデクリメントします。
ユーザーがアクティブ オブジェクトを持つアプリケーション (アクティブ オブジェクトの数が 0 以外のアプリケーション) を閉じようとすると、フレームワークはアプリケーションを完全にシャットダウンするのではなく、ユーザーのビューから非表示にします。 AfxOleCanExitApp
関数は、アプリケーションを終了できるかどうかを示します。
OLE インターフェイスを公開する任意のオブジェクトから AfxOleLockApp
を呼び出します。そのオブジェクトがクライアント アプリケーションで引き続き使用されている間に破棄されるのが望ましくない場合。 また、コンストラクター内のAfxOleLockApp
を呼び出す任意のオブジェクトのデストラクターでAfxOleUnlockApp
を呼び出します。 既定では、 COleDocument
(および派生クラス) によって、アプリケーションが自動的にロックおよびロック解除されます。
例
// Below is a code sample from an Application Wizard-generated SDI
// Application with Automation support. The Application Wizard adds a
// dispatch interface to the document class. AfxOleLockApp() and
// AfxOleUnlockApp() respectively increment and decrement the
// application's object count. When the object count is equal to
// zero and if the user has not taken control of the application,
// the server is terminated.
CCMFCAutomationDoc::CCMFCAutomationDoc()
{
EnableAutomation();
AfxOleLockApp();
}
CCMFCAutomationDoc::~CCMFCAutomationDoc()
{
AfxOleUnlockApp();
}
要件
ヘッダー : afxdisp.h
AfxOleUnlockApp
アプリケーション内のアクティブなオブジェクトのフレームワークの数を減らします。
void AFXAPI AfxOleUnlockApp();
解説
詳細については、 AfxOleLockApp
を参照してください。
アクティブなオブジェクトの数が 0 に達すると、 AfxOleOnReleaseAllObjects
が呼び出されます。
例
AfxOleLockApp の例を参照してください。
要件
ヘッダー : afxdisp.h
AfxOleLockControl
コントロールに関連付けられた動的に作成されたデータがメモリ内に残るように、指定したコントロールのクラス ファクトリをロックします。
構文
BOOL AFXAPI AfxOleLockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleLockControl( LPCTSTR lpszProgID );
パラメーター
clsid
コントロールの一意のクラス ID。
lpszProgID
コントロールの一意のプログラム ID。
戻り値
コントロールのクラス ファクトリが正常にロックされた場合は 0 以外。それ以外の場合は 0。
解説
これにより、コントロールの表示が大幅に高速化される可能性があります。 たとえば、ダイアログ ボックスでコントロールを作成し、 AfxOleLockControl
を使用してコントロールをロックした後は、ダイアログが表示または破棄されるたびに、コントロールを再度作成して強制終了する必要はありません。 ユーザーがダイアログ ボックスを繰り返し開いて閉じると、コントロールをロックするとパフォーマンスが大幅に向上する可能性があります。 コントロールを破棄する準備ができたら、 AfxOleUnlockControl
を呼び出します。
例
// Starts and locks control's (Microsoft Calendar) class factory.
// Control will remain in memory for lifetime of
// application or until AfxOleUnlockControl() is called.
AfxOleLockControl(_T("MSCAL.Calendar"));
要件
ヘッダー: afxwin.h
AfxOleRegisterServerClass
この関数を使用すると、OLE システム レジストリにサーバーを登録できます。
BOOL AFXAPI AfxOleRegisterServerClass(
REFCLSID clsid,
LPCTSTR lpszClassName,
LPCTSTR lpszShortTypeName,
LPCTSTR lpszLongTypeName,
OLE_APPTYPE nAppType = OAT_SERVER,
LPCTSTR* rglpszRegister = NULL,
LPCTSTR* rglpszOverwrite = NULL);
パラメーター
clsid
サーバーの OLE クラス ID への参照。
lpszClassName
サーバーのオブジェクトのクラス名を含む文字列へのポインター。
lpszShortTypeName
サーバーのオブジェクト型の短い名前 ("Chart" など) を含む文字列へのポインター。
lpszLongTypeName
"Microsoft Excel 5.0 グラフ" など、サーバーのオブジェクト型の長い名前を含む文字列へのポインター。
nAppType
OLE アプリケーションの種類を指定する、OLE_APPTYPE列挙体から取得された値。 指定できる値は次のとおりです。
OAT_INPLACE_SERVER Server には、完全なサーバー ユーザー インターフェイスがあります。
OAT_SERVER Server では埋め込みのみがサポートされます。
OAT_CONTAINER Container では、埋め込みへのリンクがサポートされています。
OAT_DISPATCH_OBJECT
IDispatch
対応オブジェクト。
rglpszRegister
キーの既存の値が見つからない場合に OLE システム レジストリに追加するキーと値を表す文字列へのポインターの配列。
rglpszOverwrite
指定されたキーの既存の値がレジストリに含まれている場合に、OLE システム レジストリに追加されるキーと値を表す文字列へのポインターの配列。
戻り値
サーバー クラスが正常に登録された場合は 0 以外。それ以外の場合は 0。
解説
ほとんどのアプリケーションでは、 COleTemplateServer::Register
を使用してアプリケーションのドキュメントの種類を登録できます。 アプリケーションのシステム レジストリ形式が一般的なパターンに適合しない場合は、 AfxOleRegisterServerClass
を使用して制御を高めることができます。
レジストリは、一連のキーと値で構成されます。 引数 rglpszRegister および rglpszOverwrite は文字列へのポインターの配列であり、それぞれがキーと値で構成され、 NULL 文字 ( '\0'
) で区切られます。 これらの各文字列には、文字シーケンス %1 %5 でマークされている置換可能なパラメーターを指定できます。
記号は次のように入力されます。
記号 | Value |
---|---|
%1 | 文字列として書式設定されたクラス ID |
2% | クラス名 |
%3 | 実行可能ファイルへのパス |
4% | 短い型名 |
5% | 長い型名 |
要件
ヘッダー : afxdisp.h
AfxOleSetEditMenu
typename Object コマンドのユーザー インターフェイスを実装します。
void AFXAPI AfxOleSetEditMenu(
COleClientItem* pClient,
CMenu* pMenu,
UINT iMenuItem,
UINT nIDVerbMin,
UINT nIDVerbMax = 0,
UINT nIDConvert = 0);
パラメーター
pClient
クライアント OLE 項目へのポインター。
pMenu
更新するメニュー オブジェクトへのポインター。
iMenuItem
更新するメニュー項目のインデックス。
nIDVerbMin
主動詞に対応するコマンド ID。
nIDVerbMax
最後の動詞に対応するコマンド ID。
nIDConvert
[変換] メニュー項目の ID。
解説
サーバーが主動詞のみを認識する場合、メニュー項目は "verb typename Object" になり、ユーザーがコマンドを選択すると nIDVerbMin コマンドが送信されます。 サーバーが複数の動詞を認識すると、メニュー項目は " typename Object" になり、ユーザーがコマンドを選択すると、すべての動詞を一覧表示するサブメニューが表示されます。 ユーザーがサブメニューから動詞を選択すると、最初の動詞が選択された場合は nIDVerbMin が送信され、2 番目の動詞が選択された場合は nIDVerbMin + 1 が送信されます。 既定の COleDocument
実装では、この機能が自動的に処理されます。
クライアントのアプリケーション リソース スクリプト (.RC) ファイル:
#include < afxolecl.rc>
要件
ヘッダー: afxole.h
AfxOleUnlockControl
指定したコントロールのクラス ファクトリのロックを解除します。
構文
BOOL AFXAPI AfxOleUnlockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleUnlockControl( LPCTSTR lpszProgID );
パラメーター
clsid
コントロールの一意のクラス ID。
lpszProgID
コントロールの一意のプログラム ID。
戻り値
コントロールのクラス ファクトリが正常にロック解除された場合は 0 以外。それ以外の場合は 0。
解説
コントロールは AfxOleLockControl
でロックされるため、コントロールに関連付けられた動的に作成されたデータはメモリ内に残ります。 これにより、コントロールが表示されるたびにコントロールを作成および破棄する必要がないため、コントロールの表示速度が大幅に向上する可能性があります。 コントロールを破棄する準備ができたら、 AfxOleUnlockControl
を呼び出します。
例
// Unlock control's (Microsoft Calendar Control) class factory.
AfxOleUnlockControl(_T("MSCAL.Calendar"));
要件
ヘッダー: afxwin.h