Создание окна из dll
1 способ:
а) С помощью MFC AppWizard (dll) создаем проект типа “Regular DLL with MFC statically linked” с именем Service;
б) В файле Service.cpp объявляем переменную wc типа WNDCLASS;
в) В файле Service.cpp пишем оконную процедуру LRESULT CALLBACK UserWndProc;
г) В файле Service.cpp пишем экспортируемую функцию extern "C" __declspec (dllexport) BOOL RegUserWnd(HINSTANSE hInst). Функция инициализирует переменную wc и регистрирует соответствующий оконный класс с использованием API-функции ::RegisterClass. При этом wc.hInstance=hInst;
д) В файле Service.cpp пишем экспортируемую функцию extern "C" __declspec (dllexport) void CreateUserWnd(HINSTANCE hInst), которая должна создавать и отображать окно с использованием API-функций ::CreateWindow и ::ShowWindow.
е) В функции InitInstance() клиентской программы делаем вызов RegUserWnd(AfxGetInstanceHandle()), т. е. приложение-клиент регистрирует оконный класс. Класс регистрируется успешно (проверял в отладчике).
ж) В обработчике команды меню в классе “вид” клиентской программы делаем вызов CreateUserWnd(AfxGetInstanceHandle()). Окно не создается, появляется сообщение об ошибке "Debug Assertion Failed!”.
2 способ:
а), б, в) То же самое, что и раньше;
г) То же самое, что и раньше, только функция не экспортируемая;
д) То же самое, что и раньше, только функция не принимает аргументов. В качестве аргумента hInstance в API-функцию ::CreateWindow передается значение, возвращаемое функцией AfxGetInstanceHandle();
е) В функции InitInstance() dll-модуля делаем вызов RegUserWnd(AfxGetInstanceHandle()), т. е. оконный класс регистрирует dll-модуль;
ж) В обработчике команды меню в классе “вид” клиентской программы делаем вызов CreateUserWnd(). Окно не создается, появляется сообщение об ошибке "Debug Assertion Failed!”.
Клиентская программа компонуется с dll-модулем статически. Если не использовать dll, а объявлять и регистрировать оконный класс и написать функцию, создающую окно, в программе, то все работает.