Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CDialog i DLL 
:(
    Опции темы
serg405
  Дата 16.9.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



есть иерархия класов которые все распиханы по dll. CDialogEx напрямую наследует CDialog
Код

#ifdef DIALOGEXAPI_EXPORTS
#define __DDL_EXP_DIALOGEX __declspec(dllexport)
#else
#define __DDL_EXP_DIALOGEX __declspec(dllimport)
#endif
class __DDL_EXP_DIALOGEX CDialogEx : public CDialog
{
    DECLARE_DYNAMIC(CDialogEx)

public:
    CDialogEx(UINT nIDTemplate,CWnd* pParent = NULL);
    CDialogEx(LPCTSTR lpszTemplateName,CWnd* pParent = NULL);
    virtual ~CDialogEx();
    BOOL Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);
    BOOL Create(UINT nIDTemplate, CWnd* pParentWnd = NULL);
    

protected:
    virtual void DoDataExchange(CDataExchange* pDX);
    DECLARE_MESSAGE_MAP()
};


CTihnDialog наследует CDialogEx.

Код

#ifdef THINDIALOGAPI_EXPORTS
#define __DDL_EXP_THINDIALOG_ __declspec(dllexport)
#else
#define __DDL_EXP_THINDIALOG_ __declspec(dllimport)
#endif
#include "../DialogExAPI/DialogEx.h"


class __DDL_EXP_THINDIALOG_ CThinDialog : public CDialogEx
{
    DECLARE_DYNAMIC(CThinDialog)
public:
    CThinDialog(UINT nIDTemplate, CWnd* pParent = NULL);
    virtual ~CThinDialog();
    BOOL Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);
    BOOL Create(UINT nIDTemplate, CWnd* pParentWnd = NULL);
};


И наконецто CMyDialog наследует CThinDialog

Код

#include "../../ThinDialogAPI/ThinDialog.h"
class CTNSWnd : public CThinDialog
{
    DECLARE_DYNAMIC(CTNSWnd)

public:
    CTNSWnd(CWnd* pParent = NULL);
    virtual ~CTNSWnd();
    enum { IDD = IDD_TNSWND };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);

    DECLARE_MESSAGE_MAP()
};


CMyDialog уже не в dll.
Проблема в том что когда я делаю так
Код

CMyDialog wnd;
wnd.Create(CMyDialog::IDD,parent);
 

У меня runtimre error вот на этой строке в Cdialog::Create
ASSERT(FALSE);          // invalid dialog template name

Я так понял что когда Create дошол до CDialogEx система уже не знала что такое IDD_TNSWND, тоесть не увидела ресурс.

Вопрос следующи: Как заставить ее видеть ресурс.
PM MAIL   Вверх
serg405
Дата 16.9.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



так превый вопрос я с горем пополам решыл. Для начала просто убрал из класов все Create, и дал работать CDialog::Create напрямую. Но это тоже не выход это так временно. Но появилась новая ошыбка. Окно создаеться корректно CDialog::Create возвращает 1 все прекрасно пока не вызываю 
Код

wnd.ShowWindow(SW_SHOW);

после этого вылет в wincore.cpp
Код

LRESULT CWnd::OnNTCtlColor(WPARAM wParam, LPARAM lParam)
{
    // fill in special struct for compatiblity with 16-bit WM_CTLCOLOR
    AFX_CTLCOLOR ctl;
    ctl.hDC = (HDC)wParam;
    ctl.hWnd = (HWND)lParam;
    _AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
    ctl.nCtlType = pThreadState->m_lastSentMsg.message - WM_CTLCOLORMSGBOX;
    //ASSERT(ctl.nCtlType >= CTLCOLOR_MSGBOX);
    ASSERT(ctl.nCtlType <= CTLCOLOR_STATIC);

    // Note: We call the virtual WindowProc for this window directly,
    //  instead of calling AfxCallWindowProc, so that Default()
    //  will still work (it will call the Default window proc with
    //  the original Win32 WM_CTLCOLOR message).
    return WindowProc(WM_CTLCOLOR, 0, (LPARAM)&ctl);
}


Код

ctl.nCtlType = pThreadState->m_lastSentMsg.message - WM_CTLCOLORMSGBOX;
pThreadState->m_lastSentMsg.message == 0 
соответственно  pThreadState->m_lastSentMsg.message - WM_CTLCOLORMSGBOX == -9999 короче не то что надо


и все это конечно же не пропускает 

Код

ASSERT(ctl.nCtlType <= CTLCOLOR_STATIC);


Я не могу понять что не так!!!!!???? Почему _afxThreadState.GetData(); возвратил NULL?
PM MAIL   Вверх
DrHex
Дата 16.9.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



wnd.DoModal(); - ради шутки попбобуй.

А вообще откуда ShowWindow делаешь ? попробуй из App.
--------------------
google.com и это все.
PM MAIL   Вверх
serg405
Дата 16.9.2009, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

wnd.DoModal(); - ради шутки попбобуй.


пробовал тот же ефект в том же месте.
и с App тоже error

Добавлено @ 16:56
[URL=http://cdialogindll.googlecode.com/svn/trunk/[/URL]
вот мой проект посмотрите кому не лень

Это сообщение отредактировал(а) serg405 - 16.9.2009, 17:52
PM MAIL   Вверх
Earnest
Дата 23.9.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Проект смотреть лень, но первое, что нужно проверить: чтобы реализовать такую иерархию, распихнутую по DLL, эти DLL должны быть типа Extension, а не Regular. Судя по первой ошибке, это не так.


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


 




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


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

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