Controllo applicazione
OLE richiede un controllo sostanziale sulle applicazioni e sui relativi oggetti. Le DLL di sistema OLE devono essere in grado di avviare e rilasciare automaticamente applicazioni, coordinare la produzione e la modifica degli oggetti e così via. Le funzioni di questo argomento soddisfano tali requisiti. Oltre a essere chiamato dalle DLL di sistema OLE, queste funzioni devono talvolta essere chiamate anche dalle applicazioni.
Controllo applicazione
Nome | Descrizione |
---|---|
AfxOleCanExitApp | Indica se l'applicazione può terminare. |
AfxOleGetMessageFilter | Recupera il filtro messaggi corrente dell'applicazione. |
AfxOleGetUserCtrl | Recupera il flag corrente del controllo utente. |
AfxOleSetUserCtrl | Imposta o cancella il flag di controllo utente. |
AfxOleLockApp | Incrementa il conteggio globale del framework del numero di oggetti attivi in un'applicazione. |
AfxOleLockControl | Blocca la class factory del controllo specificato. |
AfxOleUnlockApp | Decrementa il conteggio del framework del numero di oggetti attivi in un'applicazione. |
AfxOleUnlockControl | Sblocca la class factory del controllo specificato. |
AfxOleRegisterServerClass | Registra un server nel Registro di sistema OLE. |
AfxOleSetEditMenu | Implementa l'interfaccia utente per il comando typename Object. |
AfxOleCanExitApp
Indica se l'applicazione può terminare.
BOOL AFXAPI AfxOleCanExitApp();
Valore restituito
Diverso da zero se l'applicazione può essere chiusa; in caso contrario, 0.
Osservazioni:
Un'applicazione non deve terminare se sono presenti riferimenti a oggetti in attesa. Le funzioni globali AfxOleLockApp
e AfxOleUnlockApp
rispettivamente incrementano e decrementano un contatore di riferimenti agli oggetti dell'applicazione. L'applicazione non deve terminare quando questo contatore è diverso da zero. Se il contatore è diverso da zero, quando l'utente sceglie Chiudi dal menu di sistema o Esci dal menu File la finestra principale dell'applicazione viene nascosta (non eliminata definitivamente). Il framework chiama questa funzione in CFrameWnd::OnClose
.
Esempio
// 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;
}
}
Requisiti
Intestazione: afxdisp.h
AfxOleGetMessageFilter
Recupera il filtro messaggi corrente dell'applicazione.
COleMessageFilter* AFXAPI AfxOleGetMessageFilter();
Valore restituito
Puntatore al filtro messaggi corrente.
Osservazioni:
Chiamare questa funzione per accedere all'oggetto derivato da COleMessageFilter
corrente, in modo analogo a come si utilizza AfxGetApp
per accedere all'oggetto applicazione corrente.
Esempio
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();
}
//...
//...
//...
}
Requisiti
Intestazione: afxwin.h
AfxOleGetUserCtrl
Recupera il flag corrente del controllo utente.
BOOL AFXAPI AfxOleGetUserCtrl();
Valore restituito
Diverso da zero se l'utente controlla l'applicazione; in caso contrario, 0.
Osservazioni:
L'utente controlla l'applicazione quando apre o crea in modo esplicito un nuovo documento. L'utente controlla inoltre l'applicazione se l'applicazione non è stata avviata dalle DLL del sistema OL, in altre parole se l'utente ha avviato l'applicazione con la shell di sistema.
Requisiti
Intestazione: afxdisp.h
AfxOleSetUserCtrl
Imposta o cancella il flag di controllo utente, illustrato nel riferimento per AfxOleGetUserCtrl
.
void AFXAPI AfxOleSetUserCtrl(BOOL bUserCtrl);
Parametri
bUserCtrl
Specifica se il flag di controllo utente deve essere impostato o cancellato.
Osservazioni:
Il framework chiama questa funzione quando l'utente crea o carica un documento, ma non quando un documento viene caricato o creato tramite un'azione indiretta, ad esempio il caricamento di un oggetto incorporato da un'applicazione contenitore.
Chiamare questa funzione se altre azioni nell'applicazione devono mettere l'utente sotto controllo dell'applicazione.
Requisiti
Intestazione: afxdisp.h
AfxOleLockApp
Incrementa il conteggio globale del framework del numero di oggetti attivi nell'applicazione.
void AFXAPI AfxOleLockApp();
Osservazioni:
Il framework mantiene un conteggio del numero di oggetti attivi in un'applicazione. Le AfxOleLockApp
funzioni e AfxOleUnlockApp
, rispettivamente, incrementa e decrementa questo conteggio.
Quando l'utente tenta di chiudere un'applicazione con oggetti attivi, un'applicazione per cui il conteggio degli oggetti attivi è diverso da zero, il framework nasconde l'applicazione dalla visualizzazione dell'utente anziché chiuderla completamente. La AfxOleCanExitApp
funzione indica se l'applicazione può terminare.
Chiamare AfxOleLockApp
da qualsiasi oggetto che espone le interfacce OLE, se sarebbe indesiderato che tale oggetto venga eliminato definitivamente mentre è ancora in uso da un'applicazione client. Chiamare AfxOleUnlockApp
anche nel distruttore di qualsiasi oggetto che chiama AfxOleLockApp
nel costruttore. Per impostazione predefinita, COleDocument
(e le classi derivate) bloccano e sbloccano automaticamente l'applicazione.
Esempio
// 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();
}
Requisiti
Intestazione: afxdisp.h
AfxOleUnlockApp
Decrementa il numero di oggetti attivi del framework nell'applicazione.
void AFXAPI AfxOleUnlockApp();
Osservazioni:
Per altre informazioni, vedere AfxOleLockApp
.
Quando il numero di oggetti attivi raggiunge zero, AfxOleOnReleaseAllObjects
viene chiamato .
Esempio
Vedere l'esempio per AfxOleLockApp.
Requisiti
Intestazione: afxdisp.h
AfxOleLockControl
Blocca la class factory del controllo specificato in modo che i dati creati dinamicamente associati al controllo rimangano in memoria.
Sintassi
BOOL AFXAPI AfxOleLockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleLockControl( LPCTSTR lpszProgID );
Parametri
clsid
ID univoco della classe del controllo.
lpszProgID
ID univoco del programma del controllo.
Valore restituito
Diverso da zero se la class factory del controllo è stata bloccata con successo; in caso contrario, 0.
Osservazioni:
Ciò può accelerare notevolmente la visualizzazione dei comandi. Ad esempio, una volta creato un controllo in una finestra di dialogo e bloccato il controllo con AfxOleLockControl
, non è necessario crearlo e interromperne l'esecuzione ogni volta che la finestra di dialogo viene visualizzata o viene terminata in modo permanente. Se l'utente apre e chiude una finestra di dialogo ripetutamente, il blocco dei controlli può migliorare significativamente le prestazioni. Quando si è pronti per eliminare il controllo in modo permanente, chiamare AfxOleUnlockControl
.
Esempio
// 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"));
Requisiti
Intestazione: afxwin.h
AfxOleRegisterServerClass
Questa funzione consente di registrare il server nel Registro di sistema OLE.
BOOL AFXAPI AfxOleRegisterServerClass(
REFCLSID clsid,
LPCTSTR lpszClassName,
LPCTSTR lpszShortTypeName,
LPCTSTR lpszLongTypeName,
OLE_APPTYPE nAppType = OAT_SERVER,
LPCTSTR* rglpszRegister = NULL,
LPCTSTR* rglpszOverwrite = NULL);
Parametri
clsid
Riferimento all'ID classe OLE del server.
lpszClassName
Puntatore a una stringa contenente il nome della classe degli oggetti del server.
lpszShortTypeName
Puntatore a una stringa contenente il nome breve del tipo di oggetto del server, ad esempio "Chart".
lpszLongTypeName
Puntatore a una stringa contenente il nome lungo del tipo di oggetto del server, ad esempio "Grafico di Microsoft Excel 5.0".
nAppType
Valore, tratto dall'enumerazione OLE_APPTYPE, specificando il tipo di applicazione OLE. I valori possibili sono i seguenti:
OAT_INPLACE_SERVER Server ha un'interfaccia utente server completa.
OAT_SERVER Server supporta solo l'incorporamento.
OAT_CONTAINER Contenitore supporta i collegamenti agli incorporamenti.
IDispatch
OAT_DISPATCH_OBJECT oggetto con supporto.
rglpszRegister
Matrice di puntatori a stringhe che rappresentano le chiavi e i valori da aggiungere al Registro di sistema OLE se non vengono trovati valori esistenti per le chiavi.
rglpszOverwrite
Matrice di puntatori a stringhe che rappresentano le chiavi e i valori da aggiungere al Registro di sistema OLE se il Registro di sistema contiene valori esistenti per le chiavi indicate.
Valore restituito
Diverso da zero se la classe server è stata registrata correttamente; in caso contrario, 0.
Osservazioni:
La maggior parte delle applicazioni può usare COleTemplateServer::Register
per registrare i tipi di documento dell'applicazione. Se il formato del Registro di sistema dell'applicazione non rientra nel modello tipico, è possibile usare AfxOleRegisterServerClass
per un maggiore controllo.
Il Registro di sistema è costituito da un set di chiavi e valori. Gli argomenti rglpszRegister e rglpszOverwrite sono matrici di puntatori alle stringhe, ognuno costituito da una chiave e da un valore separato da un carattere NULL ( '\0'
). Ognuna di queste stringhe può avere parametri sostituibili le cui posizioni sono contrassegnate dalle sequenze di caratteri da %1 a %5.
I simboli vengono compilati nel modo seguente:
Simbolo | Valore |
---|---|
%1 | ID classe, formattato come stringa |
2% | Nome classe |
%3 | Percorso del file eseguibile |
4% | Nome di tipo breve |
%5 | Nome tipo lungo |
Requisiti
Intestazione: afxdisp.h
AfxOleSetEditMenu
Implementa l'interfaccia utente per il comando typename Object.
void AFXAPI AfxOleSetEditMenu(
COleClientItem* pClient,
CMenu* pMenu,
UINT iMenuItem,
UINT nIDVerbMin,
UINT nIDVerbMax = 0,
UINT nIDConvert = 0);
Parametri
pClient
Puntatore all'elemento OLE client.
pMenu
Puntatore all'oggetto menu da aggiornare.
iMenuItem
Indice della voce di menu da aggiornare.
nIDVerbMin
ID comando che corrisponde al verbo primario.
nIDVerbMax
ID comando corrispondente all'ultimo verbo.
nIDConvert
ID per la voce di menu Converti.
Osservazioni:
Se il server riconosce solo un verbo primario, la voce di menu diventa "verbo typename Object" e il comando nIDVerbMin viene inviato quando l'utente sceglie il comando. Se il server riconosce diversi verbi, la voce di menu diventa " typename Object" e un sottomenu che elenca tutti i verbi viene visualizzato quando l'utente sceglie il comando. Quando l'utente sceglie un verbo dal sottomenu, nIDVerbMin viene inviato se viene scelto il primo verbo, nIDVerbMin + 1 viene inviato se viene scelto il secondo verbo e così via. L'implementazione predefinita COleDocument
gestisce automaticamente questa funzionalità.
È necessario disporre dell'istruzione seguente nello script di risorse dell'applicazione del client (. File RC):
<#include afxolecl.rc>
Requisiti
Intestazione: afxole.h
AfxOleUnlockControl
Sblocca la class factory del controllo specificato.
Sintassi
BOOL AFXAPI AfxOleUnlockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleUnlockControl( LPCTSTR lpszProgID );
Parametri
clsid
ID univoco della classe del controllo.
lpszProgID
ID univoco del programma del controllo.
Valore restituito
Diverso da zero se la class factory del controllo è stata sbloccata correttamente; in caso contrario, 0.
Osservazioni:
Un controllo è bloccato con AfxOleLockControl
, in modo che i dati creati dinamicamente associati al controllo rimangano in memoria. Ciò può velocizzare notevolmente la visualizzazione del controllo perché il controllo non deve essere creato e distrutto ogni volta che viene visualizzato. Quando si è pronti per eliminare il controllo in modo permanente, chiamare AfxOleUnlockControl
.
Esempio
// Unlock control's (Microsoft Calendar Control) class factory.
AfxOleUnlockControl(_T("MSCAL.Calendar"));
Requisiti
Intestazione: afxwin.h