Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Из .exe проекта сделать .dll, В MFC. Нужна помощь. 
:(
    Опции темы
aush
Дата 4.6.2007, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 у меня имеется код такого вида

Код

CClientDC dc(this); 
CPen NewPen(PS_SOLID, 1, RGB(0,255,0)) ;
CBrush NewBrush(RGB(0,0,0));
HRGN hRegion1 = CreateRectRgn(xa1,ya1,xa2,ya2);
HRGN hRegion2 = CreateRectRgn(xa1,ya1+285,xa2,ya2+285);
HRGN hRegion3 = CreateRectRgn(xa1,ya1+570,xa2,ya2+570);
FillRgn(dc, hRegion1, NewBrush);
FillRgn(dc, hRegion2, NewBrush);
FillRgn(dc, hRegion3, NewBrush);


Где переменным xa1, ya1 и т.д. начальные значения присваиваются в OnInitDialog (впрочем, это не важно - можно их и здесь заранее задать)

Как это реализовывается в проекте длл-ки?


Если собраться все в кучу, то имеется один глобальный вопрос - что и куда перекинуть из ехе проекта в длл проект так, чтобы оно работало?

Заранее огромное спасибо за помощь!


P.S.: если все-таки я где-то прогнал чушь какую-то, то могу выложить сам ехе проект, если надо будет
PM MAIL   Вверх
Earnest
Дата 4.6.2007, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



По всем 3 вопросам ответ: все точно так же.
Код диалога, все обработчики, ресурсы - все остается прежним, можешь просто добавить эти файлы к новому проекту (а ресурсы - заменить).

Только нужно подумать об экспорте (ну чтобы вызывать твой диалог откуда-нибудь). Вариантов 2: экспортировать весь класс (чтобы можно было его создавать где-угодно) или экспортировать глобальную функцию, которая этот диалог вызовет (DoModal()) и вернет результат.
В первом случае нужно делать Extension DLL, иначе очень геморройно. Во втором - можно обойтись "обычной", но с Extension все же проще будет. Тип DLL лучше выбирать на стадии создания проекта.




--------------------
...
PM   Вверх
aush
Дата 4.6.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 4.6.2007

Репутация: нет
Всего: нет



ок, с созданием диалога и т.п. понятно, спасибо, но еще такой вопрос:

Цитата(Earnest @  4.6.2007,  13:39 Найти цитируемый пост)
или экспортировать глобальную функцию, которая этот диалог вызовет (DoModal()) и вернет результат.


Я правильно понимаю - речь о том, что в некой программе будет иметься функция, которая будет вызываться из моей длл и которая уже откроет диалог и дальше будет работать как обычная программа?

Мне нужен имеено такой вариант, т.е. на выходе я должен иметь длл и имя функции "входа в длл". На самом деле, мне еще нужна сама программа, которая вызовет эту функцию(т.е. у меня будет програмка, например, с одной кнопкой - "запустить", при нажатии на которую подгружается моя длл и дальше все работает как с обычной программой)

Здесь у меня возникает вопрос - как выглядит вызов функции из длл в таком случае? Как эта функция описывается в длл? И как работает DoModal?

Я понимаю, это простые вопросы, которые можно найти во многих книжках, но просто у меня сейчас горит и мне нужно как можно короче и понятнее быстро сделать это, так что если не сложно, разъясните, плиз...
PM MAIL   Вверх
Earnest
Дата 4.6.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(aush @  4.6.2007,  16:31 Найти цитируемый пост)
Я правильно понимаю - речь о том, что в некой программе будет иметься функция, которая будет вызываться из моей длл и которая уже откроет диалог и дальше будет работать как обычная программа?

Да

DoModal - это просто открытие диалога в модальном режиме. То, что должна делать твоя функция.

Вызов функции всегда выглядит одинаково как вызов функции. Только чтобы функцию, к-я живет в DLL? можно было вызывать из других модулей, ее надо из DLL экспортировать, а в другие модули - импортировать.
Способов это сделать несколько. Проще всего сделать так:

Код

// MyDll.h

#ifdef _MYDLL
   #define MYDLL_API __declspec(dllexport)
#else
   #define MYDLL_API __declspec(dllimport)
#endif

int MYDLL_API ShowDialog (/*здесь можно какие-нибудь параметры*/);

// MyDll.cpp
#include "MyDll.h"

int ShowDialog()
{
   CMyDlg Dlg;
   return Dlg.DoModal();
}


В свойствах проекта DLL (препроцессор) определяешь символ _MYDLL, чтобы экспортировать функцию.

В клиентский код включаешь MyDll.h и вызываешь функцию.

Это случай, когда зависимости прописываются жестко. Т.е. клиентский EXE еще при линковке привязывается к DLL, которая загружается автоматически и автоматически же разрешает ссылки.
Если расматривать вариант динамической загрузки, то в DLL все то же самое, только функцию лучше описать как extern "C", чтобы не иметь геморроя с декорацией имен.
В клиенте загружаешь DLL через LoadLibrary, а функцию ищешь через GetProcAddress.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0463 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.