Автор
|
Тема: MFC DLL
|
gonzales |
опубликован 22-01-2002 22:26 MSK
Чуваки, у меня появилась проблема. Хочу , чтобы в mfc dll у меня в InitInstance создавалось окно. А затем я мог его использовать. Но когда я попробовал это сделать, после LoadLibrary в главной проге ничего не выполняется !! причём окно главноё проги продолжает отвечать на сообщения. Сначала я думал, что это глюки debugerа , но оказалось, что нет. Если у кого была похожая проблема отзовитесь.
|
ADK
|
опубликован 23-01-2002 06:23 MSK
А как ты его создавал? Где функция обработки сообщений? |
gonzales
|
опубликован 23-01-2002 08:25 MSK
Не совсем врубился в вопрос. У меня dll использует CWinApp и цикл обработки сообщений вызывается по Run. Кстати с этим я тоже не очнь врубился. В нормальном приложении если ты создал окно в InitInstance, передал указатель pMainWnd и возвратил TRUE , то Run запускается автоматически.У меня же так не получилось и я решил запускать Run в InitInstance. Возможно это неправильно. |
gonzales
|
опубликован 23-01-2002 15:55 MSK
Ну так что? |
ADK
|
опубликован 24-01-2002 06:35 MSK
Что-то ты намудил. DLL не может иметь свою очередь сообщений. На API в DLL максимум можно сделать модальный диалог, но, так как MFC всегда использует немодальные диалоги, а для модальных эмулирует их поведение, то у тебя ничего не выйдет. Лучше напиши модальный диалог на API (DialogBox), это должно сработать. |
gonzales
|
опубликован 24-01-2002 08:33 MSK
Объясни, нафига тогда в dll Run , InitInstance? |
Luckyboy
|
опубликован 24-01-2002 16:08 MSK
Мона вот так, но при этом как тока ты обращаешься к 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
Да , но когда я вызываю LoadLibrary происходит какая-то фигня. Потому что всё что после него не пашет. |
gonzales
|
опубликован 24-01-2002 19:24 MSK
Короче ещё раз. Имеется следующая задача. Нужно загрузить из mfc dll(кстати не понимаю из какой лучше regular или extension) функции , которая создаёт окно(все его сообщения dll должна обрабатывать сама).Далее во время работы программы я вызываю ещё какую-нибудь функцию (dll) которая каким-то макаром обрабатывает свои параметры и выдаёт ответ в окошко.Вообщем вопросов дофига. Объясните хотя бы кое-что. Это типа plugin'a. p.s. Не понимаю разницы между LoadLibrary и AfxLoadLibrary. И чем отличается использование CWinApp в обычном приложение и в dll? p.p.s. Буду признателен хотя бы за ссылки на эту тему. |
frostbitten
|
опубликован 25-01-2002 04:06 MSK
Ну почитай 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
Основное отличае между regular и extension - во второй можно обмениваться указателями на классы производные от мфсишных, а в первом нельзя. В extension недолжно быть объектов CWinApp и производных от него классов. AfxLoadLibrary - mfc ведёт свой список загруженных модулей, и в ней она добавляет его туды, ну и ещё кое-что ей нужное. Нигде не встречал, чтобы дллелина имела свою очередь сообщений. Это криво. И, похоже не возможно, потому что у потока тока одна очередь, которая уже есть в главном приложении. Исключение - модальный диалог. Попробуй сделать так - в длл опиши класс окна. И класс потока - производный от CWinThread, который главным окном будет иметь то которое тебе и нужно. В основной проге создай этот поток. Это вернее и лучше. Ссылки про длл - смотри на этом сайте было несколько статей. |
ADK
|
опубликован 25-01-2002 05:37 MSK
Или в главном окне создай поток, и в нем загружай DLL. Там может быть своя очередь сообщений. А чем тебе не нравится предложение про модальный диалог на API? Это должно работать. |
gonzales
|
опубликован 25-01-2002 08:40 MSK
Всем спасибо. Более менее врубился. У меня extension dll. И я решил создавать немодальный диалог CreateDialog'ом. Дальше у меня работает DlgProc. А mfc я там вообще не юзаю. Есть одна проблема: если в DlgProc использовать DefWindowProc, то всё вроде нормально, но я понял , что есть аналог для диалогов DefDlgProc, но он почему-то не работает. p.s. Я так понял , что CWinApp вообще в dll ни хера не умеет кроме Init[Exit]Instance. И не врублся насчёт AFX_MANAGE_STATE. |