Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "Разнос" проекта по dll, есть у кого опыт 
:(
    Опции темы
Coocky
Дата 3.11.2005, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Вообщем зхадача не из легких.
Есть SDI где-то с 20 представлениями. К каждому классу представления подключены еще отдельные заголовки других классов, для кнопочек, баз данных, и прочеих женских прелестей.
Мне нужно ВЕСЬ проект разбить на либы-каждое представление - либа.
1.Как по умному перенести готовые классы представлений.
2.Как быть с подключенными файлами других классов
У меня уже начинает болеть голова..
smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
nikf
Дата 3.11.2005, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 6.6.2005
Где: город-герой Жирно вск

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



Если конечно есть веские причины тогда конечно можно разнести. берешь бумажку и рисуешь все классы проги и смотришь как они взаимодействуют друг с другом. А потом пытаешься делить.. Какие-то общие классы выделяешь в отдельную dll и потом подключаешь ее к exe и всем dll-кам представлений.. примерно так.

Это сообщение отредактировал(а) nikf - 3.11.2005, 15:26
PM MAIL   Вверх
Coocky
Дата 3.11.2005, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(nikf @ 3.11.2005, 15:25)
Какие-то общие классы выделяешь в отдельную dll и потом подключаешь ее к exe и всем dll-кам представлений.. примерно так.

Вот у меня есть общие классы, которые подключаются к окнам.
Я их выношу в отдельную dll.
Что дальше? нужно подгружать их вв dll ,в которой они используются?
Т.е. получается паровоз? А что делать в ехе? Будет ли видеть прога функции dll. которые присоединяются к другой dll? Или надо все подключать в ехе?



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 3.11.2005, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Coocky @ 3.11.2005, 15:51)
Что дальше? нужно подгружать их вв dll ,в которой они используются?

Просто dependences установи. Ты не сказал, но я надеюсь, все это можно оставить в одном воркспэйсе (солюшене).

Цитата(Coocky @ 3.11.2005, 15:51)
Будет ли видеть прога функции dll. которые присоединяются к другой dll? Или надо все подключать в ехе?

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

В ехе можно оставить конфигурационный код - где-то же нужно управлять подключением компонент.



--------------------
...
PM   Вверх
nikf
Дата 3.11.2005, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 6.6.2005
Где: город-герой Жирно вск

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



Цитата(Coocky @ 3.11.2005, 15:51)
нужно подгружать их вв dll ,в которой они используются?

ты же используешь неявное подключение dll(я так думаюsmile) Тогда тебе не надо заботится ни о каких "подгрузках". Честно скажу у мня солюшн был максимум четыре проекта 1exe и 3dll(vs7). насчет двадцати не знаю - потянет ли, главное чтобы все компилировалось в один каталог и были доступны lib-ы и хидеры. все прозрачно для отладчика, работаешь как с одним проектом и проблем быть не должно..

Это сообщение отредактировал(а) nikf - 3.11.2005, 20:27
PM MAIL   Вверх
bel_nikita
Дата 3.11.2005, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата(Coocky @ 3.11.2005, 14:51)
Т.е. получается паровоз? А что делать в ехе? Будет ли видеть прога функции dll. которые присоединяются к другой dll? Или надо все подключать в ехе?

На самом деле разбить все на ДЛЛ это очень хорошо. Все идет паровозом smile Главное про SHARED_DATA не забывать. Желательно не использовать MFC классы на стыке Application<->DLL (интерфейс)

А что за SDI? Если это однотипные диалоги, то продумать интерфейс вызова этих ДЛЛ.

К примеру, у меня есть "проект пустышка", его задача держать связь с сервером и запускать нужные ДЛЛ по запросу пользователя. Продумал интерфес, который должны соблюдать все длл и последовательность вызова. Все... Теперь несколько человек пишут свои независимые ДЛЛ, а я лишь в xml файле создаю ассоциации: событие - ДЛЛ, т.е. по такому-то событию должна вызываться такая-то ДЛЛ.

У меня типа такого интерфейса:
Код

...
#if defined (_WINDLL) && defined (_AFXDLL)
AFX_EXT_API int   WINAPI _TInit(LPCTSTR pNameWindow,int iMode, void* pBufer, UINT Length );
AFX_EXT_API int   WINAPI _TDeInit(void* pBufer, UINT Length );
AFX_EXT_API int   WINAPI _TStart(int iPar);
AFX_EXT_API int   WINAPI _TStop(int iPar);
...
#endif
...

pBufer - это структура для инициализации ДЛЛ, или данные с которыми должна работать данная длл.

А вот, такой меню файл (xml), где прописываю очередной пункт меню, ДЛЛ и путь к ней:
Код

<menu name="&Tests">
  <item name="COSU-11 rev. 2 ( CDSP6B / SP 059 410 )" sp="SP059410" dir="\Tests\M20\" dll=WS.dll" /> 
  <item name="COSU-11 rev. 4 ( CDSP6B / SP 059 410 )" sp="SP059410" dir="\Tests\M21\" dll="SD.dll" /> 
  <item name="COSU-12 rev. 2 ( CDSP6B / SP 059 430 )" sp="SP059430" dir="\Tests\M22\" dll="WS.dll" /> 
  <item name="COSU-12 rev. 4 ( CDSP6B / SP 059 430 )" sp="SP059430" dir="\Tests\M20 Test1\AllCPCI\" dll="SD.dll" /> 
  <item name="COSU-14 ( CDSP6B / SP 059 481 )" sp="SP059481" dir="\Tests\AllCPCI\" dll="DF.dll" /> 
  <item name="MOSU-11 ( CDSP6B / SP 051 307 )" sp="SP051307" dir="\Tests\AllCPCI\" dll="KL.dll" /> 
  <item name="PMC D2 ( PMCD2 / SP 059 477 )" sp="SP059477" dir="\Tests\M19\" dll="OP.dll" /> 
</menu>

Так же можно указывать свои иницилизационные параметры, для каждой отдельной ДЛЛ.
Добавлено @ 21:21
А для "разноса" проекта по ДЛЛ рекомендую применить передовую технологию copy-past smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Coocky
Дата 3.11.2005, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(bel_nikita @ 3.11.2005, 21:14)
Главное про SHARED_DATA не забывать

smile
Цитата(bel_nikita @ 3.11.2005, 21:14)
Желательно не использовать MFC классы на стыке Application<->DLL (интерфейс)
smile
Цитата(bel_nikita @ 3.11.2005, 21:14)
А для "разноса" проекта по ДЛЛ рекомендую применить передовую технологию copy-past
smile
Earnest

Цитата
Просто dependences установи.

smile
Я понял, что ничего незнаю об МФС ДЛЛ smile
Добавлено @ 21:45
bel_nikita
Цитата(bel_nikita @ 3.11.2005, 21:14)
А вот, такой меню файл (xml), где прописываю очередной пункт меню, ДЛЛ и путь к ней:

Старина, я не так крут smile

Это сообщение отредактировал(а) Coocky - 3.11.2005, 21:47


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
bel_nikita
Дата 3.11.2005, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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





--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Coocky
Дата 4.11.2005, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Создал свой класс в длл,производный от диалога class My_Dll.
Добавил функцию void My_Dll::Create_Dialog ();
внутри нее вызвал Create(IDD_DIALOG1);

Подключил все к проге, а она не видит Mydll.Create_Dialog ();
А вот Mydll.Create(IDD_DIALOG) видит(правда не видит IDD_DIALOG1, ну это и понятно).
Если кому не трудно, напишите простенький пример, как экспортировать класс. Что б я понял, как правильно.
Чуйка у меня, что не правильно в заголовочном файле длл директивы препроцессора прописую..



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
bel_nikita
Дата 4.11.2005, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Coocky
а не смотрел ссылки? там как раз есть про экспорт MFC классов
Добавлено @ 12:21
могу примерчик проекта сделать, но только вечером smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Coocky
Дата 4.11.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



bel_nikita
Очень прошу! smile
Сделай MFC extension Dll проект, добавь любой диалог. и добавь функцию к классу диалога(к примеру void Coocky_stuped()
)
И посмотри-отобразится ли в твоем примере ехе вызов этой функции


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
bel_nikita
Дата 4.11.2005, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Компилятор и IDE: MSVC6 + SP6

1. Создаем стандартный MFC проект MainAppl.
2. Добавляем итем в меню и создаем событие:
Код
....
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    //{{AFX_MSG_MAP(CMainFrame)
    ON_WM_CREATE()
    ON_WM_SETFOCUS()
    ON_COMMAND(ID_COOCKY_DLL, OnCoockyDll)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()
...
void CMainFrame::OnCoockyDll() 
{
  // TODO: Add your command handler code here
  // Здесь будем вызывать методы DLL
}

4. В опциях проекта прописывам _AFXEXT и выставляем Debug Multithreaded DLL ( по другому: /MDd /D "_AFXEXT" )
5. Делаем ребилд.

Теперь займемся нашей DLL:

6. Создаем в той же директории, что и MainAppl, MFC extensions DLL. У нас это проект CoockyDLL.
7. Создаем в ресурсах диалог и его класс. У нас это CDialogCoocky : public CDialog.
8. Создаем классовую функцию Coocky_Is_You_Function:
Код
void CDialogCoocky::Coocky_Is_You_Function()
{
  AfxMessageBox("Coocky! This is you function from dll");
}

9. Вставляем макрос AFX_EXT_CLASS:
Код
...
class AFX_EXT_CLASS CDialogCoocky : public CDialog
{
...

10. Комментируем: //enum { IDD = IDD_DIALOG1 };
Код
...
class AFX_EXT_CLASS CDialogCoocky : public CDialog
{
// Construction
public:
    void Coocky_Is_You_Function();
    CDialogCoocky(CWnd* pParent = NULL);   // standard constructor

// Dialog Data
    //{{AFX_DATA(CDialogCoocky)
    //enum { IDD = IDD_DIALOG1 };
        // NOTE: the ClassWizard will add data members here
    //}}AFX_DATA
...

11. Открываем DialogCoocky.cpp и прописываем: IDD_DIALOG1
Код
CDialogCoocky::CDialogCoocky(CWnd* pParent /*=NULL*/)
    : CDialog(/*CDialogCoocky::IDD*/IDD_DIALOG1, pParent)
{
    //{{AFX_DATA_INIT(CDialogCoocky)
        // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
}

12. В файле StdAfx.h прописываем: #include "resource.h"
13. Делаем ребилд. Наша DLL готова.

Возвращаемся к нашему MainAppl.

14. Подключаем к проекту файл DialogCoocky.h
15. В файле StdAfx.h прописываем: #include "CoockyDLL/DialogCoocky.h"
16. В файле StdAfx.cpp прописываем:
Код
#if defined (_DEBUG)
  /************************************************************************/
  /*  DEBUG *.LIBs                                                        */
  /************************************************************************/
  #pragma comment(lib,"CoockyDLL/Debug/CoockyDLL.lib")
#else
  /************************************************************************/
  /*  RELEASE *.LIBs                                                      */
  /************************************************************************/
  #pragma comment(lib,"CoockyDLL/Release/CoockyDLL.lib")
#endif  //  _DEBUG

17. Теперь возвратимся к нашей функции OnCoockyDll(), в которой вызываем диалог из DLL:
Код
void CMainFrame::OnCoockyDll() 
{
  // TODO: Add your command handler code here
  CDialogCoocky Dlg;
  Dlg.Coocky_Is_You_Function();
  Dlg.DoModal();
}

18. Делаем ребилд проекта.
19. Копируем нашу CoockyDLL.dll в %PROJECT\Debug\
20. Нажимаем Execute MainAppl.exe и наслаждаемся smile

З.Ы.: проблемы типа: а чего в моей длл вызываются ресурсы ехе проекта - не рассматривались и мною опущены smile да бы не заниматься лишней писаниной

Это сообщение отредактировал(а) bel_nikita - 4.11.2005, 21:09

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  MainAppl.zip 43,88 Kb


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
bel_nikita
Дата 4.11.2005, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Ехе архив

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Exe.zip 14,53 Kb


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Coocky
Дата 7.11.2005, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(bel_nikita @ 4.11.2005, 21:05)
4. В опциях проекта прописывам _AFXEXT и выставляем Debug Multithreaded DLL ( по другому: /MDd /D "_AFXEXT" )

Итак анализируем.
Этому меня неучили да и в мануалах ненашел! smile
Может из-зи этого трабла у меня была.
Сейчас гляну smile
Добавлено @ 12:50
Код

// CoockyDLL.odl : type library source for CoockyDLL.dll

// This file will be processed by the MIDL compiler to produce the
// type library (CoockyDLL.tlb).

[ uuid(938670D9-AC66-4DE1-B946-D0D6CD86952B), version(1.0) ]
library CoockyDLL
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");



    //{{AFX_APPEND_ODL}}
    //}}AFX_APPEND_ODL}}
};

Этого у меня нет..Но это наверное код "шестерки" smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
bel_nikita
Дата 7.11.2005, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Coocky
Цитата
Этого у меня нет..Но это наверное код "шестерки"
Видать это я галочку на Automation выставил smile Это не нужно и не на что не должно влиять


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


 




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


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

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