gpt4 book ai didi

visual-studio-2008 - Windows 是否在应用程序中预加载 ComCtrl32.dll?

转载 作者:行者123 更新时间:2023-12-03 15:09:12 25 4
gpt4 key购买 nike

我遇到过我知道代码的情况

我在 Visual Studio 2008 中创建了一个 MFC 应用程序,它生成一个托盘图标和一些通知。我读过我可以使用不同的 NOTIFYICONDATA通过设置 cbSize,Windows Vista 的结构比 Windows XP 的结构要多。结构的属性来初始化它。我还读到我可以使用 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

我正在 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 中未找到 Ordinal 380”而崩溃。如果我注释掉对 LoadIconMetric 的调用,事情很开心(即使所有这些目标版本都设置为 Vista)。无论运行时代码路径如何,Windows 是否都会尝试导入所有函数调用?

最佳答案

只是为了帮助可能遇到非常类似问题的其他人。即使在 Windows 7 下使用 Visual Studio C++ 2010 Express WinApi 模板应用程序,我也无法让 LoadIconMetric 工作。将 Comctl32.lib 添加到依赖项并包括 CommCtrl.h 后,它一直说“在 ComCtrl32.dll 中找不到序号 380”。我不太清楚我错过了什么,因为我完全不熟悉这些组件的切换版本。很长一段时间后,我弄清楚了,这里是这种情况的宝贵来源:

Common Control Versions

我通过在包含 CommCtrl.h 之前添加这一行解决了这个问题(请注意,我的应用程序仅针对 Windows Vista 及更高版本):

// Need CommCtrl v6 for LoadIconMetric()
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

它源自 Microsoft 示例项目:

Notification Icon Sample - NotificationIcon.zip

关于visual-studio-2008 - Windows 是否在应用程序中预加载 ComCtrl32.dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4098076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com