【问题标题】:InitCommonControlsEx() fails with ICC_LINK_CLASS in Windows 8.1InitCommonControlsEx() 在 Windows 8.1 中因 ICC_LINK_CLASS 而失败
【发布时间】:2016-01-08 17:28:20
【问题描述】:

我正在尝试在我的窗口上放置一个简单的超链接。

INITCOMMONCONTROLSEX iccx;
iccx.dwSize = sizeof(INITCOMMONCONTROLSEX);
iccx.dwICC  = ICC_LINK_CLASS;   // CommCtrl.h: #define ICC_LINK_CLASS 0x00008000
bool bResult = InitCommonControlsEx(&iccx); // bResult is false.
DWORD dwError = GetLastError(); // dwError is 0.

hWnd = CreateWindowExW( /*_In_      DWORD*/     0,
                        /*_In_opt_  LPCTSTR*/   WC_LINK, // CommCtrl.h: #define WC_LINK L"SysLink"
                        /*_In_opt_  LPCTSTR*/   L"Hello World",
                        /*_In_      DWORD*/     WS_VISIBLE | WS_CHILD | WS_TABSTOP,
                        /*_In_      int*/       50,
                        /*_In_      int*/       200,
                        /*_In_      int*/       100,
                        /*_In_      int*/       20,
                        /*_In_opt_  HWND*/      hWndParent,
                        /*_In_opt_  HMENU*/     NULL,
                        /*_In_opt_  HINSTANCE*/ hInstance,
                        /*_In_opt_  LPVOID*/    NULL);
DWORD dwError = GetLastError(); // hWnd is NULL and dwError is 1407.

错误码1407在here中解释如下。

ERROR_CANNOT_FIND_WND_CLASS
    1407 (0x57F)
    Cannot find window class.

我使用的是 Windows 8.1 Pro x64,我从未在任何其他版本的 Windows 上尝试过此代码。

这里有什么问题?

【问题讨论】:

  • 您忘记了 Common Controls 6 清单吗? SysLink 控件需要 Common Controls 6。
  • @andlabs 第一次听说。我现在谷歌一下。谢谢。
  • 经过一些互联网研究,我能够通过在 #include <CommCtrl.h> 包含 CommCtrl.h 之后添加代码 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 来解决我的问题。然而,我不知道我做了什么。
  • 该行指示 Microsoft 链接器添加 Common Controls 6 清单。有关详细信息,请参阅this page。 Windows 要求您执行此操作以选择加入新版本的通用控件库 for backward compatibility reasons

标签: c++ winapi hyperlink common-controls createwindow


【解决方案1】:

如你所见,添加

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

是解决问题的一种方法。

SysLink 控件仅在 Common Controls 版本 6 中添加。对于 backwards compatibility reasons,默认情况下未启用 Common Controls 6。您必须通过创建清单来选择加入它。

清单可以作为单独的文件(名为 program.exe.manifest)或作为具有特定资源 ID 的资源存在。 #pragma 行告诉微软的链接器为你生成第二个。您也可以自己制作任何一种形式。 Here's how.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2015-12-03
    相关资源
    最近更新 更多