Uygulama Denetimi

OLE, uygulamalar ve nesneleri üzerinde önemli bir denetim gerektirir. OLE sistemi DLL'lerinin uygulamaları otomatik olarak başlatabilmesi ve serbest bırakabilmesi, nesnelerin üretim ve değişikliklerini koordine edebilmesi vb. gerekir. Bu konudaki işlevler bu gereksinimleri karşılar. OLE sistemi DLL'leri tarafından çağrılmaya ek olarak, bu işlevler bazen uygulamalar tarafından da çağrılmalıdır.

Uygulama Denetimi

Veri Akışı Adı Açıklama
AfxOleCanExitApp Uygulamanın sonlandırılıp sonlandırılamayacağını gösterir.
AfxOleGetMessageFilter Uygulamanın geçerli ileti filtresini alır.
AfxOleGetUserCtrl Geçerli kullanıcı denetimi bayrağını alır.
AfxOleSetUserCtrl Kullanıcı denetimi bayrağını ayarlar veya temizler.
AfxOleLockApp Çerçevenin bir uygulamadaki etkin nesne sayısının genel sayısını artırır.
AfxOleLockControl Belirtilen denetimin sınıf fabrikasını kilitler.
AfxOleUnlockApp Çerçevenin bir uygulamadaki etkin nesne sayısını azaltma.
AfxOleUnlockControl Belirtilen denetimin sınıf fabrikasının kilidini açar.
AfxOleRegisterServerClass OLE sistemi kayıt defterine bir sunucu kaydeder.
AfxOleSetEditMenu typename Object komutu için kullanıcı arabirimini uygular.

AfxOleCanExitApp

Uygulamanın sonlandırılıp sonlandırılamayacağını gösterir.

BOOL AFXAPI AfxOleCanExitApp();

Dönüş Değeri

Uygulama çıkabiliyorsa sıfır olmayan; aksi takdirde 0.

Açıklamalar

Nesnelerine bekleyen başvurular varsa bir uygulama sonlandırılmamalıdır. Genel işlevler AfxOleLockApp ve AfxOleUnlockApp artış ve azaltma, sırasıyla uygulamanın nesnelerine yönelik başvurular sayacıdır. Bu sayaç sıfırdan farklı olduğunda uygulama sonlandırılmamalıdır. Sayaç sıfır değilse, kullanıcı sistem menüsünden Kapat'ı veya Dosya menüsünden Çık'ı seçtiğinde uygulamanın ana penceresi gizlenir (yok değildir). Çerçeve, içinde bu işlevi CFrameWnd::OnCloseçağırır.

Örnek

// 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;
   }
}

Gereksinimler

Üst bilgi: afxdisp.h

AfxOleGetMessageFilter

Uygulamanın geçerli ileti filtresini alır.

COleMessageFilter* AFXAPI AfxOleGetMessageFilter();

Dönüş Değeri

Geçerli ileti filtresinin işaretçisi.

Açıklamalar

Geçerli COleMessageFilteruygulama nesnesine erişmek için çağırdığınız gibi geçerli türetilmiş nesneye erişmek için bu işlevi çağırın AfxGetApp .

Örnek

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();
   }
   //...
   //...
   //...
}

Gereksinimler

Üst bilgi: afxwin.h

AfxOleGetUserCtrl

Geçerli kullanıcı denetimi bayrağını alır.

BOOL AFXAPI AfxOleGetUserCtrl();

Dönüş Değeri

Kullanıcı uygulamanın denetimindeyse sıfır olmayan; aksi takdirde 0.

Açıklamalar

Kullanıcı açıkça yeni bir belge açtığında veya oluşturduğunda uygulama denetimi kullanıcıdadır. Kullanıcı, uygulamanın OLE sistem DLL'leri tarafından başlatılmamış olup olmadığını da denetler; başka bir deyişle, kullanıcı uygulamayı sistem kabuğuyla başlattıysa.

Gereksinimler

Üst bilgi: afxdisp.h

AfxOleSetUserCtrl

için başvuruda AfxOleGetUserCtrlaçıklanan kullanıcı denetimi bayrağını ayarlar veya temizler.

void AFXAPI AfxOleSetUserCtrl(BOOL bUserCtrl);

Parametreler

bUserCtrl
Kullanıcı denetimi bayrağının ayarlanıp ayarlanmayacağını veya temizlenip temizlenmeyeceğini belirtir.

Açıklamalar

Çerçeve, kullanıcı bir belge oluşturduğunda veya yüklediğinde bu işlevi çağırır, ancak bir belge bir kapsayıcı uygulamasından katıştırılmış nesne yükleme gibi dolaylı bir eylemle yüklendiğinde veya oluşturulduğunda çağırılmaz.

Uygulamanızdaki diğer eylemler kullanıcının uygulamanın denetimini ele alması gerekiyorsa bu işlevi çağırın.

Gereksinimler

Üst bilgi: afxdisp.h

AfxOleLockApp

Çerçevenin uygulamadaki etkin nesne sayısının genel sayısını artırır.

void AFXAPI AfxOleLockApp();

Açıklamalar

Çerçeve, bir uygulamada etkin olan nesne sayısını tutar. AfxOleLockApp sırasıyla ve AfxOleUnlockApp işlevleri bu sayıyı artırır ve azaltmayı sağlar.

Kullanıcı etkin nesneleri (etkin nesne sayısının sıfır olmayan bir uygulama) bulunduğu bir uygulamayı kapatmaya çalıştığında, çerçeve uygulamayı tamamen kapatmak yerine kullanıcının görünümünden gizler. işlevi, AfxOleCanExitApp uygulamanın sonlandırılıp sonlandırılamayacağını gösterir.

Bir istemci uygulaması tarafından kullanılmaya devam ederken nesnenin yok edilmesi istenmiyorsa OLE arabirimlerini kullanıma sunan herhangi bir nesneden çağrı AfxOleLockApp yapın. Oluşturucuda çağıran herhangi bir nesnenin yıkıcısını da çağırın AfxOleUnlockApp AfxOleLockApp . Varsayılan olarak, COleDocument (ve türetilmiş sınıflar) uygulamayı otomatik olarak kilitler ve kilidini açar.

Örnek

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

Gereksinimler

Üst bilgi: afxdisp.h

AfxOleUnlockApp

Çerçevenin uygulamadaki etkin nesne sayısını azaltma.

void AFXAPI AfxOleUnlockApp();

Açıklamalar

Daha fazla bilgi için bkz AfxOleLockApp .

Etkin nesne sayısı sıfıra ulaştığında çağrılır AfxOleOnReleaseAllObjects .

Örnek

AfxOleLockApp örneğine bakın.

Gereksinimler

Üst bilgi: afxdisp.h

AfxOleLockControl

Denetimle ilişkili dinamik olarak oluşturulan verilerin bellekte kalması için belirtilen denetimin sınıf fabrikasını kilitler.

Sözdizimi

BOOL AFXAPI AfxOleLockControl(  REFCLSID clsid  );
BOOL AFXAPI AfxOleLockControl( LPCTSTR lpszProgID );

Parametreler

clsid
Denetimin benzersiz sınıf kimliği.

lpszProgID
Denetimin benzersiz program kimliği.

Dönüş Değeri

Denetimin sınıf fabrikası başarıyla kilitlendiyse sıfır olmayan; aksi takdirde 0.

Açıklamalar

Bu, denetimlerin görüntülenmesini önemli ölçüde hızlandırabilir. Örneğin, bir iletişim kutusunda bir denetim oluşturup ile AfxOleLockControldenetimi kilitledikten sonra, iletişim kutusu her gösterildiğinde veya yok edilişinde yeniden oluşturmanız ve sonlandırmanız gerekmez. Kullanıcı bir iletişim kutusunu tekrar tekrar açar ve kapatırsa, denetimlerinizin kilitlenmesi performansı önemli ölçüde artırabilir. Denetimi yok etmeye hazır olduğunuzda öğesini çağırın AfxOleUnlockControl.

Örnek

// 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"));

Gereksinimler

Üst bilgi: afxwin.h

AfxOleRegisterServerClass

Bu işlev, sunucunuzu OLE sistem kayıt defterine kaydetmenizi sağlar.

BOOL AFXAPI AfxOleRegisterServerClass(
    REFCLSID clsid,
    LPCTSTR lpszClassName,
    LPCTSTR lpszShortTypeName,
    LPCTSTR lpszLongTypeName,
    OLE_APPTYPE nAppType = OAT_SERVER,
    LPCTSTR* rglpszRegister = NULL,
    LPCTSTR* rglpszOverwrite = NULL);

Parametreler

clsid
Sunucunun OLE sınıf kimliğine başvuru.

lpszClassName
Sunucu nesnelerinin sınıf adını içeren bir dize işaretçisi.

lpszShortTypeName
Sunucunun nesne türünün kısa adını içeren bir dizenin işaretçisi, örneğin "Grafik."

lpszLongTypeName
"Microsoft Excel 5.0 Grafiği" gibi sunucu nesne türünün uzun adını içeren bir dize işaretçisi.

nAppType
OLE_APPTYPE numaralandırmasından alınan ve OLE uygulamasının türünü belirten bir değer. Olası değerler şunlardır:

  • OAT_INPLACE_SERVER Sunucusu tam sunucu kullanıcı arabirimine sahiptir.

  • OAT_SERVER Sunucusu yalnızca ekleme işlemini destekler.

  • OAT_CONTAINER Kapsayıcısı ekleme bağlantılarını destekler.

  • IDispatchOAT_DISPATCH_OBJECT özellikli nesne.

rglpszRegister
Anahtarlar için mevcut değer bulunamazsa OLE sistem kayıt defterine eklenecek anahtarları ve değerleri temsil eden dizelere yönelik işaretçi dizisi.

rglpszOverwrite
Kayıt defteri verilen anahtarlar için mevcut değerler içeriyorsa, OLE sistem kayıt defterine eklenecek anahtarları ve değerleri temsil eden dizelere yönelik işaretçi dizisi.

Dönüş Değeri

Sunucu sınıfı başarıyla kaydedildiyse sıfır olmayan; aksi takdirde 0.

Açıklamalar

Çoğu uygulama, uygulamanın belge türlerini kaydetmek için kullanabilir COleTemplateServer::Register . Uygulamanızın sistem kayıt defteri biçimi normal desene uymuyorsa, daha fazla denetim için kullanabilirsiniz AfxOleRegisterServerClass .

Kayıt defteri bir dizi anahtar ve değerden oluşur. rglpszRegister ve rglpszOverwrite bağımsız değişkenleri, dizelere yönelik işaretçi dizileridir ve her biri bir anahtardan ve NULL karakteriyle ( '\0') ayrılmış bir değerden oluşur. Bu dizelerin her biri, yerleri %1 ile %5 karakter dizileri arasında işaretlenmiş değiştirilebilir parametrelere sahip olabilir.

Simgeler aşağıdaki gibi doldurulur:

Simge Değer
%1 Dize olarak biçimlendirilmiş Sınıf Kimliği
%2 Sınıf adı
%3 Yürütülebilir dosyanın yolu
%4 Kısa tür adı
%5 Uzun tür adı

Gereksinimler

Üst bilgi: afxdisp.h

AfxOleSetEditMenu

typename Object komutu için kullanıcı arabirimini uygular.

void AFXAPI AfxOleSetEditMenu(
    COleClientItem* pClient,
    CMenu* pMenu,
    UINT iMenuItem,
    UINT nIDVerbMin,
    UINT nIDVerbMax = 0,
    UINT nIDConvert = 0);

Parametreler

pClient
İstemci OLE öğesinin işaretçisi.

pMenu
Güncelleştirilecek menü nesnesinin işaretçisi.

iMenuItem
Güncelleştirilecek menü öğesinin dizini.

nIDVerbMin
Birincil fiile karşılık gelen komut kimliği.

nIDVerbMax
Son fiile karşılık gelen komut kimliği.

nIDConvert
Dönüştür menü öğesinin kimliği.

Açıklamalar

Sunucu yalnızca bir birincil fiili tanırsa, menü öğesi "fiil türadı Nesnesi" olur ve kullanıcı komutu seçtiğinde nIDVerbMin komutu gönderilir. Sunucu birkaç fiil tanırsa, menü öğesi " typename Object" olur ve kullanıcı komutu seçtiğinde tüm fiilleri listeleyen bir alt menü görüntülenir. Kullanıcı alt menüden bir fiil seçtiğinde, ilk fiil seçilirse nIDVerbMin gönderilir, ikinci fiil seçilirse nIDVerbMin + 1 gönderilir, vb. Varsayılan COleDocument uygulama bu özelliği otomatik olarak işler.

İstemcinizin uygulama kaynak betiğinde (. RC) dosyası:

<#include afxolecl.rc>

Gereksinimler

Üst bilgi: afxole.h

AfxOleUnlockControl

Belirtilen denetimin sınıf fabrikasının kilidini açar.

Sözdizimi

BOOL AFXAPI AfxOleUnlockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleUnlockControl( LPCTSTR lpszProgID );

Parametreler

clsid
Denetimin benzersiz sınıf kimliği.

lpszProgID
Denetimin benzersiz program kimliği.

Dönüş Değeri

Denetimin sınıf fabrikasının kilidi başarıyla açıldıysa sıfır olmayan; aksi takdirde 0.

Açıklamalar

Denetim ile AfxOleLockControlkilitlendiğinden, denetimle ilişkili dinamik olarak oluşturulan veriler bellekte kalır. Bu, denetimin her görüntülendiğinde oluşturulması ve yok edilmesi gerekmediğinden denetimin görüntülenmesini önemli ölçüde hızlandırabilir. Denetimi yok etmeye hazır olduğunuzda öğesini çağırın AfxOleUnlockControl.

Örnek

// Unlock control's (Microsoft Calendar Control) class factory.

AfxOleUnlockControl(_T("MSCAL.Calendar"));

Gereksinimler

Üst bilgi: afxwin.h

Ayrıca bkz.

Makrolar ve Genel Ayarlar