DLLScreenCap, exemple : illustre une DLL normale qui se lie statiquement ou dynamiquement aux MFC
Mise à jour : novembre 2007
L'exemple DLLScreenCap illustre une version DLL (bibliothèque de liens dynamiques) d'un outil de capture d'écran. DLLScreenCap annule et remplace l'exemple DLLTRACE devenu obsolète. DLLTRACE a été introduit dans la version 1.0 des MFC pour montrer comment écrire une DLL liée statiquement à la bibliothèque MFC. L'exemple DLLScreenCap offre une interface de programmation en C vers l'application Microsoft Windows à laquelle il est lié dynamiquement. Une DLL qui est liée statiquement à la bibliothèque MFC n'est pas capable d'exporter les fonctions membres de classes dérivées de classes MFC.
La technique de liaison statique d'une DLL à la bibliothèque MFC est décrite dans la note technique 11 : Utilisation de MFC dans le cadre d'une DLL. L'exemple DLLScreenCap peut également être lié dynamiquement aux MFC sans être une DLL d'extension. Avant de décider d'implémenter une DLL personnalisée en la liant statiquement aux MFC, envisagez de l'implémenter comme une DLL d'extension MFC, comme l'explique la note technique 33 : Version DLL de MFC et l'illustre l'exemple DLLHUSK.
Une DLL qui n'est pas une DLL d'extension et qui est liée à la bibliothèque MFC doit avoir une classe dérivée de CWinApp et un seul objet de cette classe d'application, à l'instar d'une application MFC exécutable. Cependant, contrairement à l'objet CWinApp d'une application, l'objet CWinApp de la DLL ne possède pas de pompe de messages principale. Si la DLL ouvre des boîtes de dialogue non modales ou possède une fenêtre frame principale qui lui est propre, la pompe de messages principale de l'application doit appeler une routine exportée par la DLL qui appelle à son tour la fonction membre CWinApp::PreTranslateMessage de l'objet application de la DLL. Ce processus est illustré par la fonction FilterDllMsg exportée par DLLScreenCap.dll.
ScreenCapApi.h montre comment fournir une interface DLL à des applications clientes en déclarant des fonctions avec extern "C". L'utilisation de extern "C" présente plusieurs avantages. Tout d'abord, elle permet l'utilisation de votre DLL par des applications clientes non-C++. Ensuite, elle réduit la charge mémoire de la DLL dans la mesure où la décoration C++ n'est pas appliquée au nom exporté. Enfin, elle facilite l'ajout explicite de fonctions à un fichier .def (en vue d'une exportation par ordinal) en éliminant la contrainte de la décoration des noms.
Note de sécurité : |
---|
Cet exemple de code est fourni pour illustrer un concept et ne doit pas être utilisé dans des applications ou des sites Web, car il peut ne pas illustrer les pratiques de programmation les plus sûres. Microsoft n'assume aucune responsabilité pour tout dommage indirect ou consécutif en cas d'utilisation de l'exemple de code à des fins autres que celles prévues. |
Pour obtenir des exemples et des instructions d'installation :
Dans le menu ? (Aide) de Visual Studio, cliquez sur Exemples.
Pour plus d'informations, consultez Recherche des fichiers d'exemple.
La liste la plus récente et la plus complète d'exemples est disponible en ligne à partir de la page Visual Studio 2008 Samples.
Des exemples sont également disponibles sur le disque dur de votre ordinateur. Des exemples et un fichier Readme sont stockés par défaut dans un dossier sous \Program Files\Visual Studio 9.0\Samples\. Pour les éditions Express de Visual Studio, tous les exemples sont disponibles en ligne.
Génération et exécution de l'exemple
L'exemple DLLScreenCap comprend deux projets : un projet DLL nommé DLLScreenCap et un projet EXE nommé ScreenCap qui effectue des appels vers la DLL.
La génération de ScreenCap à partir de la solution fournie entraîne automatiquement la génération de DLLScreenCap et la copie de la DLL dans le répertoire de sortie de ScreenCap.
Remarque Dans la mesure où cet exemple utilise une étape de génération personnalisée pour copier un fichier, vous ne devez pas ouvrir la solution à l'aide d'un chemin UNC ; placez les fichiers de l'exemple dans un répertoire doté d'une lettre de lecteur.
Pour générer et exécuter l'exemple DLLScreenCap
Ouvrez la solution DllScreenCap.sln.
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le dossier du projet ScreenCap, puis cliquez sur Définir comme projet de démarrage dans le menu contextuel.
Dans le menu Générer, cliquez sur Générer.
Dans le menu Déboguer, cliquez sur Exécuter sans débogage.
La fenêtre ScreenCap affiche le dernier écran capturé après l'avoir ajusté aux dimensions de la fenêtre. Dans le menu File, cliquez sur Configure Screen Capture. Cette action affiche une boîte de dialogue permettant de spécifier une capture de l'écran ou de la fenêtre active et d'indiquer le chemin de l'emplacement où enregistrer le fichier capturé. Cliquez sur Screen Capture pour créer un fichier de capture et mettre à jour l'affichage de la fenêtre cliente.
Conversion de DLLScreenCap pour une liaison dynamique à la DLL MFC
DLLScreenCap montre comment créer une DLL régulière avec une fonction exportée qui peut être appelée pour afficher une boîte de dialogue modale. Dans les versions antérieures de Visual C++, il s'agissait de la seule option disponible pour les DLL régulières. Les DLL de ce type étaient appelées _USRDLL.
Désormais, une DLL régulière peut utiliser les MFC à partir de la DLL MFCx0 partagée. Vous pouvez choisir d'utiliser la DLL MFC partagée pour générer l'exemple DLLScreenCap en vue de réduire la taille du projet généré. La prise en charge de la bibliothèque partagée dans DLLScreenCap.dll fait passer la taille de la DLL de 100 Ko à environ 16 Ko pour la version release et de 1 Mo à 100 Ko pour la version debug. Pour prendre en charge la liaison dynamique dans DLLScreenCap, utilisez la macro AFX_MANAGE_STATE pour changer correctement l'état global du module MFC.
Pour vérifier que DLLScreenCap peut être utilisé dans une bibliothèque partagée
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nœud du projet ScreenCap, puis cliquez sur Propriétés dans le menu contextuel.
La boîte de dialogue Pages de propriétés s'affiche.
Dans le menu déroulant Configuration, sélectionnez Configurations multiples. Pour plus d'informations sur la boîte de dialogue Pages de propriétés, consultez Définition des propriétés de projets Visual C++.
Sélectionnez les deux versions Release et Debug pour modifier leurs paramètres.
Dans la Page de propriétés générales du projet, vérifiez que la propriété Utilisation des MFC est configurée pour utiliser des MFC dans une DLL partagée.
Vérifiez la présence de la ligne de code suivante au début de chaque fonction exportée à partir de la DLL (consultez Gestion des données d'état des modules MFC pour une description complète) :
AFX_MANAGE_STATE(AfxGetStaticModuleState())
Par exemple, DllScreenCap.dll exporte quatre fonctions :
CaptureScreen
ConfigureCapture
ProcessDLLIdle
FilterDLLMsg
FilterDLLMsg doit présenter la forme suivante après conversion :
BOOL WINAPI FilterDllMsg(LPMSG lpMsg)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
TRY
{
return AfxGetApp()->PreTranslateMessage(lpMsg);
}
END_TRY
return FALSE;
}
Mots clés
Cet exemple illustre l'utilisation des mots clés suivants :
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