2015-10-11 23 views
0

我试图在我的窗口上放一个简单的超链接。InitCommonControlsEx()在Windows 8.1中ICC_LINK_CLASS失败

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上尝试过这些代码。

这里有什么问题?

+4

您忘记了共同控制6清单吗? SysLink控件需要公共控件6. – andlabs

+0

@andlabs第一次听到它。我现在将谷歌它。谢谢。 – hkBattousai

+0

经过一番网络调查,我能够通过添加代码#pragma comment(linker,/ manifestdependency:\“type ='win32'name ='Microsoft.Windows.Common-Controls'version =' 6.0.0.0'processorArchitecture ='*'publicKeyToken ='6595b64144ccf1df'language ='*'\“”)''在包含CommCtrl.h'#include '之后。然而,我不知道我做了什么的解释。 – hkBattousai

回答

1

正如你已经想通了,加入

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

是解决这个问题的方法之一。

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

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