Имеется: обычное Doc\View приложение, View объекты в нём не от CView, а от CFormView. Вопрос: Хотелось бы сделать потомки от CFormView во в нешних DLLках, читай плагины. Как более гарамотно\правильно вписать это в MFC и Doc\View? Примечание: Пробовал делать ограниченный интерфес типа: несколько экспортируемых функций вида OnCreate, OnClose и т.д.,
но это довольно топорно и совершенно не покрывает функционал объекта, не вынесенного в отдельную DLLку.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте!
А>Имеется: обычное Doc\View приложение, View объекты в нём не от CView, а от CFormView. А>Вопрос: Хотелось бы сделать потомки от CFormView во в нешних DLLках, читай плагины. Как более гарамотно\правильно вписать это в MFC и Doc\View? А>Примечание: Пробовал делать ограниченный интерфес типа: несколько экспортируемых функций вида OnCreate, OnClose и т.д., А> но это довольно топорно и совершенно не покрывает функционал объекта, не вынесенного в отдельную DLLку.
лучше не использовать MFC-шную архитектуру Doc/View — уж больно монолитное приложение получается
это я тебе по собственному печальному опыту говорю — мы в свое время на нее завязались (это было давно и опыта у меня тогда было немного), теперь вот мучаемся
лучше какой-то велосипед с MVC изобрести (или готовую реализацию взять)
Андрей пишет:
> лучше не использовать MFC-шную архитектуру Doc/View — уж больно > монолитное приложение получается
Это как-то обосновать можешь, или просто голословное утверждение ?
Как "монолитность" приложения измеряется, и почему это должно быть
плохо ? Может это как раз то, что нужно ?
Аноним пишет:
> *Вопрос:* Хотелось бы сделать потомки от CFormView во в нешних DLLках, > читай плагины. Как более гарамотно\правильно вписать это в MFC и Doc\View?
Как бы проблем с этим нет. Просто пишешь класс, экспортируешь его,
если надо, из DLL (declspec(dllexport)) -- и всё.
Написание View в приложении и в dll ничем почти не отличается.
Единственное в dll будет проблема с инициализацией MFC, в стандартных
визардом генерённых проектах это делается, а это не нужно, ежели
само приложение уже использует MFC и оно (MFC) уже проинициализировано.
Лучше использовать для создания проекта визард MFC Extention DLL,
а затем удалить все упоминания о AFX_extention. (но макра AFXEXT в проекте
должна остаться!)
Другой вариант -- создать просто Win32 DLL и добавить в проект макрос AFXEXT и
ссылки на библиотеки MFC руками.
Да, и не забудь, что в этом случае обязательно использовать MFC ТОЛЬКО в виде
DLL, и все плагины должны использовать ОДНУ И ТУ ЖЕ MFC, либо DEBUG, либо RELEASE.
Здравствуйте, Андрей, Вы писали:
А>лучше не использовать MFC-шную архитектуру Doc/View — уж больно монолитное приложение получается А>это я тебе по собственному печальному опыту говорю — мы в свое время на нее завязались (это было давно и опыта у меня тогда было немного), теперь вот мучаемся
А>лучше какой-то велосипед с MVC изобрести (или готовую реализацию взять)
К сожалению уже довольно много написано, да и Ribbon успел понравиться,
поэтому и интересуюсь в рамках Doc\View(.
1. Нельзя ли, как-нибудь, сабклассить:
SetWindowLong( ...GWL_WNDPROC...)
только в MFCшной обёртке?
2.Сделать что-то на подобии этого, в основном модуле:
Здравствуйте, MasterZiv, Вы писали:
MZ>Аноним пишет:
>> *Вопрос:* Хотелось бы сделать потомки от CFormView во в нешних DLLках, >> читай плагины. Как более гарамотно\правильно вписать это в MFC и Doc\View?
MZ>Как бы проблем с этим нет. Просто пишешь класс, экспортируешь его, MZ>если надо, из DLL (declspec(dllexport)) -- и всё.
MZ>Написание View в приложении и в dll ничем почти не отличается.
MZ>Единственное в dll будет проблема с инициализацией MFC, в стандартных MZ>визардом генерённых проектах это делается, а это не нужно, ежели MZ>само приложение уже использует MFC и оно (MFC) уже проинициализировано.
MZ>Лучше использовать для создания проекта визард MFC Extention DLL, MZ>а затем удалить все упоминания о AFX_extention. (но макра AFXEXT в проекте MZ>должна остаться!)
MZ>#include "stdafx.h" MZ>// --- УБРАТЬ !! #include <afxdllx.h> ---
MZ>#ifdef _DEBUG MZ>#define new DEBUG_NEW MZ>#undef THIS_FILE MZ>static char THIS_FILE[] = __FILE__; MZ>#endif
MZ>Другой вариант -- создать просто Win32 DLL и добавить в проект макрос AFXEXT и MZ>ссылки на библиотеки MFC руками.
MZ>Да, и не забудь, что в этом случае обязательно использовать MFC ТОЛЬКО в виде MZ>DLL, и все плагины должны использовать ОДНУ И ТУ ЖЕ MFC, либо DEBUG, либо RELEASE.
Здравствуйте, Аноним, Вы писали:
А>Имеется: обычное Doc\View приложение, View объекты в нём не от CView, а от CFormView. А>Вопрос: Хотелось бы сделать потомки от CFormView во в нешних DLLках, читай плагины. Как более гарамотно\правильно вписать это в MFC и Doc\View? А>Примечание: Пробовал делать ограниченный интерфес типа: несколько экспортируемых функций вида OnCreate, OnClose и т.д., А> но это довольно топорно и совершенно не покрывает функционал объекта, не вынесенного в отдельную DLLку.
Много-много лет назад, из спортивного интереса, делал подобную "плагинную" схему с MFC Doc/View.
В проекте приложения реализованы:
— свой класс шаблона документа на основе CMultiDocTemplate, который хранит HINSTANCE внешней библиотеки для загрузки ресурсов. В классе переопределен базовый виртуальный метод LoadTemplate.
— свой класс child-фрейма, который использует HINSTANCE своего шаблона для загрузки ресурсов. Переопределен метод LoadFrame, шаблон передается в контексте.
Проект плагина реализует классы документа и view, и экспортирует функции (plain C-функции), которые позволяют приложению получить
— кол-во наборов doc/view (если их несколько)
— указатели на runtime-классы document и view (RUNTIME_CLASS выдает указатель на статический объект, поэтому указатели "живут" пока загружен плагин).
Приложение загружает библиотеки плагинов, получает указатели на runtime-классы doc/view и регистрирует шаблоны в template manager (стандартном).
Планировалось, что это будет некая студия, где приложение предоставляет workspace, а плагины реализуют doc/view для обработки файлов различных типов. Пример работал, нормально создавались документы из плагинов. Дальше разрабатывать не стал.
Здравствуйте, MasterZiv, Вы писали:
MZ>Андрей пишет:
>> лучше не использовать MFC-шную архитектуру Doc/View — уж больно >> монолитное приложение получается
MZ>Это как-то обосновать можешь, или просто голословное утверждение ? MZ>Как "монолитность" приложения измеряется, и почему это должно быть MZ>плохо ? Может это как раз то, что нужно ?
чего-ж в этом хорошего?
Doc/View — это вырожденный случай архитектуры MVC, из которого как раз Controller и удалили
я не говорю, что это само по себе плохо
просто такой подход может очень быстро привести к тому, что View и Document будут очень тесно переплетены между собой
а архитектура Doc/View никак эти связи не ограничивает, к сожалению
все-таки более правильным мне представляется отделение мух от котлет, и использование для взаимодействия View и Document промежуточного слоя
что касается основного модуля, в нём, как указал товарищ rus blood,
сделал свой класс производный от CMultiDocTemplate и изменил конструктор и
LoadTemplate:
Что касается DLL:
1. Создал MFC Extension DLL и почикал её, как указал товарищ MasterZiv.
2. Создал MFC Extension DLL и почикал её, и не менял инициализацию.
3. Создал MFC DLL статик-линкед
Нашёл доку с тем что мне нужно: здесь
Решение очень схоже с тем что предложил rus blood,
но обходиться проблема не совсем корректного поведения функций типа CRuntimeClass::IsDerivedFrom