Обычные библиотеки DLL MFC, статически связанные с MFC
Обычная библиотека DLL MFC, статически связанная с MFC, — это библиотека DLL, которая использует MFC на внутреннем уровне, а экспортированные функции в библиотеке DLL могут вызываться исполняемыми файлами MFC или не MFC. Как следует из названия, этот тип библиотеки DLL создается с помощью версии библиотеки статической компоновки MFC. Как правило, функции экспортируются из обычной библиотеки DLL MFC с использованием стандартного интерфейса C. Пример создания, сборки и использования обычной библиотеки DLL MFC см. в примере DLLScreenCap.
Обратите внимание, что в документации по Visual C++ больше не используется термин USRDLL. Обычная библиотека DLL MFC, статически связанная с MFC, имеет те же характеристики, что и бывшая библиотека USRDLL.
Обычная библиотека DLL MFC, статически связанная с MFC, предоставляет следующие возможности.
Клиентский исполняемый файл может быть написан на любом языке, поддерживающем использование библиотек DLL (C, C++, Pascal, Visual Basic и т. д.). Он необязательно должен быть приложением MFC.
Библиотека DLL может быть связана с теми же библиотеками статической компоновки MFC, которые используются приложениями. Отдельная версия библиотек статической компоновки для библиотек DLL отсутствует.
До версии MFC 4.0 библиотеки USRDLL предоставляли те же функциональные возможности, что и обычные библиотеки DLL MFC, статически связанные с MFC. Начиная с Visual C++ версии 4.0 термин USRDLL считается устаревшим.
Обычная библиотека DLL MFC, статически связанная с MFC, имеет следующие требования.
Этот тип библиотеки DLL должен создавать экземпляр класса, производного от
CWinApp
.Этот тип библиотеки DLL использует
DllMain
, предоставляемый MFC. Весь код инициализации, относящийся к библиотеке DLL, следует размещать в функции-членеInitInstance
, а код завершения — вExitInstance
, как в обычном приложении MFC.Несмотря на то, что термин USRDLL устарел, в командной строке компилятора по-прежнему необходимо определять "_USRDLL". Это определение определяет, какие объявления извлекаются из файлов заголовков MFC.
Обычные библиотеки DLL MFC должны иметь класс, производный от CWinApp
, и один объект этого класса приложения так же, как и приложение MFC. Однако у объекта CWinApp
библиотеки DLL (в отличие от объекта CWinApp
приложения) нет основного генератора сообщений.
Обратите внимание, что механизм CWinApp::Run
не применяется к библиотеке DLL, так как в приложении есть основной генератор сообщений. Если библиотека DLL открывает немодальные диалоговые окна или имеет собственное основное окно кадра, основной генератор сообщений приложения должен вызвать подпрограмму, экспортированную библиотекой DLL, которая, в свою очередь, вызывает функцию-член CWinApp::PreTranslateMessage
объекта приложения библиотеки DLL.
Пример этой функции см. в примере DLLScreenCap.
Как правило, символы экспортируются из обычной библиотеки DLL MFC с использованием стандартного интерфейса C. Объявление функции, экспортированной из обычной библиотеки DLL MFC, будет выглядеть примерно следующим образом:
extern "C" __declspec(dllexport) MyExportedFunction( );
Все выделения памяти в обычной библиотеке DLL MFC должны оставаться в этой библиотеке. Библиотека DLL не должна передавать в вызывающий исполняемый файл или получать из него следующие объекты:
указатели на объекты MFC;
указатели на память, выделенную с помощью MFC.
Если необходимо выполнить какие-либо из указанных выше действий или между вызывающим исполняемым файлом и библиотекой DLL нужно передать объекты, производные от MFC, следует создать библиотеку DLL расширения MFC.
Безопасно передавать указатели на память, которая была выделена библиотеками времени выполнения C, между приложением и DLL можно только в том случае, если сделана копия данных. Нельзя удалять эти указатели, изменять их размер или использовать их без создания копии памяти.
Библиотека DLL, статически связанная с MFC, не может быть динамически связана с общими библиотеками DLL MFC. Библиотека DLL, статически связанная с MFC, динамически связывается с приложением так же, как и любая другая библиотека DLL. Приложения связываются с ней так же, как и с любой другой библиотекой DLL.
Стандартные библиотеки статической компоновки MFC именуются в соответствии с соглашением, описанным в статье Соглашения об именовании библиотек DLL MFC. Однако при использовании MFC версии 3.0 и более поздних версий больше не требуется вручную указывать компоновщику версию библиотеки MFC для связывания. Вместо этого файлы заголовков MFC автоматически определяют правильную версию библиотеки MFC для связывания на основе предпроцессора, например _DEBUG или _UNICODE. Файлы заголовков MFC добавляют директивы /DEFAULTLIB, указывающие компоновщику выполнить связывание с определенной версией библиотеки MFC.