Dmitry Leonov (leonov) wrote,
Dmitry Leonov
leonov

Category:

ATLное

Нда, все-таки эти игры с отменой/возвратом поддержки XP в 2012-й студии не остались без последствий (причем ладно бы только в сторонних библиотеках, но ведь и с родными черт-те что). На первый взгляд все просто - в студии выбрать тулсет v110_xp, для консольной сборки определить _USING_V110_SDK71_ и наслаждаться процессом. Но вот сегодня убил буквально полдня, пытаясь понять, где же в проекте вылез код, дергающий под XP функцию InitializeCriticalSectionEx, которой в местном kernel32.dll просто нет - с понятными последствиями.

Поиски дошли до файла atlwinverapi.h, где _AtlInitializeCriticalSectionEx в зависимости от того, определен ли _USING_V110_SDK71_, вызывает либо ту самую InitializeCriticalSectionEx, либо InitializeCriticalSectionAndSpinCount. И совершенно фантастическое ощущение - смотреть, как дебаг-версия заходит в подсвеченную серым ветку, плюя на значение макроса. С причиной более менее понятно - MS не дает отдельную версию ATL, а собранная и используемая в MFC (причем с установленным _ATL_STATIC_LIB_IMPL, тоже любовался проходом по этой серой ветке) не в курсе про заморочки с v110_xp. Но как это обходить - совершенно непонятно, все настройки, до которых можно добраться в своем проекте, на это поведение не влияют по определению.

Пришлось смотреть, откуда идет этот вызов. Оказался единственным, но в CImage::CInitGDIPlus::CInitGDIPlus, что несколько напрягло - замаячила перспектива делать для XP версию без GDI+. По счастью все оказалось проще, пришлось избавиться только от ATL::CImage. Тоже дико, но не фатально.

Итого могу сказать, что хоть и неплохо, что появился v110_xp, но появился он в роли бедного родственника, далеко не весь код можно перенести без существенных потерь. Когда уж та XP вымрет...
Tags: программизм, софт
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 2 comments