Ejemplo DLLScreenCap: muestra una biblioteca DLL normal que se vincula a MFC de forma estática o dinámica
Actualización: noviembre 2007
El ejemplo DLLScreenCap ilustra una versión de biblioteca de vínculos dinámicos (DLL) de una herramienta de captura de pantallas. DLLScreenCap reemplaza el ejemplo DLLTRACE, que ha quedado obsoleto. DLLTRACE se incluyó en MFC versión 1.0 para ilustrar la forma de escribir un archivo DLL vinculado estáticamente a la biblioteca MFC. DLLScreenCap proporciona a la aplicación para Microsoft Windows a la que está vinculada dinámicamente una interfaz de programa basada en C. Un archivo DLL vinculado estáticamente a la biblioteca MFC no puede exportar correctamente funciones miembro de ninguna clase derivada de las clases MFC.
La técnica de vincular estáticamente un archivo DLL a la biblioteca MFC se describe en Nota técnica 11: Utilizar MFC como parte de un archivo DLL. El ejemplo DLLScreenCap también se puede vincular dinámicamente a MFC, sin ser un archivo DLL de extensión. Antes de decidir implementar un archivo DLL personalizado mediante vinculación estática a MFC, considere la posibilidad de implementarlo como un archivo DLL de extensión MFC, como se explica en la Nota técnica 33: Versión de DLL de MFC y como se ilustra mediante el ejemplo DLLHUSK.
Un archivo DLL que no sea de extensión y que esté vinculado a la biblioteca MFC necesita una clase derivada de CWinApp y un único objeto de esa clase de aplicación, de la misma manera que una aplicación MFC ejecutable. Sin embargo, el objeto CWinApp del archivo DLL no tiene un suministro principal de mensajes, como el objeto CWinApp de una aplicación. Si el archivo DLL abre cuadros de diálogo no modales o tiene una ventana de marco principal propia, el suministro principal de mensajes de la aplicación deberá llamar a una rutina exportada por el archivo DLL que, a su vez, llamará a la función miembro de CWinApp::PreTranslateMessage del objeto de aplicación del archivo DLL. Esto se ilustra mediante la función FilterDllMsg exportada por DLLScreenCap.dll.
ScreenCapApi.h muestra que una forma de proporcionar una interfaz de archivo DLL a aplicaciones de cliente es declarar funciones con extern "C". El uso de extern "C" ofrece varias ventajas. En primer lugar, permite que aplicaciones de cliente que no están programadas en C++ utilicen el archivo DLL. En segundo lugar, reduce la sobrecarga del archivo, puesto que no se decorará el nombre exportado. En tercer lugar, facilita la adición explícita a un archivo .def file (para exportar por ordinal), sin tener que pensar en la decoración de nombres de C++.
Nota de seguridad: |
---|
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que quizás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales o consecuenciales en caso de que el código de ejemplo se utilice para otros propósitos distintos de aquellos para los que se concibió. |
Para obtener ejemplos e instrucciones para su instalación:
En el menú Ayuda de Visual Studio, haga clic en Ejemplos.
Para obtener más información, vea Localizar archivos de ejemplo.
La lista de ejemplos completa con la versión más reciente está disponible en línea en la página Visual Studio 2008 Samples.
También encontrará ejemplos en el disco duro de su equipo. De manera predeterminada, los ejemplos y el archivo Léame se copian en una carpeta bajo \Archivos de programa\Visual Studio 9.0\Samples\. Para las versiones Express de Visual Studio, todos los ejemplos están en línea.
Generar y ejecutar el ejemplo
El ejemplo DLLScreenCap consta de dos proyectos: DLLScreenCap (un proyecto de archivo DLL) y ScreenCap (un proyecto EXE que llama a funciones del archivo DLL).
Al generar ScreenCap a partir de la solución proporcionada se generará automáticamente DLLScreenCap y se copiará el archivo DLL en el directorio de resultados de ScreenCap.
Nota Como este ejemplo utiliza un paso de generación personalizada para copiar un archivo, no debe abrir la solución mediante una ruta UNC; coloque los archivos del ejemplo en un directorio con una letra de unidad.
Para generar y ejecutar el ejemplo DLLScreenCap
Abra la solución DllScreenCap.sln.
En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en la carpeta del proyecto ScreenCap y, a continuación, haga clic en Establecer como proyecto de inicio en el menú de acceso directo.
En el menú Generar, haga clic en Generar.
En el menú Depurar, haga clic en Iniciar sin depurar.
La ventana de ScreenCap muestra la última pantalla capturada después de cambiar la escala al tamaño de la ventana. Haga clic en el comando Configure Screen Capture del menú File. Se abrirá un cuadro de diálogo en el que podrá especificar si desea capturar la pantalla o la ventana activa, así como la ruta en la que desea guardar el archivo capturado. Haga clic en Screen Capture para crear un archivo capturado y actualizar la presentación de la ventana del cliente.
Convertir DLLScreenCap para vincularlo dinámicamente al archivo DLL de MFC
DLLScreenCap ilustra la forma de crear un archivo DLL estándar con una función exportada a la que se puede llamar para mostrar un cuadro de diálogo modal. En versiones antiguas de Visual C++, ésta era la única opción disponible para los archivos DLL estándar. Antes se llamaba _USRDLL a este tipo de archivo DLL.
Ahora un archivo DLL estándar puede utilizar MFC desde el archivo DLL MFCx0 compartido. Es posible que desee generar el ejemplo DLLScreenCap con el archivo DLL compartido, puesto que así se reducirá el tamaño del resultado de la generación. Si se incluye compatibilidad con la biblioteca compartida en DLLScreenCap.dll, se reducirá el tamaño de un archivo DLL de lanzamiento de más de 100 Kb a unos 16 Kb, y se reducirá el tamaño de la versión de depuración de más de 1 megabyte a 100 Kb. Para incluir compatibilidad con la vinculación dinámica en DLLScreenCap, utilice la macro AFX_MANAGE_STATE para cambiar correctamente el estado del módulo MFC global.
Para comprobar que se utiliza DLLScreenCap en una biblioteca compartida
En el Explorador de soluciones, haga clic con el botón secundario del mouse en el nodo del proyecto ScreenCap y haga clic en el comando Propiedades del menú de acceso directo.
Aparecerá el cuadro de diálogo Páginas de propiedades.
En el menú desplegable Configuración, seleccione Varias configuraciones. Vea Establecer las propiedades de un proyecto de Visual C++ para obtener información sobre el cuadro de diálogo Páginas de propiedades.
Seleccione las generaciones Lanzamiento y Depuración para cambiar sus configuraciones.
En la página de propiedades General del proyecto, compruebe que la propiedad Uso de MFC está activada para utilizar MFC en una propiedad de archivo DLL compartido.
Compruebe que la siguiente línea de código está al principio de cada función exportada desde el archivo DLL (vea una descripción en Administrar los datos de estado de los módulos MFC):
AFX_MANAGE_STATE(AfxGetStaticModuleState())
Por ejemplo, DllScreenCap.dll exporta cuatro funciones:
CaptureScreen
ConfigureCapture
ProcessDLLIdle
FilterDLLMsg
En la forma convertida, FilterDLLMsg debería tener el siguiente aspecto:
BOOL WINAPI FilterDllMsg(LPMSG lpMsg)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
TRY
{
return AfxGetApp()->PreTranslateMessage(lpMsg);
}
END_TRY
return FALSE;
}
Palabras clave
En este ejemplo, se ilustra el uso de las siguientes palabras clave:
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