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 COleMessageFilter
uygulama 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 AfxOleGetUserCtrl
açı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 AfxOleLockControl
denetimi 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.
IDispatch
OAT_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 AfxOleLockControl
kilitlendiğ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