Aтрибуты и поддержка MFC. Почему в визарде нельзя так сделат
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 09.06.03 07:13
Оценка:
Почему в визарде отсутсвуюет возможность подключить поддержку MFC для атрибутного ATL клиента?
Руками чтоли мне теперь хедеры MFCшные подлючать?

"Деньги портят человека, когда они у других."

Re: ATL aтрибуты и поддержка MFC ВОЗМОЖНА (инфа для пои
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 11.06.03 16:28
Оценка: 14 (2)
Здравствуйте, LaFlour, Вы писали:

LF>Почему в визарде отсутсвуюет возможность подключить поддержку MFC для атрибутного ATL клиента?

LF>Руками чтоли мне теперь хедеры MFCшные подлючать?

Решение найдено! Ковырялся 3 дня.
Ключевые слова: MFC ATL атрибуты

Суть проблеммы — у нас есть ATL сервер в который нас понадобилось включить поддержку MFC.
Не все так просто на первый взгляд. Проблемма заключается в неявной реализации артибутами функций точек входа в сервер для Dll например DllMain, и т.п (для Exe WinMain и т.п.)
При подключении MFC мы должны входить в DllMain не ATL а MFC и при линковке нашего сервера мы получаем сообщение что __DllMain@12 у нас уже есть. И это по-началу повело меня по ложному пути.

Решение — Я начал проверять последовательность линковки библиотек (/VERBOSE в опциях), отключать их и потом еще бороться с некоторыми ошибками, типа имеющейся уже реализации AtlThrow.
Но решение лежало в другой стороне. А оно очевидно (почему я о нем раньше не подумал, а начал бороться с ошибками?)
Нам надо просто отключить наш DllMain в атрибуте [module()] в ATL Сервере. Красиво отключить не изменяя этого атрибута у меня не получилось. Выход простой, удаляем просто атрибут [module()] и все реализуем руками, тама
всего штук 5 функций.
В итоге имеем функциональность ATL на атрибутах, + MFC.

Послесловие
Не ясно почему майкрософт не предоставил такую возможность в визарде.
В визарде оказывается можно сделать то что я привел только из простого ATL+MFC проекта (без атрибутов) — но только случайно можно наткнуться на эту опцию. Логика MC мне не ясна — из простого ATL с MFC можно создать аттрибутный ко-класс, и сконвертировать проект в атрибутный.
Но из атрибутного проека подключить MFC нельзя автоматот. Только руками выкинув атрибут [module()]


PS: Ну влом мне это в отдельную статью оформлять для сайта
Re[2]: ATL aтрибуты и поддержка MFC ВОЗМОЖНА (инфа для
От: apm Россия  
Дата: 11.06.03 21:14
Оценка:
Здравствуйте, LaFlour, Вы писали:

[]

LF>Суть проблеммы — у нас есть ATL сервер в который нас понадобилось включить поддержку MFC.

LF>Не все так просто на первый взгляд. Проблемма заключается в неявной реализации артибутами функций точек входа в сервер для Dll например DllMain, и т.п (для Exe WinMain и т.п.)
LF>При подключении MFC мы должны входить в DllMain не ATL а MFC и при линковке нашего сервера мы получаем сообщение что __DllMain@12 у нас уже есть.

Хм... Умеешь ведь вопросы правильно ставить , так почему сразу не запостил в таком виде ? Глядишь и три дня сэкономил бы...

2Mod: Сорри за оффтоп
... << RSDN@Home 1.0 beta 7a >>
BB for fun
Re[2]: ATL aтрибуты и поддержка MFC ВОЗМОЖНА (инфа для
От: eKarpov  
Дата: 18.04.04 12:41
Оценка:
Здравствуйте, LaFlour, Вы писали:

LF>Здравствуйте, LaFlour, Вы писали:


LF>>Почему в визарде отсутсвуюет возможность подключить поддержку MFC для атрибутного ATL клиента?

LF>>Руками чтоли мне теперь хедеры MFCшные подлючать?

LF>Решение найдено! Ковырялся 3 дня.

LF>Ключевые слова: MFC ATL атрибуты

LF>Выход простой, удаляем просто атрибут [module()] и все реализуем руками, тама всего штук 5 функций.

LF>В итоге имеем функциональность ATL на атрибутах, + MFC.

Мне не хотелось расставаться с атрибутом module, поэтому, покопавшись в особенностях работы поставщика атрибутов, который используется как связующее звено на этапе компилирования и линковки. Решение получилось достаточно забавное, вот оно

[module(exe, name="PluginManager")]
class CPluginManager
{
public:
int WinMainATL(int nShowCmd) throw()
{
return __super::WinMain(nShowCmd);
}

#define WinMain WinMainATL
};
#undef WinMain
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.