TN011: Використання MFC як частину DLL

Цієї записці описується регулярні бібліотек, які дозволяють вам використовувати бібліотеку MFC в рамках Windows бібліотеки динамічного компонування (DLL). Він припускає, що ви знайомі з Windows DLL і як побудувати їх. Про MFC розширенням DLL, яка дозволить вам створити розширення до бібліотеки MFC, дивіться DLL Версія MFC.

Бібліотека DLL інтерфейсу

Регулярні DLL припустити, що інтерфейсів між застосунком і DLL зазначених у нормальної функції типу або явно експортований класів. MFC клас інтерфейсів не можна експортувати.

Якщо DLL і застосування MFC, потім обидва є вибір або використовувати Версія MFC бібліотек або мати копію MFC бібліотеки статично пов'язана в них. У версіях 4.0 Visual c + + бібліотеки статичні посилання MFC були різними для застосунків та бібліотек. З поточною версією MFC, застосування і DLL як скористатися стандартним версії MFC бібліотеки. Не є окремим Бібліотека DLL в цій версії (MFC робить вибір під час виконання).

Регулярні бібліотек мають кілька переваг:

API обмеження

Деякі можливості MFC, не застосовуються до DLL версії, або тому, що технічні обмеження або тому, що ці послуги зазвичай надаються застосування. Ці обмеження перераховані нижче:

Будівництво ваш DLL

При складанні регулярні DLL, що статично посилання MFC, символи "_USRDLL" і "_WINDLL" повинні бути визначені. Бібліотека DLL код має бути складено з наступних ключів компілятора:

При складанні регулярні DLL, що динамічно посилання MFC, ви повинні визначити символи вище і використання ключів компілятора вище. Additonally, символ "_AFXDLL" повинні бути визначені і DLL код повинен бути складений з:

Інтерфейси (API) між застосунком і DLL має явно експортувати. Він рекомендував, що визначення інтерфейсів бути низькою пропускною здатністю, прилипання до c інтерфейсів, де це можливо. Більш прямий c інтерфейсів, простіше в обслуговуванні, ніж більш складні C++-класів.

Місце вашого API в окремий верхній колонтитул, що використовується на c і c + + файли (таким чином, ви не буде обмежити ваші клієнти DLL для програмістів с + +). Перегляньте заголовок TRACEAPI.H у зразку MFC передові концепції DLLTRACE для прикладу. Щоб експортувати ваші функції, введіть їх у розділі ЕКСПОРТ файлу визначення модуля (.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) разом з версією С runtimes, називається ' LIBCMT.LIB'. Ці бібліотеки є готових і можуть бути встановлені шляхом зазначення їх, коли ви запустіть програму установки Visual c + +.

Приклади коду

Будь ласка, див MFC передові концепції Зразкова програма DLLTRACE для повного зразка. Це включає в себе прості DLL, називається ' ВІДСТЕЖЕННЯ.Бібліотека DLL' що реалізує AFX трасування прапори діалогове вікно (див. технічне Примітка 7). Вона також має просте додаток HELLO викликів DLL для використання діалогового вікна.

Кілька цікава річ, щоб відзначити:

Наступні виписки з TRACEAPI.H свідчить про те, що потрібно для одного API, визначений у регулярних DLL, яка статично MFC:

#IFDEF __cplusplus
зовнішній {"С"
#endifnbsp; / * __cplusplus * /

Структура TracerData
{
    BOOL bEnabled;
    UI&NT прапори;
};

BOOL далеко ПАСКАЛЬ ЕКСПОРТУВАТИ PromptTraceFlags (TracerData ДАЛЕКОГО * lpData);

#IFDEF __cplusplus
}
#endif

У цьому прикладі декларації розміщується в блоку 'зовнішній "С" {}' для C++ користувачів. Це дає ряд переваг. По-перше, це робить ваші DLL API використовуватися-C++ клієнтських застосунків. По-друге, це знижує накладні DLL, оскільки C++ ім'я mangling не будуть застосовані до експортованого ім'я. Нарешті, це полегшує явно додати на.DEF файлу (для експорту на порядковий), не турбуючись про ім'я mangling.

Всі функції API є "Далеко ПАСКАЛЬ ЕКСПОРТУВАТИ". Хоча не забороняється необхідні для Win32 DLL, ці визначення були збережені для легко резервного портування на 16-розрядної версії Windows. ДАЛЕКИЙ, ПАСКАЛЬі ЕКСПОРТУВАТИ макроси, всі розширення нічого під Win32.

Структури, що використовуються на API не виводяться з MFC класи і повністю визначені в заголовку API. Це знижує складність інтерфейс між DLL і застосування і ще раз, робить DLL використовуватися c програмами, а також.

Будь-які покажчики даних використовуються в API є явні ДАЛЕКИЙ покажчиків. Знову ж таки, ДАЛЕКОМУ, не є дійсно необхідним для Win32, але корисно, якщо ви плануєте скомпілювати код для 16-розрядної версії Windows коли-небудь у майбутньому.

Технічні примітки за номером |nbsp; Технічні примітки за категоріями

Index