Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание окна из dll

12K
03 ноября 2005 года
KometGel
4 / / 06.10.2005
Как сделать, чтобы dll-модуль создавал и отображал окно определенного оконного класса при вызове экспортируемой из dll функции клиентской программой? Пробовал следующие 2 способа, ничего не получилось.

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, а объявлять и регистрировать оконный класс и написать функцию, создающую окно, в программе, то все работает.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог