2015-10-11 5 views
0

Я пытаюсь установить простую гиперссылку в моем окне.InitCommonControlsEx() не работает с ICC_LINK_CLASS в Windows 8.1

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

Вы забыли манифест Common Controls 6? Для управления SysLink требуются общие элементы управления 6. – andlabs

+0

@andlabs Впервые услышал это. Теперь я буду google. Благодарю. – 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 был добавлен только в Common Controls версии 6. Для backwards compatibility reasons общие элементы управления 6 НЕ включены по умолчанию. Вы должны сделать это, создав манифест.

манифест может существовать как отдельный файл (с именем program.exe.manifest), либо как ресурс с определенным идентификатором ресурса. Строка #pragma сообщает компоновщику Microsoft для создания второго для вас. Вы также можете создать любую форму самостоятельно. Here's how.