WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  MFC DLL

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   MFC DLL
gonzales опубликован 22-01-2002 22:26 MSK   Click Here to See the Profile for gonzales   Click Here to Email gonzales  
Чуваки, у меня появилась проблема.
Хочу , чтобы в mfc dll у меня в InitInstance создавалось окно. А затем я
мог его использовать. Но когда я попробовал это сделать, после LoadLibrary в главной проге ничего не выполняется !! причём окно
главноё проги продолжает отвечать на сообщения. Сначала я думал, что это глюки debugerа , но оказалось, что нет. Если у кого была похожая проблема отзовитесь.
ADK опубликован 23-01-2002 06:23 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
А как ты его создавал? Где функция обработки сообщений?
gonzales опубликован 23-01-2002 08:25 MSK     Click Here to See the Profile for gonzales  Click Here to Email gonzales     
Не совсем врубился в вопрос.
У меня dll использует CWinApp и цикл
обработки сообщений вызывается по Run. Кстати с этим я тоже не очнь врубился. В нормальном приложении если ты создал окно в InitInstance, передал указатель pMainWnd и
возвратил TRUE , то Run запускается автоматически.У меня же так не получилось и
я решил запускать Run в InitInstance. Возможно это неправильно.
gonzales опубликован 23-01-2002 15:55 MSK     Click Here to See the Profile for gonzales  Click Here to Email gonzales     
Ну так что?
ADK опубликован 24-01-2002 06:35 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
Что-то ты намудил. DLL не может иметь свою очередь сообщений. На API в DLL максимум можно сделать модальный диалог, но, так как MFC всегда использует немодальные диалоги, а для модальных эмулирует их поведение, то у тебя ничего не выйдет. Лучше напиши модальный диалог на API (DialogBox), это должно сработать.
gonzales опубликован 24-01-2002 08:33 MSK     Click Here to See the Profile for gonzales  Click Here to Email gonzales     
Объясни, нафига тогда в dll Run , InitInstance?
Luckyboy опубликован 24-01-2002 16:08 MSK     Click Here to See the Profile for Luckyboy  Click Here to Email Luckyboy     
Мона вот так, но при этом как тока ты обращаешься к dll то создается новое окно YourDialog что не есть правильно!!!!!
BOOL CItemEditorApp::InitInstance()
{ AfxEnableControlContainer();

// Standard initialization

CYourDialog dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
}
else if (nResponse == IDCANCEL)
{
}
return FALSE;
}

gonzales опубликован 24-01-2002 16:33 MSK     Click Here to See the Profile for gonzales  Click Here to Email gonzales     
Да , но когда я вызываю LoadLibrary происходит какая-то фигня. Потому что всё что после него не пашет.
gonzales опубликован 24-01-2002 19:24 MSK     Click Here to See the Profile for gonzales  Click Here to Email gonzales     
Короче ещё раз. Имеется следующая задача.
Нужно загрузить из mfc dll(кстати не понимаю из какой лучше regular или extension) функции
, которая создаёт окно(все его сообщения dll
должна обрабатывать сама).Далее во время работы программы я вызываю ещё какую-нибудь
функцию (dll) которая каким-то макаром обрабатывает свои параметры и выдаёт ответ в
окошко.Вообщем вопросов дофига. Объясните хотя бы кое-что. Это типа plugin'a.
p.s. Не понимаю разницы между LoadLibrary и
AfxLoadLibrary. И чем отличается использование CWinApp в обычном приложение и в dll?
p.p.s. Буду признателен хотя бы за ссылки на
эту тему.
frostbitten опубликован 25-01-2002 04:06 MSK     Click Here to See the Profile for frostbitten  Click Here to Email frostbitten     
Ну почитай MSDN - там про message routing много написано... страниц 80 + Knowledge Base еще столько же... Короче даже в МС все знают что message routing у них очч. скользкая... А знаешь почему? А потому что MFC subclass-ит все и вся, а обработчик 1 - в хот app (не в dll). И он очч. клёвый. Не правда, для середины 90х - самое оно! :)

А на то что в dll-ке есть CWinApp это ты не смотри в MSDN написано - что это для красоты и, что кроме InitInstance, она ниче не делает :).

Кто виноват понятно. Теперь что делать если есть возможность юзать Extension DLL, то юзай - все траблы уйдут сами, те. там CWinApp рабочий, и (главное) про него знает host app (там список extention'ов храниться). Но тогда всю кухню с mfc42.dll и иже с ними придется таскать.

Если Extension DLL не катит (многие заказчики требуют - "ехе и никакой там $%#"). Придется давиться.
Вообще-то message pump есть в host app и winproc'и длл-ных окошек вызываются нормально. Главное не поддаваться на увещивания MSDN и _НЕ_ использовать AFX_MANAGE_STATE() никогда - он сеет смерть.

Короче. У меня получилась такая хрень как ты описал. У меня в host app даже вообще не было окошек - все из dll'ок! Те можно стандартными средствами... с напрягом... но можно. А вот окошки в dll'ках в InitInstance создавать я бы не стал (тк она вызывается из DllMain, а там WinAPI в грубой форме не советует пользоваться USER'ом и SHELL32'ом - потому как они могут быть не приатачены еще). Создай экспортную функцию и в ней создавай.

P.S. А plug-in'ы нынче модно созидать при пособничестве COM/DCOM/COM+.

Glite опубликован 25-01-2002 04:15 MSK     Click Here to See the Profile for Glite  Click Here to Email Glite     
Основное отличае между regular и extension - во второй можно обмениваться указателями на классы производные от мфсишных, а в первом нельзя. В extension недолжно быть объектов CWinApp и производных от него классов.
AfxLoadLibrary - mfc ведёт свой список загруженных модулей, и в ней она добавляет его туды, ну и ещё кое-что ей нужное.
Нигде не встречал, чтобы дллелина имела свою очередь сообщений. Это криво. И, похоже не возможно, потому что у потока тока одна очередь, которая уже есть в главном приложении. Исключение - модальный диалог.
Попробуй сделать так - в длл опиши класс окна. И класс потока - производный от CWinThread, который главным окном будет иметь то которое тебе и нужно. В основной проге создай этот поток. Это вернее и лучше.
Ссылки про длл - смотри на этом сайте было несколько статей.
ADK опубликован 25-01-2002 05:37 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
Или в главном окне создай поток, и в нем загружай DLL. Там может быть своя очередь сообщений. А чем тебе не нравится предложение про модальный диалог на API? Это должно работать.
gonzales опубликован 25-01-2002 08:40 MSK     Click Here to See the Profile for gonzales  Click Here to Email gonzales     
Всем спасибо. Более менее врубился.
У меня extension dll. И я решил создавать
немодальный диалог CreateDialog'ом.
Дальше у меня работает DlgProc. А mfc я там вообще не юзаю. Есть одна проблема:
если в DlgProc использовать DefWindowProc,
то всё вроде нормально, но я понял , что есть аналог для диалогов DefDlgProc, но он
почему-то не работает.
p.s. Я так понял , что CWinApp вообще в dll
ни хера не умеет кроме Init[Exit]Instance.
И не врублся насчёт AFX_MANAGE_STATE.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.