Поделиться через


Образец 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++.

7a51wcfx.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению.

Чтобы получить образцы и инструкции по их установке, выполните следующие действия.

  • В меню Справка среды 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

  1. Откройте решение DllScreenCap.sln.

  2. В обозревателе решений щелкните правой кнопкой мыши папку проекта ScreenCap и выберите в контекстном меню пункт Назначить запускаемым проектом.

  3. В меню Построение выберите команду Построить.

  4. В меню Отладка выберите пункт Запуск без отладки.

В окне 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 в общей библиотеке

  1. В обозревателе решений щелкните правой кнопкой мыши узел проекта ScreenCap и в контекстном меню выберите пункт Свойства.

    Появится диалоговое окно Страницы свойств.

  2. В раскрывающемся меню Конфигурация выберите пункт Несколько конфигураций. Дополнительные сведения о диалоговом окне Страницы свойств см. в разделе Установка свойств проекта Visual C++.

  3. Выберите версии Выпуск и Отладка, чтобы изменить их параметры.

  4. На странице общих свойств для проекта убедитесь, что установлен флажок Использование MFC, чтобы использовать MFC в общей библиотеке DLL.

  5. Убедитесь, что в начале каждой функции, экспортируемой из библиотеки 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

См. также

Другие ресурсы

Примеры MFC