Я столкнулся с ситуацией, когда мне известен код
. Я создал приложение MFC в Visual Studio 2008, которое генерирует значок в трее и некоторые уведомления.Я читал, что могу использовать другую структуру NOTIFYICONDATA
для Windows Vista, чем для Windows XP, установив свойство cbSize
структуры для ее инициализации.Я также читал, что я могу использовать LoadIconMetric
в Windows Vista, чтобы загрузить свой значок для уведомления, тогда как в Windows XP эта функция мне не доступна, и я должен использовать LoadIcon
.
Вмое приложение, я установил следующее:
#ifndef WINVER
#define WINVER 0x0600 // Vista
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0600 // Vista
#end#if
#ifndef _WIN32_WINDOWS
#define _WIN32_WINDOWS 0x0600 // Vista
#endif
#ifndef _WIN32_IE
#define _WIN32_IE 0x0700
#endif
Я компилирую и связываю с Windows 7 SDK на компьютере с Windows 7 x64 в Visual Studio 2008. Мой тест для WindowsVista или выше выглядит следующим образом(прямо из MSDN):
static BOOL IsWinVistaOrLater()
{
// Initialize the OSVERSIONINFOEX structure.
OSVERSIONINFOEX osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
osvi.dwMajorVersion = 6;
osvi.dwMinorVersion = 1;
// Initialize the condition mask.
DWORDLONG dwlConditionMask = 0;
VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
// Perform the test.
return VerifyVersionInfo(&osvi,
VER_MAJORVERSION | VER_MINORVERSION,
dwlConditionMask);
}
Теперь вот интересная часть.Я использую IsWinVistaOrLater, чтобы определить, должен ли я использовать LoadIconMetric или LoadIcon:
if (IsWinVistaOrLater())
{
tnd_Happy.dwInfoFlags = NIIF_LARGE_ICON | tnd_Happy.dwInfoFlags;
LoadIconMetric(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_HAPPY), LIM_SMALL, &(tnd_Happy.hIcon));
} else {
tnd_Happy.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE (IDI_ICON_HAPPY)); // ICON RESOURCE ID
}
В XP это выдает сообщение «Ordinal 380 не найден в ComCtrl32.dll».Если я закомментирую звонок на LoadIconMetric
, все будет хорошо (даже если все эти цели установлены на Vista).Windows пытается импортировать все вызовы функций независимо от пути кода времени выполнения?