Здравствуйте, suvolod, Вы писали:
S>Я пишу приложение с использованием mfc (на основе диалога со статически прилинкованной библиотекой mfc). Мое приложение условно можно разделить на две форточки — основное окно программы и окно настроек этой программы. И основное, и окно настроек содержит кучу классов. Например, окно настроек состоит из пяти вкладок (соответственно, на каждую вкладку есть класс + еще парочка на основное окно), в основном приложении классов еще больше. Сейчас в моей проге все классы свалены в одну кучу: и основная программа, и окно ее настроек представляют единый проект. Ориентироваться очень трудно... поэтому я хочу создать солюшен, в котором будут два проекта — для программы и для окна ее настроек. Трудность в том, что я хочу затем собрать этот солюшен в единый exe-файл. Бьюсь уже неделю, но пока ничего не получается.
S>1. Сперва я хотел сделать оба проекта exe-шниками, затем проект окна настроек преобразовать в lib (через настройки проекта VStudio) и радоваться жизни. Не получилось. преобразование exe-в lib проходит успешно. Либа подключется к основному проекту и все выполняется без ошибок, но вызов окна настроек по Dlg.DoModal() возвращает -1 (Dlg — это объект класса диалогового окна настроек, лежащего в lib-е).
S>2. Затем я попробовал сделать то-же самое, но уже не преобразуя готовый exe-проект, а создать dll-проект, создать в нем ресурс типа диалоговое окно, создать класс этого диалогового окна, а затем уже преобразовать его в lib-у. Я предполагал, что lib-библиотека по своему строю гораздо ближе к dll библиотеке, а значит у меня все получиться. В итоге у меня получилось создать солюшен из двух проектов (exe и dll), запихнуть в dll диалог и вызвать его из exe-шника. Но дальше дело не пошло. После превращения dll-проекта в lib сразу же полезли ошибки вроде:
S>S>error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl Show(void)" (__imp_?Show@@YAXXZ) referenced in function "public: void __thiscall CEXEDlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CEXEDlg@@QAEXXZ)
S>
S>... оно и правильно, ведь lib-библиотека не имеет собственного хендла и ничего не знает про __declspec(dllimport) / __declspec(dllexport) разделяемой dll. А удаление этих импорт/экспорт-определений вернуло меня назад: либа собирается, но из exe-проекта окно вызвать невозможно, Dlg.DoModal() возвращает -1.
S>3. А теперь вопрос? Кто-нибудь с этим сталкивался? Все-таки можно собрать солюшен из нескольких проектов в единый exe-файл? Или, перефразируя, как вызвать диалог из lib-библиотеки? Ссылку на статью, примерчик, просто подсказку — буду рад любой помощи. На всякий случай выкладываю свой пример (exe+dll в одном солюшене), может кто-то сможет преобразовать его в солюшен аля (exe+lib). Ссылка: http://files.mail.ru/7WK70K
Может ответ не совсем в тему, но зачем тебе разделять на несколько проектов?? Лучше навсти порядок в класса: объединить в пространства имен или использовать вложенные классы.
а насчет lib я думаю это все из-за MFC. Вообще MFC очень капризная в этом плане. Если бы использовал WTL например думаю никаких проблем не было бы. Поэтому лучше наведи порядок в классах. Много классов — это не так уж и страшно)