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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2013, 18:15   #1
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 83
По умолчанию Можно ли использовать CDialog в DLL?

Мне не удаётся создать объект класса CDialog в функции, описанной в DLL.
После вызова конструктора hWnd = 0, а при вызове DoModal() - появляется сообщение Debug assertion failed.
Диалог создан Wizard'ом, пустой, из двух кнопок - ОК и Cancel.
Кто - нибудь пробовал это делать?
В этой же функции создаётся объект класса CWnd и работает.
Dmitry_B вне форума Ответить с цитированием
Старый 10.03.2013, 22:15   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

AfxSetResourceHandle вот это должно помочь
counter вне форума Ответить с цитированием
Старый 10.03.2013, 23:58   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Когда вылезает Debug assertion failed там указаны имя файла и номер строки. Открываете исходники MFC и смотрите в данном файле на данной строке что именно проверяется. Скорее всего там даже будет комментарий с пояснениями.
waleri вне форума Ответить с цитированием
Старый 13.03.2013, 21:16   #4
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 83
По умолчанию

При вызове DoModal() в DLL - функции срабатывает:
Код:
ASSERT(afxCurrentInstanceHandle != NULL);
В то же время при вызове:
Код:
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
hInstance не нулевой.
В теле DllMain AfxGetInstanceHandle() даёт 0.
Странно всё это...

Последний раз редактировалось Dmitry_B; 13.03.2013 в 21:37.
Dmitry_B вне форума Ответить с цитированием
Старый 21.04.2016, 13:27   #5
Flint30000
Новичок
Джуниор
 
Регистрация: 21.04.2016
Сообщений: 1
По умолчанию

Вариант 1 : создать другой проект DLL. (вроде MFC Shared DLL) .... поэксперементируйте! После создания проекта в одном из файлов должен быть вызов "CWinApp::ExitInstance();"
Вариант 2 : если возникает глюк с "afxCurrentInstanceHandle" (запарило искать в интернете ответ):
1. добавить в файл afxwin1.inl функцию :
void SetCurrentInstanceHandle(HINSTANCE hInst){afxCurrentInstanceHandle = hInst;}
2. перед функцией создания окна (в своей программе):
#include "afxwin1.inl"
3. перед созданием окна (в своей программе):
SetCurrentInstanceHandle((HINSTANCE )hInstance);
4. hInstance взять из переменных программы (есть в любой DLL или EXE).
Пример (у меня в проекте): "CWinApp::m_hInstance"
5. В итоге :

#include "afxwin1.inl"
void MyFun()
{
SetCurrentInstanceHandle(CWinApp::m _hInstance);
... создаём окно ...
}

Последний раз редактировалось Flint30000; 21.04.2016 в 13:31.
Flint30000 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не работает DLL - функция, содержащая CDialog? Dmitry_B Visual C++ 0 20.01.2013 10:58
Не возможно использовать dll WebbMan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 07.12.2012 17:34
можно ли использовать принтер VAnj2607 Помощь студентам 3 05.05.2011 16:40
функция Get Document не работает в CDialog. как получить документ в CDIalog MFCCasper Общие вопросы C/C++ 4 24.03.2010 15:06