В настоящей записке описываются обычные библиотеки DLL, которые позволяют использовать библиотеку MFC как часть Windows динамически подключаемой библиотеки (DLL). Предполагается, что вы знакомы с Windows DLL и как построить их. Сведения о расширения MFC DLL, которые позволяют вам создавать расширения для библиотеки MFC, найти Версию библиотеки DLL MFC.
Интерфейсы DLL
Обычные библиотеки DLL на себя указанные интерфейсы между приложением и библиотекой DLL в обычных C-подобных функций или явно экспортируемые классы. Не могут быть экспортированы интерфейсов классов MFC.
Чтобы использовать MFC DLL и приложение, затем оба имеют выбор использовать общую версию библиотеки MFC или иметь копию библиотеки MFC, статически скомпонованная в них. В версиях, предшествующих Visual C++ 4.0 статическими библиотеками MFC, отличаются для приложений и библиотек DLL. С текущей версией MFC, приложения и библиотеки DLL может как использовать один из стандартных версий библиотеки MFC. Существует не отдельная библиотека для библиотек DLL в этой версии (MFC делает выбор во время выполнения).
Обычные библиотеки DLL имеют ряд преимуществ:
Ограничения API
Некоторые возможности MFC не применимы к версии DLL, либо из-за технических ограничений или потому, что эти услуги обычно предоставляются приложением. Ниже перечислены эти ограничения:
Создание библиотеки DLL
При компиляции обычным библиотекам DLL, статически связанным с MFC, необходимо определить символы "_USRDLL" и "_WINDLL". Ваш код библиотеки DLL должны быть скомпилированы с следующие переключатели компилятора:
При компиляции обычные библиотеки DLL, которые динамически связываются с MFC, необходимо определить выше символов и использовать выше переключатели компилятора. Дополнительно, должен быть определен символ "_AFXDLL" и ваш код библиотеки DLL должны быть скомпилированы с:
Интерфейсы (API) между приложением и библиотекой DLL должна быть явно экспортированы. Рекомендуем, что определенные интерфейсы, чтобы быть низкой пропускной способности, прилипание к c интерфейсов, где это возможно. Более прямой c интерфейсы проще чем более сложные классы C++.
Поместите ваш API-интерфейсы в отдельный заголовок, который могут быть включены файлы c и C++ (таким образом, вы не будет ограничивать ваших клиентов DLL для программистов с ++). Смотрите заголовка TRACEAPI.H в MFC концепции перспективных образцов DLLTRACE в качестве примера. Чтобы экспортировать ваши функции, введите их в разделе EXPORTS файла определения модуля (.DEF) или включить ключевое слово __declspec(dllexport) на определения функций. Использовать __declspec(dllimport) для импорта этих функций в клиентский исполняемый модуль.
Необходимо добавить макрос AFX_MANAGE_STATE в начале всех экспортируемых функций в обычных библиотеках DLL, которые динамически связываются с MFC, чтобы установить для текущего состояния модуля одну из библиотеки DLL. Это делается путем добавления следующую строку кода в начало функций, экспортированных из библиотеки DLL:
nbsp; & nbsp;
AFX_MANAGE_STATE (AfxGetStaticModuleState ())
nbsp; & nbsp;
WinMain - > DllMain
Библиотека MFC определяет стандартный точку входа Win32 DllMain , инициализирующего производный объект CWinApp , как в обычном приложении MFC. Поместите все DLL инициализации в функции-члена InitInstance как в обычном приложении MFC.
Обратите внимание, что механизм CWinApp::Run не применяется для библиотек DLL, так как приложение имеет основной конвейер сообщений. Если библиотека DLL вызывает немодальные диалоги или окно или в своих собственных, ваше приложение основной конвейер сообщений должен вызывать экспортируемую DLL процедуру, которая вызывает CWinApp::PreTranslateMessage.
Содержится в разделе Пример DLLTRACE для использования этой функции.
Функция-член ExitInstance вашей CWinApp, производный класс будет вызываться из MFC предоставляет функции DllMain до выгрузки DLL.
Что делать, чтобы связать все это вместе
Обычные библиотеки DLL, статически связанным с MFC необходимо связать библиотеку DLL с библиотекой (NAFXCWD.LIB или NAFXCW.LIB) вместе с версией c сред под названием ' LIBCMT.LIB'. Эти библиотеки являются заранее построили и могут быть установлены, указав их при запуске программы установки Visual C++.
Пример кода
Смотрите пример программы концепции перспективных MFC DLLTRACE полный пример. Это включает в себя простой DLL под названием ' TRACER.DLL' что реализует флаги трассировки AFX диалоговое окно (см. техническое примечание 7). Она также имеет простое приложение HELLO, вызывающий DLL для использования диалогового окна.
Несколько интересных вещь, чтобы отметить:
Следующий отрывок из TRACEAPI.H иллюстрирует, что нужно для один API-интерфейс, определенный в обычной библиотеке DLL, которые статически связана с MFC:
# ifdef __cplusplus
{extern «C»
#endifnbsp; / * __cplusplus * /
Структура TracerData
{
BOOL bEnabled;
UI&NT флаги;
};
BOOL далеко экспорта Паскаль PromptTraceFlags (TracerData FAR * lpData);
# ifdef __cplusplus
}
# endif
В этом примере Декларация прилагается в блоке "extern"C"{}" для пользователей C++. Это имеет ряд преимуществ. Во-первых это делает ваш API-интерфейсы DLL полезная-C++ клиентскими приложениями. Во-вторых он уменьшает накладные DLL, так как искажения имен C++ не будет применяться к экспортируемое имя. И наконец, это облегчает явно добавить.DEF файла (для экспорта по порядковому номеру) без необходимости беспокоиться о искажения имен.
Все API функции являются "Далеко Паскаль экспорта". Хотя не stricly необходимых для Win32 DLL, эти определения были сохранены для легкой портирования обратно для 16-разрядной версии Windows. Дальний, Паскаль, ЭКСПОРТИРОВАТЬ макросы и все расширения к ничего под Win32.
Структуры, используемые интерфейсом API не являются производными от классов MFC и полностью определяются в заголовке API. Это уменьшает сложность взаимосвязей между DLL и приложение и еще раз, делает DLL пригодным для использования С программами.
Все указатели данных используется в API — явные FAR указатели. Опять же, FAR, не является действительно необходимым для Win32, но является полезным, если вы планируете скомпилировать код для 16-разрядной версии Windows в будущем.
Технические примечания по номеру |nbsp; Технические примечания по категориям