| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Из .exe проекта сделать .dll |
| Автор: aush 4.6.2007, 12:20 | ||
| Мое первое сообщение на форуме, посему: Приветствую всех участников форума! Буду писать максимально подробно, ибо дело очень срочное, сразу прошу прощения за возможные "грубейшие" ошибки из-за непонимания - не так давно работаю в си)) Итак, что имеем - проект, созданный в Visual Studio 6 с помощью MFC AppWizard (exe). Проект имеет структуру: - Source Files / sig4.cpp ; sig4Dlg.cpp ; sig4.rc ; StdAfx.cpp - Header Files / sig4.h ; sig4Dlg.h ; Resource.h ; StdAfx.h - Resource Files / sig4.ico ; sig4.rc2 Задача: "Программа должна быть выполнена в виде процедуры, находящейся в какой-нибудь динамически подключаемой библиотеке." Пытаясь работать мозгом я пришел к такому умозаключению: в длл-ке имеет одна основная процедура, которая вызывается внешней программой и которая содержит основной исполняемй код моей программы. Близко к правде? Дальше: первое, что приходит в голову - создать новый проект посредством MFC AppWizard (dll). Плучаем: - Source Files / DLLsig.cpp ; DLLsig.def ; DLLsig.rc ; StdAfx.cpp - Header Files / DLLsig.h ; Resource.h ; StdAfx.h - Resource Files / sig4.rc2 А теперь задам вопросы списком: 1) Где в длл информация о расположении окон, кнопок и т.п. т.е того, что я могу визуально редактировать в случае ехе проекта кликнув по sig4.rc->dialog 2) Основной код моей программы находится в sig4Dlg.cpp. Большая часть процедур в нем - реакция на нажатия кнопок на форме. Как это должно выглядеть в проекте длл ? 3) При создании ехе проекта в sig4Dlg.cpp уже имеется некоторый код, в том числе функции BOOL Csig4Dlg::OnInitDialog() и void Csig4Dlg::OnPaint() В OnPaint у меня имеется код такого вида
Где переменным xa1, ya1 и т.д. начальные значения присваиваются в OnInitDialog (впрочем, это не важно - можно их и здесь заранее задать) Как это реализовывается в проекте длл-ки? Если собраться все в кучу, то имеется один глобальный вопрос - что и куда перекинуть из ехе проекта в длл проект так, чтобы оно работало? Заранее огромное спасибо за помощь! P.S.: если все-таки я где-то прогнал чушь какую-то, то могу выложить сам ехе проект, если надо будет |
| Автор: Earnest 4.6.2007, 13:39 |
| По всем 3 вопросам ответ: все точно так же. Код диалога, все обработчики, ресурсы - все остается прежним, можешь просто добавить эти файлы к новому проекту (а ресурсы - заменить). Только нужно подумать об экспорте (ну чтобы вызывать твой диалог откуда-нибудь). Вариантов 2: экспортировать весь класс (чтобы можно было его создавать где-угодно) или экспортировать глобальную функцию, которая этот диалог вызовет (DoModal()) и вернет результат. В первом случае нужно делать Extension DLL, иначе очень геморройно. Во втором - можно обойтись "обычной", но с Extension все же проще будет. Тип DLL лучше выбирать на стадии создания проекта. |
| Автор: Earnest 4.6.2007, 18:11 | ||||
Да DoModal - это просто открытие диалога в модальном режиме. То, что должна делать твоя функция. Вызов функции всегда выглядит одинаково как вызов функции. Только чтобы функцию, к-я живет в DLL? можно было вызывать из других модулей, ее надо из DLL экспортировать, а в другие модули - импортировать. Способов это сделать несколько. Проще всего сделать так:
В свойствах проекта DLL (препроцессор) определяешь символ _MYDLL, чтобы экспортировать функцию. В клиентский код включаешь MyDll.h и вызываешь функцию. Это случай, когда зависимости прописываются жестко. Т.е. клиентский EXE еще при линковке привязывается к DLL, которая загружается автоматически и автоматически же разрешает ссылки. Если расматривать вариант динамической загрузки, то в DLL все то же самое, только функцию лучше описать как extern "C", чтобы не иметь геморроя с декорацией имен. В клиенте загружаешь DLL через LoadLibrary, а функцию ищешь через GetProcAddress. |