Проблема с месседж-маппом.
От: Jackson86 Россия  
Дата: 09.08.06 17:05
Оценка:
Здраствуйте.
В очередной раз я напоролся на неразрешимую проблему. Может кто-то подскажет мне, что сделать и этим спасет меня — буду очень благодарен.
Вобщем, вот в чем дело. Дали мне проект пределывать. Был написан изначально на Visual Studio 2002. Открываю я этот проект и пытаюсь собрать на Visual Studio 2005:

Ну вот, собираю я этот проект и вижу ошибку :

error C2440: 'static_cast' : cannot convert from 'UINT (__thiscall CFlatHeaderCtrl::* )(CPoint)' to 'LRESULT (__thiscall CWnd::* )(CPoint)'
Cast from base to derived requires dynamic_cast or static_cast

в строке объявления события ON_WM_NCHITTEST в карте сообщений класса CFlatHeaderCtrl:


BEGIN_MESSAGE_MAP(CFlatHeaderCtrl, CHeaderCtrl)
 FX_MSG_MAP(CFlatHeaderCtrl)
                  //{{AFX_MSG_MAP(CFlatHeaderCtrl)
    ON_WM_NCHITTEST()
                  //}}AFX_MSG_MAP
END_MESSAGE_MAP()


Объявление класса и метода:

class CFlatHeaderCtrl : public CHeaderCtrl
{
    DECLARE_DYNCREATE(CFlatHeaderCtrl)
    ... 
   // Generated message map functions
protected:
    //{{AFX_MSG(CFlatHeaderCtrl)
     ...
    afx_msg UINT OnNcHitTest(CPoint point);
                   ...
    //}}AFX_MSG
                   ...
};


Довольно странно, учитывая, что функция OnNcHitTest, унаследованная от CHeaderCtrl возвращает LRESULT.
Поначалу, я попытался решить эту проблему в лоб — просто заменил в объявлении и реализации OnNchitTest возвращаемое значение c UINT на LRESULT. В отместку мне высыпался список из 500-та ошибок.
Но ничего лучшего я не придумал.
В этом коде были замечены и другие странные вещи: переменную, объявленную внутри for(...) продолжали использовать и вне тела цикла!
Re: Проблема с месседж-маппом.
От: Аноним  
Дата: 10.08.06 00:35
Оценка:
Здравствуйте, Jackson86, Вы писали:

J>Довольно странно, учитывая, что функция OnNcHitTest, унаследованная от CHeaderCtrl возвращает LRESULT.

Закомментируйте старый обработчик и добавьте новый 2005-ым визардом. Смотрите разницу.


J> В этом коде были замечены и другие странные вещи: переменную, объявленную внутри for(...) продолжали использовать и вне тела цикла!

Старые майкрософтские компиляторы так себя вели. Теперь — соответствуют стндарту, но есть опция компилятора возвращающая старое поведение. Должна присутствовать в установках проекта.
Re[2]: Проблема с месседж-маппом.
От: Jackson86 Россия  
Дата: 10.08.06 13:54
Оценка:
Спасибо, обязательно попробую.
Re: Проблема с месседж-маппом.
От: Jackson86 Россия  
Дата: 10.08.06 15:19
Оценка:
Привет всем!

И вот у меня осталась уже одна ошибка — но понять не могу, что она означает!
msvcrtd.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
Re[2]: Проблема с месседж-маппом.
От: quentin  
Дата: 11.08.06 06:41
Оценка:
Здравствуйте, Jackson86, Вы писали:

J>Привет всем!


J>И вот у меня осталась уже одна ошибка — но понять не могу, что она означает!

J>msvcrtd.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup

Надо указать в установках линковщика, что надо собирать не консольное приложение, а для Windows (SUBSYSTEM: WINDOWS)
Best regards,
quentin a.k.a qYml
Re[3]: Проблема с месседж-маппом.
От: Jackson86 Россия  
Дата: 12.08.06 09:55
Оценка:
Здравствуйте, quentin.
Да это именно, то, что было нужно. Большое спасибо.
Re: Проблема с месседж-маппом.
От: Jackson86 Россия  
Дата: 12.08.06 09:58
Оценка:
Здраствуйте, это снова я со своими ошибками.
Да, никогда не думал, что копаться в чужом коде может быть так мучительно.
С вашей помощью мне таки удалось собрать этот проект, но вот новый косяк, который мне не по зубам.
Итак, приложение создано на основе архитектуры "document/view". При открытии главного окна, открывается документ, лежащий в папке с экзешником, или создается новый, если оного не имеется.
Тут -то я и встречаюсь с ошибкой. Мне выводится следующее сообщение в Message — Box:
Failed to create empty document.

Начинаю отслеживать ошибку. Мой путь начинается в перегруженной функции CWinApp:

void CMyWinApp::OnFileNew()
{
    if (m_pDocManager != NULL)
        m_pDocManager->OnFileNew();
}

Затем в OnFileNew() вызывается pTemplate->OpenDocumentFile(NULL)
Здесь документ создается, но фрейм нет — pFrame = CreateNewFrame(pDocument, NULL) — возвращает NULL.
При создании фрейма косяк возникает при попытке загрузить фрейм из ресурсов:
pFrame->LoadFrame( ...)
В этом методе сбой дает Create( ... )
Далее эстафету перехватывает CreateEx( ... )
Далее ошибка в HWND hWnd = ::AfxCtxCreateWindowEx( ... );
Возвращается NULL.

На мой взгляд, ошибок нигде нет, на Visual Studio 2002 такой ботвы близко не было, а на 2005 — м оно так меня огорчает. Может, все потому, что используется mdb — база данных? Но соединение ароде бы с ней нормально проходит, а до работы с ее данными приложение просто не доживает?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.