【发布时间】:2010-11-04 15:10:17
【问题描述】:
我遇到过一种我知道密码的情况
我在 Visual Studio 2008 中创建了一个 MFC 应用程序,它生成一个托盘图标和一些通知。我已经读过,通过设置结构的cbSize 属性来初始化它,我可以为Windows Vista 使用与Windows XP 不同的NOTIFYICONDATA 结构。我还了解到我可以在 Windows Vista 中使用 LoadIconMetric 来加载通知图标,而在 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
我正在 Visual Studio 2008 中的 Windows 7 x64 机器上编译和链接 Windows 7 SDK。我对 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 上,这会因“在 ComCtrl32.dll 中找不到序数 380”而崩溃。如果我注释掉对LoadIconMetric 的调用,一切都会很愉快(即使所有这些目标版本都设置为Vista)。 Windows 是否会尝试导入所有函数调用而不考虑运行时代码路径?
【问题讨论】:
标签: visual-studio-2008 winapi visual-c++ mfc