Образец DLLScreenCap: демонстрация регулярной библиотеки DLL со статической или динамической компоновкой с MFC
Обновлен: Ноябрь 2007
В образце DLLScreenCap показана версия средства съемки экрана, выполненная в виде библиотеки динамической компоновки (DLL). Образец DLLScreenCap заменяет образец DLLTRACE, который является устаревшим. Образец DLLTRACE входил в MFC версии 1.0 для демонстрации создания библиотеки, которая статически связана с библиотекой MFC. Образец DLLScreenCap предоставляет интерфейс программирования на основе языка C для приложений Microsoft Windows, с которыми он динамически связывается. Библиотека DLL, статически связанная с библиотекой MFC, не может экспортировать функции-члены любых классов, производных от классов MFC.
Метод статического связывания библиотеки DLL с библиотекой MFC обсуждается в статье Технические заметки 11. Использование MFC в составе библиотеки DLL (на английском языке). Образец DLLScreenCap также можно связать с MFC динамическим образом, не являясь библиотекой расширения. Перед тем, как принять решение о реализации пользовательской библиотеки DLL путем статической связи с MFC, рассмотрите возможность реализации в виде библиотеки расширения MFC, как описано в статье Технические заметки 33. DLL-версия MFC и показано в образце DLLHUSK.
Библиотека DLL, которая не является расширением и связана с библиотекой MFC, должна содержать класс, производный от CWinApp, и единственный объект этого класса приложений, как в исполняемом приложении MFC. Однако объект CWinApp библиотеки DLL, в отличие от объекта CWinApp приложения, не содержит главный цикл обработки сообщений. Если библиотека DLL открывает безрежимные диалоговые окна или имеет собственный фрейм окна, то в основном цикле сообщений приложения должна вызываться подпрограмма, экспортируемая библиотекой DLL, которая, в свою очередь, вызывает функцию-член CWinApp::PreTranslateMessage объекта приложения библиотеки DLL. Это показано в функции FilterDllMsg, экспортируемой библиотекой DLLScreenCap.dll.
В файле ScreenCapApi.h показано, что клиентским приложениям можно предоставить DLL-интерфейс путем объявления функций с ключевым словом extern "C". Использование ключевого слова extern "C" обладает рядом преимуществ. Во-первых, оно позволяет использовать библиотеку DLL в клиентских приложениях, написанных не на C++. Во-вторых, оно сокращает затраты на обработку библиотеки DLL, поскольку к экспортируемому имени не будет применяться декорирование имен C++. В-третьих, оно упрощает явное добавление данных в DEF-файл (для экспорта по порядковому номеру), устраняя необходимость работать с декорированием имен C++.
Примечание о безопасности. |
---|
Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению. |
Чтобы получить образцы и инструкции по их установке, выполните следующие действия.
В меню Справка среды Visual Studio выберите пункт Примеры.
Дополнительные сведения см. в разделе Поиск файлов примеров.
Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.
Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.
Построение и запуск образца
Образец DLLScreenCap состоит из двух проектов: DLLScreenCap (проект библиотеки DLL) и ScreenCap (EXE-проект, который вызывает функции из библиотеки DLL).
При построении проекта ScreenCap из предоставленного решения будет автоматически построен проект DLLScreenCap, а DLL-файл будет скопирован в выходной каталог ScreenCap.
Примечание. Поскольку в этом образце для копирования файла используется настраиваемый этап построения, решение не следует открывать, задавая путь в формате UNC. Поместите файлы образца в каталог с буквой диска.
Построение и запуск образца DLLScreenCap
Откройте решение DllScreenCap.sln.
В обозревателе решений щелкните правой кнопкой мыши папку проекта ScreenCap и выберите в контекстном меню пункт Назначить запускаемым проектом.
В меню Построение выберите команду Построить.
В меню Отладка выберите пункт Запуск без отладки.
В окне ScreenCap показывается последний снимок экрана после масштабирования до размера окна. Выберите команду Configure Screen Capture в меню File. Откроется диалоговое окно, в котором указывается снимаемая область (экран или активное окно), а также путь, по которому сохраняется файл со снимком. Нажмите кнопку Screen Capture, чтобы создать файл со снимком и обновить окно клиента.
Преобразование проекта DLLScreenCap в библиотеку DLL с динамической связью с MFC
В образце DLLScreenCap показано, как создать регулярную библиотеку DLL с экспортированной функцией, которую можно вызвать для отображения модального диалогового окна. В прежних версиях Visual C++ такой режим работы был единственно возможным для регулярных библиотек DLL. Библиотеки DLL такого типа раньше назывались библиотеками _USRDLL.
Теперь регулярная библиотека DLL может использовать MFC из общей библиотеки DLL MFCx0. Такой вариант может сократить размер сборки, и поэтому может быть разумно построить образец DLLScreenCap с помощью общей библиотеки DLL MFC. Поддержка общей библиотеки в DLLScreenCap.dll сократит размер окончательной версии библиотеки DLL со 100 КБ и более до 16 КБ и размер отладочной версии с 1 МБ и более до 100 КБ. Чтобы обеспечить динамическую компоновку в DLLScreenCap, используйте макрос AFX_MANAGE_STATE для правильного переключения состояния глобального модуля MFC.
Проверка возможности использования DLLScreenCap в общей библиотеке
В обозревателе решений щелкните правой кнопкой мыши узел проекта ScreenCap и в контекстном меню выберите пункт Свойства.
Появится диалоговое окно Страницы свойств.
В раскрывающемся меню Конфигурация выберите пункт Несколько конфигураций. Дополнительные сведения о диалоговом окне Страницы свойств см. в разделе Установка свойств проекта Visual C++.
Выберите версии Выпуск и Отладка, чтобы изменить их параметры.
На странице общих свойств для проекта убедитесь, что установлен флажок Использование MFC, чтобы использовать MFC в общей библиотеке DLL.
Убедитесь, что в начале каждой функции, экспортируемой из библиотеки DLL, присутствует следующая строка кода (обсуждение см. в разделе Управление данными о состоянии модулей MFC):
AFX_MANAGE_STATE(AfxGetStaticModuleState())
Например, библиотека DllScreenCap.dll экспортирует четыре функции:
CaptureScreen
ConfigureCapture
ProcessDLLIdle
FilterDLLMsg
Функция FilterDLLMsg в преобразованном формате должна выглядеть следующим образом:
BOOL WINAPI FilterDllMsg(LPMSG lpMsg)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
TRY
{
return AfxGetApp()->PreTranslateMessage(lpMsg);
}
END_TRY
return FALSE;
}
Ключевые слова
В этом образце показаны следующие ключевые слова:
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