Понятно, те "нормальный" MFC-шный CDateTimeCtrl, просто хотел уточнить, чтобы избежать.
Итак, поскольку, как уже неоднократно говорено, MFC есть обёртка для элементов управления Win API, то в этом и кроется проблема. В данном случае речь идёт о SysDateTimePick32.
Дело в том, что компилируемые в программу контролы зависят от подключаемой (используемой) версии comctl*.dll (comctl32.dll).
Которая в свою очередь зависит от системы. Поэтому и получается, что на одной системе всё работает, а на другой нет.
Что можно сделать, а что нельзя.
Сразу оговорюсь, что 2010-ой у меня уже давно нет, и дать точные указания что и где я не смогу.
* необходимо проверить целевую версию винды, заданную для компиляции, в новых версиях за это отвечает файл включаемый в stdafx.h -> #include "targetver.h"
его содержимое очень простое
#pragma once
// Including SDKDDKVer.h defines the highest available Windows platform.
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
#include <SDKDDKVer.h>
самое главное - инфа о макросе _WIN32_WINNT, именно его значение необходимо проверить и установить в соответствие с целевой платформой.
Очень может быть что в старом проекте его значение установлено скажем на NT 4.
* Вобще-то его максимальное значение определяется версией SDK-платформы используемой для компиляции. Её тоже необходимо проверить в настройках проекта. В 2015-ой это выглядит так
те в данном случае это SDK 7.1
Теперь о печальном.
мультибайтная компиляция перестаёт нормально поддерживатся в будущих версиях студии. начиная с 2013-ой она начинала предупреждать типа "MBCS is deprecated". потом совсем перевела MBCS в разряд ошибок. После кучи скандалов MS вернул MBCS, но как видно, сделал это очень неохотно.
Ладно, как говаривал герой Пуговкина: "Много текста" (с)
Если на 10-ой винде установлен Windows 10 Creators Update, то скорей всего проблема тривиально не решается.
Отсюда следует (всё переводить не буду), что в этом случае существуют две версии comctl32.dll
- 5.х для неюникодных приложений (плохая)
- 6.х новая, рекомендованная для юникодных (хорошая)
Цитата оригинального ответа MS (из линка выше)
This only occurs in applications that use the Date Time Picker implemented on COMCTL32 V5.
Any application using the COMCTL32 V5 Date Time Picker on RS2 will encounter this problem, including MFC and Windows Forms applications.
Unfortunately, there is currently no workaround for the issue when using the COMCTL32 V5 Date Time Picker other than removing the RS2 update, if possible.
Affected applications could be updated to use COMCTL32 V6, but this is not a trivial change due to the differences in the control implementations between V5 and V6.
Ну и далее один чел приводит возможное "решение", работоспособность которого проверить не могу.
Он нашёл по
линку (который у меня не открывается) способ использовать v.6. в MBCS компилятах.
для этого необходимо добавить в stdafx.h след
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
правда чел переживает о побочных эффектах и является ли это решение осмысленным workaround, но ответа на этот вопрос он так и не получил.
Так что самое надёжное и правильное, перевести проект таки на юникод.
1. жёстко закодированные тексты в принципе недопустимы, для этого есть ресурсы
2. если всё-таки такое и приходится делать (под дулом автомата), то брать их надо как минимум в _T("")
3. я не помню, если в 2010-ой регулярные выражения для поиска, если нет, то можно воспользоваться каким-нить другим редактором с такой ф-ей.
зы сорри за ошибки и очепятки