Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > CDialog i DLL


Автор: serg405 16.9.2009, 14:02
есть иерархия класов которые все распиханы по 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, тоесть не увидела ресурс.

Вопрос следующи: Как заставить ее видеть ресурс.

Автор: serg405 16.9.2009, 16:16
так превый вопрос я с горем пополам решыл. Для начала просто убрал из класов все 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?

Автор: DrHex 16.9.2009, 16:22
wnd.DoModal(); - ради шутки попбобуй.

А вообще откуда ShowWindow делаешь ? попробуй из App.

Автор: serg405 16.9.2009, 16:43
Цитата

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


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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)