CSplitterWnd.CreateView
От: mentor Россия  
Дата: 16.08.04 11:38
Оценка:
Возникла такая проблема — на моей машине проект работает. Если откомпилированный или source унести на другую машину и там откомпилить — то прога падает. Падает в этом месте:

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
    int nRet = m_wndSplitter.CreateStatic(this, 2, 1);
    if (nRet) m_bIsSplitterCreated = true;
/*---->*/   m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CRichBrowserView), CSize(0, 0), pContext);
    m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CTraceBrowserView), CSize(0, 0), pContext);
    return nRet;
}


Вылетая говорит что Assertion Failed. и что это происходит в mfc42d.dll в файле winocc.cpp.
Когда то с этой проблемой столкнулся и на машине, на которой разрабатывал проект, но вот что сделал чтобы все заработало не помню
Что вообще это может быть??? Не Splitter окна создаются.
Подскажите, если кто что знает.
Re: CSplitterWnd.CreateView
От: rus blood Россия  
Дата: 16.08.04 12:37
Оценка:
Здравствуйте, mentor, Вы писали:


1. На что именно ругается в winocc.cpp ?
2. Что такое CRichBrowserView? Может там используются какие-то контролы, не установленный на другой машине?
Имею скафандр — готов путешествовать!
Re[2]: CSplitterWnd.CreateView
От: mentor Россия  
Дата: 16.08.04 12:51
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, mentor, Вы писали:



RB>1. На что именно ругается в winocc.cpp ?

RB>2. Что такое CRichBrowserView? Может там используются какие-то контролы, не установленный на другой машине?

1. Ругается на строчку 189. Это первая строчка метода

DWORD CWnd::GetStyle() const
{
    ASSERT(::IsWindow(m_hWnd));

    if (m_pCtrlSite == NULL)
        return (DWORD)GetWindowLong(m_hWnd, GWL_STYLE);
    else
        return m_pCtrlSite->GetStyle();
}


2. Это класс наследуемый от CRichEditView больше контролов вроде там нет
Re[3]: CSplitterWnd.CreateView
От: Vicont Россия  
Дата: 16.08.04 13:07
Оценка:
Здравствуйте, mentor, Вы писали:

M>Здравствуйте, rus blood, Вы писали:


RB>>Здравствуйте, mentor, Вы писали:



RB>>1. На что именно ругается в winocc.cpp ?

RB>>2. Что такое CRichBrowserView? Может там используются какие-то контролы, не установленный на другой машине?

M>1. Ругается на строчку 189. Это первая строчка метода


M>
M>DWORD CWnd::GetStyle() const
M>{
M>    ASSERT(::IsWindow(m_hWnd));

M>    if (m_pCtrlSite == NULL)
M>        return (DWORD)GetWindowLong(m_hWnd, GWL_STYLE);
M>    else
M>        return m_pCtrlSite->GetStyle();
M>}

M>


M>2. Это класс наследуемый от CRichEditView больше контролов вроде там нет


а на реализуцию CRichBrowserView посмотреть можно?
Re[4]: CSplitterWnd.CreateView
От: mentor Россия  
Дата: 16.08.04 13:27
Оценка:
Здравствуйте, Vicont, Вы писали:

M>>2. Это класс наследуемый от CRichEditView больше контролов вроде там нет


V>а на реализуцию CRichBrowserView посмотреть можно?



class CRichBrowserView : public CRichEditView
{
protected:
    CRichBrowserView();           // protected constructor used by dynamic creation
    DECLARE_DYNCREATE(CRichBrowserView)

// Attributes
public:

// Operations
public:
    //ValuesInfo* vlInfo;
    CTraceBrowserDoc* GetDocument();
    void GetRichEditInfo(CTraceBrowserDoc* pDoc, CTraceBrowserView* pView);
    inline CTraceBrowserApp* CRichBrowserView::GetApp()
    { return (CTraceBrowserApp*)AfxGetApp();}

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CRichBrowserView)
    public:
    virtual void OnInitialUpdate();
    protected:
    virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
    //}}AFX_VIRTUAL

// Implementation
protected:
    virtual ~CRichBrowserView();
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif


protected:
    CHARFORMAT2 m_cf;
    // Generated message map functions
protected:
    //{{AFX_MSG(CRichBrowserView)
    afx_msg void OnDestroy();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

#ifndef _DEBUG  // debug version in TraceBrowserView.cpp
inline CTraceBrowserDoc* CRichBrowserView::GetDocument() { 
    return (CTraceBrowserDoc*)m_pDocument; 
}
#endif


Или надо какого-т конкретного метода?
Re[5]: CSplitterWnd.CreateView
От: Vicont Россия  
Дата: 16.08.04 13:32
Оценка:
Здравствуйте, mentor, Вы писали:

M>Здравствуйте, Vicont, Вы писали:


M>>>2. Это класс наследуемый от CRichEditView больше контролов вроде там нет


V>>а на реализуцию CRichBrowserView посмотреть можно?


M>

M>class CRichBrowserView : public CRichEditView
M>{
M>protected:
M>    CRichBrowserView();           // protected constructor used by dynamic creation
M>    DECLARE_DYNCREATE(CRichBrowserView)

M>// Attributes
M>public:

M>// Operations
M>public:
M>    //ValuesInfo* vlInfo;
M>    CTraceBrowserDoc* GetDocument();
M>    void GetRichEditInfo(CTraceBrowserDoc* pDoc, CTraceBrowserView* pView);
M>    inline CTraceBrowserApp* CRichBrowserView::GetApp()
M>    { return (CTraceBrowserApp*)AfxGetApp();}

M>// Overrides
M>    // ClassWizard generated virtual function overrides
M>    //{{AFX_VIRTUAL(CRichBrowserView)
M>    public:
M>    virtual void OnInitialUpdate();
M>    protected:
M>    virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
M>    //}}AFX_VIRTUAL

M>// Implementation
M>protected:
M>    virtual ~CRichBrowserView();
M>#ifdef _DEBUG
M>    virtual void AssertValid() const;
M>    virtual void Dump(CDumpContext& dc) const;
M>#endif


M>protected:
M>    CHARFORMAT2 m_cf;
M>    // Generated message map functions
M>protected:
M>    //{{AFX_MSG(CRichBrowserView)
M>    afx_msg void OnDestroy();
M>    //}}AFX_MSG
M>    DECLARE_MESSAGE_MAP()
M>};

M>#ifndef _DEBUG  // debug version in TraceBrowserView.cpp
M>inline CTraceBrowserDoc* CRichBrowserView::GetDocument() { 
M>    return (CTraceBrowserDoc*)m_pDocument; 
M>}
M>#endif
M>


M>Или надо какого-т конкретного метода?


A AfxInitRichEdit() вызывается?

И еще можешь кинуть какие методы вызываются перед падением.
Re[6]: CSplitterWnd.CreateView
От: mentor Россия  
Дата: 16.08.04 13:46
Оценка:
Здравствуйте, Vicont, Вы писали:


V>A AfxInitRichEdit() вызывается?


Нет, а когда ее надо вызвать? Перед созданием splitter? И все-таки на моей то машине все пашет и без него...

V>И еще можешь кинуть какие методы вызываются перед падением.

А как мне это узнать? В Call Stack только вызовы mfc42d.dll и один вызов mfco42.dll но какие там конкретно методы вызываются... Как это посмотреть?
Re[7]: CSplitterWnd.CreateView
От: Аноним  
Дата: 16.08.04 13:49
Оценка:
Здравствуйте, mentor, Вы писали:

M>Здравствуйте, Vicont, Вы писали:



V>>A AfxInitRichEdit() вызывается?


M>Нет, а когда ее надо вызвать? Перед созданием splitter? И все-таки на моей то машине все пашет и без него...


V>>И еще можешь кинуть какие методы вызываются перед падением.

M>А как мне это узнать? В Call Stack только вызовы mfc42d.dll и один вызов mfco42.dll но какие там конкретно методы вызываются... Как это посмотреть?

ТвойAPP::InitInstance()
{
if(!AfxInitRichEdit())
{
TRACE("Error");
return FALSE;
}
....
}
Re[8]: CSplitterWnd.CreateView
От: Vicont Россия  
Дата: 16.08.04 13:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, mentor, Вы писали:


M>>Здравствуйте, Vicont, Вы писали:



V>>>A AfxInitRichEdit() вызывается?


M>>Нет, а когда ее надо вызвать? Перед созданием splitter? И все-таки на моей то машине все пашет и без него...


V>>>И еще можешь кинуть какие методы вызываются перед падением.

M>>А как мне это узнать? В Call Stack только вызовы mfc42d.dll и один вызов mfco42.dll но какие там конкретно методы вызываются... Как это посмотреть?

А>ТвойAPP::InitInstance()

А>{
А> if(!AfxInitRichEdit())
А> {
А> TRACE("Error");
А> return FALSE;
А> }
А> ....
А>}

Если это не сработает пиши какие функции проходит до обвала
Re[6]: CSplitterWnd.CreateView
От: mentor Россия  
Дата: 16.08.04 13:57
Оценка:
Здравствуйте, Vicont, Вы писали:

V>И еще можешь кинуть какие методы вызываются перед падением.


Но могу написать методы, в которых по assert падает:

В файле winsplit.cpp

Тут на первом ассерте:
AFX_STATIC void AFXAPI _AfxDeferClientPos(AFX_SIZEPARENTPARAMS* lpLayout,
    CWnd* pWnd, int x, int y, int cx, int cy, BOOL bScrollBar)
{
    ASSERT(pWnd != NULL);
    ASSERT(pWnd->m_hWnd != NULL);

    if (bScrollBar)
    {
        // if there is enough room, draw scroll bar without border
        // if there is not enough room, set the WS_BORDER bit so that
        //   we will at least get a proper border drawn
        BOOL bNeedBorder = (cx <= CX_BORDER || cy <= CY_BORDER);
        pWnd->ModifyStyle(bNeedBorder ? 0 : WS_BORDER,
            bNeedBorder ? WS_BORDER : 0);
    }
    CRect rect(x, y, x+cx, y+cy);

    // adjust for border size (even if zero client size)
    if (!afxData.bWin4)
    {
        if (bScrollBar)
            rect.InflateRect(CX_BORDER, CY_BORDER);
        else
            pWnd->CalcWindowRect(&rect);
    }

    // adjust for 3d border (splitter windows have implied border)
    if ((pWnd->GetExStyle() & WS_EX_CLIENTEDGE) ||
          pWnd->IsKindOf(RUNTIME_CLASS(CSplitterWnd)))
        rect.InflateRect(afxData.cxBorder2, afxData.cyBorder2);

    // first check if the new rectangle is the same as the current
    CRect rectOld;
    pWnd->GetWindowRect(rectOld);
    pWnd->GetParent()->ScreenToClient(&rectOld);
    if (rect != rectOld)
        AfxRepositionWindow(lpLayout, pWnd->m_hWnd, rect);
}



Здест тоже на ASSERT

CWnd* CSplitterWnd::GetPane(int row, int col) const
{
    ASSERT_VALID(this);

    CWnd* pView = GetDlgItem(IdFromRowCol(row, col));
    ASSERT(pView != NULL);  // panes can be a CWnd, but are usually CViews
    return pView;
}


В файле winocc.cpp
BOOL CWnd::SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx,
    int cy, UINT nFlags)
{
    ASSERT(::IsWindow(m_hWnd));

    if (m_pCtrlSite == NULL)
        return ::SetWindowPos(m_hWnd, pWndInsertAfter->GetSafeHwnd(),
            x, y, cx, cy, nFlags);
    else
        return m_pCtrlSite->SetWindowPos(pWndInsertAfter, x, y, cx, cy, nFlags);
}


afxwin2.inl

_AFXWIN_INLINE void CWnd::GetWindowRect(LPRECT lpRect) const
    { ASSERT(::IsWindow(m_hWnd)); ::GetWindowRect(m_hWnd, lpRect); }



wincore.cpp

void CWnd::CenterWindow(CWnd* pAlternateOwner)
{
    ASSERT(::IsWindow(m_hWnd));

    // determine owner window to center against
    DWORD dwStyle = GetStyle();

// тут еще много...
}
Re[9]: CSplitterWnd.CreateView
От: mentor Россия  
Дата: 16.08.04 14:11
Оценка:
Здравствуйте, Vicont, Вы писали:

V>Если это не сработает пиши какие функции проходит до обвала


Не сработало.
Я открываю файл, вызывается OpenDocumentFile(PathName)
который вызывает update вьюшек, одной из которых является CRichEditView, и у нее вызывается OnCreateClient, в котором все и падает.
Прихожение у меня мультидоковое, если это имеет значение.
Re[9]: CSplitterWnd.CreateView
От: mentor Россия  
Дата: 17.08.04 10:33
Оценка:
Здравствуйте, Vicont, Вы писали:


V>>>>A AfxInitRichEdit() вызывается?


M>>>Нет, а когда ее надо вызвать? Перед созданием splitter? И все-таки на моей то машине все пашет и без него...


V>>>>И еще можешь кинуть какие методы вызываются перед падением.

M>>>А как мне это узнать? В Call Stack только вызовы mfc42d.dll и один вызов mfco42.dll но какие там конкретно методы вызываются... Как это посмотреть?

А>>ТвойAPP::InitInstance()

А>>{
А>> if(!AfxInitRichEdit())
А>> {
А>> TRACE("Error");
А>> return FALSE;
А>> }
А>> ....
А>>}

V>Если это не сработает пиши какие функции проходит до обвала


Кстати говоря, MSDN по поводу AfxInitRichEdit() сказал:
[msdn]
AfxInitRichEdit
BOOL AFXAPI AfxInitRichEdit( );

Remarks

Call this function to initialize the rich edit control for the application. It will also initialize the common controls library, if the library hasn’t already been initialized for the process. If you use the rich edit control directly from your MFC application, you should call this function to assure that MFC has properly initialized the rich edit control runtime. If you use rich edit via CRichEditCtrl, CRichEditView, or CRichEditDoc, you don't need to call this function.

--------------------------------------------------------------------------------

[/msdn]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.