アプリケーションの制御

OLE では、アプリケーションとそのオブジェクトを大幅に制御する必要があります。 OLE システム DLL は、アプリケーションを自動的に起動および解放したり、オブジェクトの生成と変更を調整したりできる必要があります。 このトピックの関数は、これらの要件を満たしています。 OLE システム DLL によって呼び出されるだけでなく、これらの関数もアプリケーションによって呼び出される必要があります。

アプリケーションの制御

名前 説明
AfxOleCanExitApp アプリケーションを終了できるかどうかを示します。
AfxOleGetMessageFilter アプリケーションの現在のメッセージ フィルターを取得します。
AfxOleGetUserCtrl 現在のユーザー コントロール フラグを取得します。
AfxOleSetUserCtrl ユーザー コントロール フラグを設定またはクリアします。
AfxOleLockApp アプリケーション内のアクティブなオブジェクトの数のフレームワークのグローバルカウントをインクリメントします。
AfxOleLockControl 指定したコントロールのクラス ファクトリをロックします。
AfxOleUnlockApp アプリケーション内のアクティブなオブジェクトの数のフレームワークの数をデクリメントします。
AfxOleUnlockControl 指定したコントロールのクラス ファクトリのロックを解除します。
AfxOleRegisterServerClass OLE システム レジストリにサーバーを登録します。
AfxOleSetEditMenu typename Object コマンドのユーザー インターフェイスを実装します。

AfxOleCanExitApp

アプリケーションを終了できるかどうかを示します。

BOOL AFXAPI AfxOleCanExitApp();

戻り値

アプリケーションが終了できる場合は 0 以外。それ以外の場合は 0。

解説

オブジェクトへの未処理の参照がある場合は、アプリケーションを終了しないでください。 グローバル関数 AfxOleLockAppAfxOleUnlockApp インクリメントとデクリメントは、それぞれ、アプリケーションのオブジェクトへの参照のカウンターです。 このカウンターが 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();

戻り値

現在のメッセージ フィルターへのポインター。

解説

現在のアプリケーション オブジェクトにアクセスする場合と同様に、現在 COleMessageFilterの派生オブジェクトにアクセスするには、この関数を呼び出 AfxGetApp します。

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();

解説

フレームワークは、アプリケーションでアクティブなオブジェクトの数を保持します。 関数とAfxOleUnlockApp関数はそれぞれAfxOleLockApp、このカウントをインクリメントおよびデクリメントします。

ユーザーがアクティブ オブジェクトを持つアプリケーション (アクティブ オブジェクトの数が 0 以外のアプリケーション) を閉じようとすると、フレームワークはアプリケーションを完全にシャットダウンするのではなく、ユーザーのビューから非表示にします。 この関数は AfxOleCanExitApp 、アプリケーションを終了できるかどうかを示します。

OLE インターフェイスを公開する任意のオブジェクトから呼び出 AfxOleLockApp します。クライアント アプリケーションで引き続き使用されている間に、そのオブジェクトが破棄されるのが望ましくない場合。 また、コンストラクターで呼び出 AfxOleUnlockApp す任意のオブジェクトのデストラクターを呼び出 AfxOleLockApp します。 既定では、 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_Standard Edition RVER Server には、完全なサーバー ユーザー インターフェイスがあります。

  • OAT_Standard Edition RVER Server では、埋め込みのみがサポートされます。

  • OAT_CONTAINER Container では、埋め込みへのリンクがサポートされています。

  • IDispatchOAT_DISPATCH_OBJECT対応オブジェクト。

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

関連項目

マクロとグローバル