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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2014, 14:29   #1
SSTW
 
Регистрация: 04.02.2012
Сообщений: 7
По умолчанию Вызов из EXE немодального окна, находящегося в DLL

Как сделать, чтобы диалог, прописанный в DLL (MFC), вызывался в немодальном окне из EXE (чтобы можно было, например, ввести данные и в одно окно (от EXE), и в другое (DLL))?

Как правильно себя вести с циклом диспетчирования сообщений (куда его вставить)?

Нужно, чтобы из программы (EXE) вызывалась DLL с немодальным окном.
EXE - может быть два варианта: консольное приложение или диалог MFC.
DLL - на MFC.


У меня при закрытии окна диалога, который в DLL, не заканчивается бесконечный цикл диспетчирезации сообщений (не видно, как-то сообщения WM_QUIT)
Костяк программы у меня такой:

DLL:
Код:
extern "C"__declspec(dllexport) void MyShowform ()
{   
 AFX_MANAGE_STATE (AfxGetStaticModuleState()); // 
 MyDialog *Form1;
	
	Form1 = new MyDialog();
	BOOL result = Form1->Create(IDD_DIALOG1);
	Form1->ShowWindow(SW_SHOWNA);
        Form1->UpdateWindow();
	

MSG m_msgCur;   // Цикл диспетчирования сообщений - НИКАК НЕ МОГУ ВЫЙТИ !!!!!
while (true)
{
	while (!::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE)) // PeekMessage() проверяет, есть ли в очереди сообщение и программа выполняется дальше.
		// Если есть сообщения - возвращает ненулевое значение
		// Если нет сообщений - возвращает 0
	{
		// функция для работы пока НЕТ сообщений
		 	
            Form1->UpdateWindow();

   	}
	if (!::GetMessage(&m_msgCur, NULL, NULL, NULL)) break; // GetMessage ожидает пока не будет получено сообщение из очереди. 
                                                              //Достает их из очереди и возвращает TRUE для всех мессаг кроме WM_QUIT

	::TranslateMessage(&m_msgCur); // TranslateMessage - Переводит сообщения в символьные
	::DispatchMessage(&m_msgCur); // DispatchMessage - Диспетчирует (напроавляет сообщение в процедуру окна
}

    delete Form1;
}
EXE (MFC или консоль):
Код:
  DllFileName = "MFC_PROJ_DLL.dll";
  DllFileNameW = (LPCWSTR) L"MFC_PROJ_DLL.dll";
  h=LoadLibrary(DllFileNameW);
  
  if (!h)
  {
    printf("Ошибка - не могу найти <%s>\n",DllFileName);
    return ;
  }


  DllFunc=(cfunc) GetProcAddress(h,"MyShowform"); 

  
  if (!DllFunc)
  {
    printf("Ошибка! В <%s>"
           "отсутствует ф-ция MyShowform\n",DllFileName);
    return ;
  }


    DllFunc();
}
Подскажите, пожалуйста!
SSTW вне форума Ответить с цитированием
Старый 01.12.2014, 15:59   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Если окно немодальное, то лучше не делать свой message pump, тогда проблем не будет. При данной реализации после открытия вашего окна другие окна могут не работать правильно.

Или если уж очень неймется, само окно перед закрытием должно отправить WM_QUIT (PostQuitMessage).

В принципе WM_QUIT - сигнал завершить приложение, поэтому лучше использовать иные механизмы.
waleri вне форума Ответить с цитированием
Старый 01.12.2014, 18:02   #3
SSTW
 
Регистрация: 04.02.2012
Сообщений: 7
По умолчанию

А как поступить правильно?
SSTW вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инструкция для сборки приложений на Qt в один exe без зависимостей от libstdc++-6.dll, libgcc_s_dw2-1.dll, Qt5Core.dll и т.д. 8Observer8 Qt и кроссплатформенное программирование С/С++ 12 25.06.2015 03:18
Qt вызов окна novicepro Qt и кроссплатформенное программирование С/С++ 17 04.11.2013 08:17
Работа с DLL c# (Вызов Формы из DLL) updaite C# (си шарп) 16 24.10.2013 05:48
Передать че-нибудь в DLL / Из DLL прочитать переменную EXE WhiskasTM Общие вопросы Delphi 9 02.08.2012 13:33
вызов окна RedScreenOfLife Общие вопросы по Java, Java SE, Kotlin 1 24.05.2011 16:23