MSLU
От: denaturat  
Дата: 25.04.06 05:22
Оценка:
Не знаю даже, в какой форум поместить.
Делаю проект ATL+WTL, MDI (Unicode+MSLU).
При обработке OnFileNew, как и положено, создаю новое дочернее окно. Имя окна генерируется следующим образом:

...
TCHAR szBuffer[256];
wsprintf(szBuffer, _T("Untitled %d"), ++m_nWindowCounter);
...


после чего использую полученный szBuffer в качестве имени нового окна. Переменная m_nWindowCounter инициализируется в конструкторе нулем.

Тут начинается самое интересное. Если проект без MSLU, то он, естественно, в Win9x не запускается. Если с MSLU — то работает, но (!) при запуске под Win98 при создании первого окна в качестве имени окна образуется текст вида "?????", а при создании второго и далее — все как положено, "Untitled 1", "Untitled 2" и т.д. В WinXP все в порядке.

PS. Используется VС++ 2005 Express + PSDK от 2005 года, поэтому продебажить в 98 виндовсе нет возможности.

Помогите, кто чем может.

Спасибо.
Re: MSLU
От: Блудов Павел Россия  
Дата: 25.04.06 05:33
Оценка:
Здравствуйте, denaturat, Вы писали:

D>Помогите, кто чем может.

ATL статически линкуется или используется dll?
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[2]: MSLU
От: denaturat  
Дата: 25.04.06 05:37
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

D>>Помогите, кто чем может.

БП>ATL статически линкуется или используется dll?

dll не используется
Re[3]: MSLU
От: Блудов Павел Россия  
Дата: 25.04.06 06:12
Оценка:
Здравствуйте, denaturat, Вы писали:

Шаманство с
    ::DefWindowProc(NULL, 0, 0, 0L);

Имеется?

До этих
    ATL::AtlAxWinInit();
    WTL::AtlInitCommonControls(...);


Или после?
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re: MSLU
От: denaturat  
Дата: 26.04.06 16:03
Оценка:
Ничего не помогает.
Манипуляции с ::DefWindowProc(...) ничего не дают,
сейчас она стоит в самом начале _tWinMain.
ATL::AtlAxWinInit не вызывается, ибо она, по всей вероятности,
должна находиться в lib, которой нет, соответственно, unresolved external.
Перенос буфера в определение класса и формирование имени
окна в нем — занятие странное, но и оно тоже ни к чему не привело.
При компиляции без UNICODE все нормально.

Ставил мессагебоксы. Буфер, в который я заношу имя нового окна, формируется правильно,
т.е. в моменты до и после вызова CMDIChildWindowImpl<>::Create()
в случае создания первого окна с именем "Untitled 1"
в нем сидит, как положено, "Untitled 1", а окно получает имя "?????".
Я думал, что поможет вызов SetWindowText после создания окна,
но он тоже приводит к этому результату.

И вот такие траблы именно только с первым окном. Следующее нормально
получает имя "Untitled 2" и т.д.

Полагал, что дело в используемой тут DockWins+TabControls, но просмотрев,
как там создаются окошки, отказался от этой мысли.

В чем дело — не доходит.

Машинку жалко. Столько раз перегружал.
Re[2]: MSLU
От: BuHHunyx Беларусь  
Дата: 26.04.06 16:42
Оценка:
Здравствуйте, denaturat, Вы писали:

D>Ничего не помогает.


[skip]

Проект юникодный?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: MSLU
От: denaturat  
Дата: 26.04.06 17:44
Оценка:
Здравствуйте, BuHHunyx, Вы писали:


BHH>Проект юникодный?


Да
Re[2]: MSLU
От: Блудов Павел Россия  
Дата: 27.04.06 04:16
Оценка:
Здравствуйте, denaturat, Вы писали:

D>ATL::AtlAxWinInit не вызывается, ибо она, по всей вероятности,

D>должна находиться в lib, которой нет, соответственно, unresolved external.
Это аналог ATL::AtlWinInit, но для проектов, хостящих ActiveX. Соответственно, вопрос повторяется, но про AtlWinInit.

D>Перенос буфера в определение класса и формирование имени

D>окна в нем — занятие странное, но и оно тоже ни к чему не привело.
D>При компиляции без UNICODE все нормально.
А он и не мог помоч. CreateWindowW в MSLU всё равно сделает временный буфер на стеке, преобразует туда строку и отправит в CreateWindowA.
Где была изначальная строка роли не играет.

D>И вот такие траблы именно только с первым окном. Следующее нормально

D>получает имя "Untitled 2" и т.д.
Собака явно рылась в RegisterClass. Попробуйте явно задать класс окна. Или даже вызвать RealRegisterClass ручками.

D>Машинку жалко. Столько раз перегружал.

А VPC/VMWare для кого придумали? Win98 в VPC живет лучше чем на настоящем железе этого года выпуска.

P.S. Ещё пара вопросов:
Win98 какая (их много было разных)?
IE какой? Установлен Common controls update? А Dcom update for win9x?
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[3]: Концы нашлись
От: denaturat  
Дата: 27.04.06 18:11
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Собака явно рылась в RegisterClass. Попробуйте явно задать класс окна. Или даже вызвать RealRegisterClass ручками.


Да, действительно в этом. Задал класс окна в DECLARE_WND_CLASS, и все заработало.

Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.