Страница 1 из 1

Передача объекта и ID из dll-ки

Добавлено: 24 дек 2004, 10:41
Shanga
Суть такова:
Мне необходимо создать вкладку в головной программе импортируя из dll ID диалога и объект класса
Вот импорт:

Код: Выделить всё

extern "C" __declspec(dllimport) UINT  __stdcall GetMyParentID();
extern "C" __declspec(dllimport) CDialog* __stdcall GetMyParentObject(); // ???????


CDLLTestDlg::CDLLTestDlg(CWnd* pParent )
   : CDialog(CDLLTestDlg::IDD, pParent)
{
   m_page3 = GetMyParentObject();     // CDialog* m_page3;
}

BOOL CDLLTestDlg::OnInitDialog()
{
       ...
       item.mask = TCIF_PARAM;
       item.lParam = (LPARAM)m_page3;
       m_TabControl.SetItem(2, &item);

       VERIFY(m_page3->Create(GetMyParentID(), &m_TabControl));

       m_page3->SetWindowPos(NULL, 10, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
       m_page3->ShowWindow(SW_HIDE);
}
где m_page3 тот самый объект,
а GetMyParentID() должен возвращать ID

Вот что я пишу в dll

Код: Выделить всё

extern "C" __declspec(dllexport) CDialog* CALLBACK GetMyParentObject()   // ?????
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());
   CPage3* page = new CPage3;                                            // ????????
   return page;                                                          // ????????
}
extern "C" __declspec(dllexport) UINT CALLBACK GetMyParentID()
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());
   return CPage3::IDD;
}
Функции работают но ошибки с передачей данных

Я пытаюсь вернуть указатель на CPage3 через CDilog это наверное неверно также как и с передачей ID
Подскажите...

Добавлено: 24 дек 2004, 13:00
Eugie
Какие ошибки?

Добавлено: 24 дек 2004, 13:40
Shanga
Ошибок нет но не выводится нужный результат т.е. я хочу диалог из dll-ки в качестве вкладки, а мне выводит диалог предыдущей вкладки

И при всем при этом я не могу создать объект нужного класса (из dll-ны)

Добавлено: 24 дек 2004, 16:10
Eugie
TCN_SELCHANGE обрабатываете? Tab Control сам не умеет переключать страницы.

Вообще, советую использовать Property Sheet - гораздо удобнее.

Добавлено: 24 дек 2004, 17:37
Shanga
Вкладки у меня работают безотказно дело в том, что моя программа не получает объект класса из dll и по этому идет дублирование диалога

Мой вопрос в следующем : КАК ПРАВИЛЬНО ПЕРЕДАВАТЬ ОБЪКТ КЛАССА (диалогового окна) ИЗ DLL-ки ???????? :?:

Добавлено: 24 дек 2004, 18:05
Eugie
Классы можно импортировать и экспортировать. Выглядит это примерно так:

Код: Выделить всё

// заголовок диалога-страницы MyPage.h

...
#ifdef _DLL
   #define CLASS_DECLSPEC    __declspec(dllexport)
#else
   #define CLASS_DECLSPEC    __declspec(dllimport)
#endif

class CLASS_DECLSPEC CMyPage : public CDialog
...

// файл основной программы MyDlgApp.cpp
...
  m_pMyPage = new CMyPage;
...
Файл MyPage.h надо будет добавить в проект основной программы, туда же включить IDD шаблона страницы.

Добавлено: 24 дек 2004, 18:37
Shanga
Спасибо все теперь на своих местах :D

Но есть еще один вопрос: Можно ли обойтись без включения h-файла и IDD шаблона ???