Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2010, 01:44   #1
Iron Lappu
Новичок
Джуниор
 
Регистрация: 18.12.2010
Сообщений: 2
Вопрос Создание окна в DLL

Приветствую Вас, уважаемые эксперты!
Существует некое приложение (основное), созданное в Visual C++ с использованием MFC. Предполагается создать набор DLL библиотек, связываемых с основным приложением на этапе выполнения. Библиотеки должны создавать дочерние окна, родительским для которых является окно (представление) основного приложения. Собственно, в этом и проблема.

Я делаю это следующим образом:

Имеется некоторый класс CMyWnd, наследующийся от CWnd.
Каждая DLL в свою очередь имеет классы наследованные от CMyWnd.

В каждой DLL предполагается существование функции типа этой

Код:
СMyWnd* GetWnd()
{
        CDerivedMyWnd* pWnd = new CDerivedMyWnd;
        return (СMyWnd*) pWnd;
}
В основной программе подключаю DLL, вызываю эту функцию и пытаюсь создать окно

Код:
{
        ...
	typedef СMyWnd* (*TGetWnd) ();
	HMODULE hModule;
	TGetWnd GetWnd;

	hModule = LoadLibrary("MyDLL.dll");
	GetWnd = (TGetWnd) GetProcAddress(hModule, "GetWnd");

	pWnd = GetWnd();
        // Перегруженная функция Create
	pWnd->Create(this, rect);
        ...
}
На что получаю ошибку (на скриншоте)


При отладке выясняется, что ошибка возникает в файле wincore.cpp, в функции

Код:
CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)
при заполнении структуры CREATESTRUCT, а конкретно при вызове AfxGetInstanceHandle()

Код:
	CREATESTRUCT cs;
	cs.dwExStyle = dwExStyle;
	cs.lpszClass = lpszClassName;
	cs.lpszName = lpszWindowName;
	cs.style = dwStyle;
	cs.x = x;
	cs.y = y;
	cs.cx = nWidth;
	cs.cy = nHeight;
	cs.hwndParent = hWndParent;
	cs.hMenu = nIDorHMenu;
	cs.hInstance = AfxGetInstanceHandle();
	cs.lpCreateParams = lpParam;
В чем дело?
Изображения
Тип файла: jpg Error.JPG (21.3 Кб, 65 просмотров)

Последний раз редактировалось Stilet; 19.12.2010 в 11:57.
Iron Lappu вне форума Ответить с цитированием
Старый 25.12.2010, 00:50   #2
Iron Lappu
Новичок
Джуниор
 
Регистрация: 18.12.2010
Сообщений: 2
По умолчанию Решение

В общем, справился я с этой задачей и решил выложить решение. Как оказалось, проблема заключалась в самой библиотеке MFC. На чистом WinApi все работает нормально. Используя MFC, проблему можно устранить так:

1. Переопределить функцию CWnd::CreateEx в своем классе.
1. Заменить AfxGetInstanceHandle() на GetModuleHandle(NULL).
2. Заменить ::AfxCtxCreateWindowEx на CreateWindowEx.

Получается что эти функции не совсем корректно работают в DLL. Разбор причины я пока отложил. Если кто знает, рад буду узнать в чем конкретно дело.
Iron Lappu вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание окна Stas96 Win Api 1 29.10.2010 21:58
Создание окна в Turbo Vision Helle Паскаль, Turbo Pascal, PascalABC.NET 0 02.04.2010 18:42
создание окна средствами API!! LovePower Общие вопросы C/C++ 2 07.03.2010 21:29
Создание диалогового окна в Word Busine2009 Фриланс 3 13.07.2009 09:37
Создание окна через CreateWindowEx Nowichok Win Api 18 16.12.2006 16:37