Condividi tramite


Esempio DLLScreenCap: illustrazione di una DLL regolare collegata a MFC in modo statico o dinamico

Aggiornamento: novembre 2007

Nell'esempio DLLScreenCap viene illustrata una versione DLL (Dynamic-Link Library) di uno strumento per l'acquisizione di immagini dallo schermo. DLLScreenCap sostituisce l'esempio DLLTRACE, che è obsoleto. DLLTRACE era stato introdotto in MFC versione 1.0 per illustrare come scrivere una DLL collegata in modo statico alla libreria MFC. DLLScreenCap fornisce un'interfaccia di programma basata su C per l'applicazione basata su Microsoft Windows a cui è collegato in modo dinamico. Una DLL collegata in modo statico alla libreria MFC non può esportare correttamente le funzioni membro di tutte le classi derivate dalle classi MFC.

La tecnica di collegamento statico di una DLL alla libreria MFC viene illustrata nella Nota tecnica 11: Utilizzo di MFC come parte di una DLL. L'esempio DLLScreenCap può essere collegato a MFC anche in modo dinamico, senza diventare una DLL di estensione. Prima di decidere di implementare una DLL personalizzata collegandola a MFC in modo statico, si consideri la possibilità di implementarla come una DLL di estensione MFC, come illustrato nella Nota tecnica 33: Versione DLL di MFC e come illustrato nell'esempio DLLHUSK.

Una DLL non di estensione collegata alla libreria MFC richiede una classe derivata CWinApp e un singolo oggetto della classe di applicazioni, in modo analogo a un'applicazione MFC eseguibile. A differenza dell'oggetto CWinApp di un'applicazione, tuttavia, l'oggetto CWinApp della DLL non dispone di un message pump principale. Se la DLL apre finestre di dialogo non modali o dispone di una propria finestra cornice principale, il message pump principale dell'applicazione deve chiamare una routine esportata dalla DLL, che chiama a sua volta la funzione membro CWinApp::PreTranslateMessage dell'oggetto applicazione della DLL. Questa procedura viene illustrata dalla funzione FilterDllMsg esportata da DLLScreenCap.dll.

In ScreenCapApi.h viene dimostrato che un modo per fornire un'interfaccia DLL alle applicazioni client consiste nel dichiarare le funzioni con extern "C". L'utilizzo di extern "C" presenta diversi vantaggi. Innanzitutto, rende la DLL utilizzabile dalle applicazioni client non C++. In secondo luogo, riduce l'overhead della DLL, poiché la decorazione dei nomi C++ non verrà applicata al nome esportato. Infine, semplifica l'aggiunta in modo esplicito a un file DEF (per l'esportazione tramite ordinale) consentendo di non preoccuparsi della decorazione dei nomi C++.

Nota sulla sicurezza:

Il codice di esempio viene fornito per illustrare un concetto e non deve essere utilizzato in applicazioni o siti Web in quanto potrebbe non rappresentare le procedure di codifica più sicure. Microsoft esclude qualsiasi responsabilità di danni diretti o indiretti qualora il codice di esempio venga utilizzato per scopi diversi da quelli a cui è destinato.

Per ottenere gli esempi e le istruzioni per l'installazione:

  • In Visual Studio scegliere Esempi dal menu ?.

    Per ulteriori informazioni, vedere Individuazione dei file di esempio.

  • La versione più recente e l'elenco completo degli esempi sono disponibili in linea alla pagina Visual Studio 2008 Samples.

  • È anche possibile trovare gli esempi sul disco rigido del computer. Per impostazione predefinita, gli esempi e il file Leggimi vengono copiati in una cartella nel percorso \Programmi\Visual Studio 9.0\Samples\. Per le versioni Express di Visual Studio, tutti gli esempi sono disponibili in linea.

Generazione ed esecuzione dell'esempio

L'esempio DLLScreenCap è costituito da due progetti: DLLScreenCap, un progetto DLL, e ScreenCap, un progetto EXE che effettua chiamate nella DLL.

La generazione di ScreenCap dalla soluzione fornita crea automaticamente DLLScreenCap e copia la DLL nella directory di output di ScreenCap.

Nota   Poiché nell'esempio viene utilizzata un'istruzione di generazione personalizzata per la copia di un file, è opportuno aprire la soluzione utilizzando un percorso UNC. In alternativa, inserire i file dell'esempio in una directory con una lettera di unità.

Per generare ed eseguire l'esempio DLLScreenCap

  1. Aprire il file di soluzione DllScreenCap.sln.

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sulla cartella di progetto ScreenCap, quindi scegliere Imposta come progetto di avvio dal menu di scelta rapida.

  3. Scegliere Genera dal menu Genera.

  4. Scegliere Avvia senza eseguire debug dal menu Debug.

Nella finestra ScreenCap viene visualizzata l'ultima schermata catturata dopo l'adattamento delle dimensioni della finestra. Scegliere Configure Screen Capture dal menu File. Viene aperta una finestra di dialogo che consente di impostare la cattura della schermata o della finestra attiva e di specificare un percorso in cui salvare il file dell'immagine catturata. Scegliere Screen Capture per creare un file dell'immagine catturata e aggiornare la visualizzazione della finestra client.

Conversione di DLLScreenCap per il collegamento dinamico alla DLL MFC

In DLLScreenCap viene illustrato come creare una DLL regolare con una funzione esportata che può essere chiamata per visualizzare una finestra di dialogo modale. Nella versioni precedenti di Visual C++ si trattava dell'unica opzione disponibile per le DLL regolari. Questi tipi di DLL erano precedentemente noti come _USRDLL.

Attualmente, è possibile che una DLL regolare utilizzi MFC dalla DLL MFCx0 condivisa. Per ridurre le dimensioni della generazione, è preferibile generare l'esempio DLLScreenCap utilizzando la DLL MFC condivisa. Grazie al supporto della libreria condivisa in DLLScreenCap.dll, le dimensioni della DLL di una build di rilascio vengono ridotte da oltre 100 K a circa 16 K e le dimensioni della build di debug da oltre 1 MB a 100 K. Per supportare il collegamento in modo dinamico in DLLScreenCap, utilizzare la macro AFX_MANAGE_STATE per convertire lo stato del modulo MFC globale in modo corretto.

Per verificare che DLLScreenCap possa essere utilizzato in una libreria condivisa

  1. Fare clic con il pulsante destro del mouse sul nodo del progetto ScreenCap in Esplora soluzioni, quindi scegliere Proprietà dal menu di scelta rapida.

    Verrà visualizzata la finestra di dialogo Pagine delle proprietà.

  2. Scegliere Configurazioni multiple dal menu a discesa Configurazione. Per ulteriori informazioni sulla finestra di dialogo Pagine delle proprietà, vedere Impostazione delle proprietà dei progetti Visual C++.

  3. Selezionare entrambe le generazioni Release e Debug per modificarne le impostazioni.

  4. Nella Pagina delle proprietà Generale del progetto, verificare che sia selezionata la proprietà Uso di MFC per l'utilizzo di MFC in una DLL condivisa.

  5. Verificare che la seguente riga di codice si trovi all'inizio di ciascuna funzione esportata dalla DLL (per ulteriori informazioni, vedere Gestione dei dati dello stato dei moduli MFC):

    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    

DllScreenCap.dll, ad esempio, esporta quattro funzioni:

  • CaptureScreen

  • ConfigureCapture

  • ProcessDLLIdle

  • FilterDLLMsg

FilterDLLMsg dopo la conversione apparirà nel modo seguente:

BOOL WINAPI FilterDllMsg(LPMSG lpMsg)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState())
   TRY
   {
       return AfxGetApp()->PreTranslateMessage(lpMsg);
   }
   END_TRY
return FALSE;
}

Parole chiave

Nell'esempio vengono illustrate le seguenti parole chiave:

CDialog::DoModal, CWinApp::InitInstance, CWinApp::OnIdle, CWinApp::PreTranslateMessage, CWnd::DoDataExchange, CWnd::GetClientRect, CWnd::OnPaint, ShowWindow, UpdateWindow, CImage, AFX_MANAGE_STATE, AfxGetStaticModuleState, CWnd::GetDesktopWindow, CWnd::GetActiveWindow, CImage::Create, CImageDC, CImage::Save, SHBrowseForFolder, CImage::Load, CDC::SetStretchBltMode, CImage::StretchBlt, CWnd::OnEraseBkgnd, CWindowDC

Vedere anche

Altre risorse

Esempi relativi ad MFC