![]() |
|
|
![]()
|
|
| aush |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 4.6.2007 Репутация: нет Всего: нет |
Мое первое сообщение на форуме, посему: Приветствую всех участников форума!
Буду писать максимально подробно, ибо дело очень срочное, сразу прошу прощения за возможные "грубейшие" ошибки из-за непонимания - не так давно работаю в си)) Итак, что имеем - проект, созданный в 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 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
По всем 3 вопросам ответ: все точно так же.
Код диалога, все обработчики, ресурсы - все остается прежним, можешь просто добавить эти файлы к новому проекту (а ресурсы - заменить). Только нужно подумать об экспорте (ну чтобы вызывать твой диалог откуда-нибудь). Вариантов 2: экспортировать весь класс (чтобы можно было его создавать где-угодно) или экспортировать глобальную функцию, которая этот диалог вызовет (DoModal()) и вернет результат. В первом случае нужно делать Extension DLL, иначе очень геморройно. Во втором - можно обойтись "обычной", но с Extension все же проще будет. Тип DLL лучше выбирать на стадии создания проекта. -------------------- ... |
|||
|
||||
| aush |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 4.6.2007 Репутация: нет Всего: нет |
ок, с созданием диалога и т.п. понятно, спасибо, но еще такой вопрос:
Я правильно понимаю - речь о том, что в некой программе будет иметься функция, которая будет вызываться из моей длл и которая уже откроет диалог и дальше будет работать как обычная программа? Мне нужен имеено такой вариант, т.е. на выходе я должен иметь длл и имя функции "входа в длл". На самом деле, мне еще нужна сама программа, которая вызовет эту функцию(т.е. у меня будет програмка, например, с одной кнопкой - "запустить", при нажатии на которую подгружается моя длл и дальше все работает как с обычной программой) Здесь у меня возникает вопрос - как выглядит вызов функции из длл в таком случае? Как эта функция описывается в длл? И как работает DoModal? Я понимаю, это простые вопросы, которые можно найти во многих книжках, но просто у меня сейчас горит и мне нужно как можно короче и понятнее быстро сделать это, так что если не сложно, разъясните, плиз... |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Да DoModal - это просто открытие диалога в модальном режиме. То, что должна делать твоя функция. Вызов функции всегда выглядит одинаково как вызов функции. Только чтобы функцию, к-я живет в DLL? можно было вызывать из других модулей, ее надо из DLL экспортировать, а в другие модули - импортировать. Способов это сделать несколько. Проще всего сделать так:
В свойствах проекта DLL (препроцессор) определяешь символ _MYDLL, чтобы экспортировать функцию. В клиентский код включаешь MyDll.h и вызываешь функцию. Это случай, когда зависимости прописываются жестко. Т.е. клиентский EXE еще при линковке привязывается к DLL, которая загружается автоматически и автоматически же разрешает ссылки. Если расматривать вариант динамической загрузки, то в DLL все то же самое, только функцию лучше описать как extern "C", чтобы не иметь геморроя с декорацией имен. В клиенте загружаешь DLL через LoadLibrary, а функцию ищешь через GetProcAddress. -------------------- ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |