Добавление syslink, не отображающего диалоговое окно mfc
Сначала добавив syslink в мое диалоговое окно, он не открывался. Меня попросили добавить следующую строку в мой код для отображения диалогового окна с элементом управления "Syslink".
#pragma comment(linker,"\"/manifestdependency:type='win32'\name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
Это работало нормально, когда я добавил эту строку в свой проект VS. Что означает эта строка кода?
Во-вторых, когда я добавил один и тот же код для диалогового окна и элемента управления syslink в файл.rc другого файла и в файле resource.h, и когда я скомпилировал его с помощью файла make, я столкнулся с той же проблемой. Однако на этот раз я добавил строку комментария #pragma. ( FYI - если я удаляю элемент управления syslink из файла rc, диалоговое окно работает нормально). В чем может быть проблема?
4 ответа
@ScottMcP-MVP Спасибо за ваш ответ.
На самом деле я решил вторую проблему. "/ALLOWISOLATION:NO" был установлен как опция компоновщика в моем make-файле, который создавал объектный файл и двоичные файлы, как если бы не было файла манифеста. Таким образом, директива "# pragma comment", которая модифицировала манифест, не действовала при компиляции из make-файла. Когда я удалил этот параметр компоновщика, все работало нормально, даже без вызова "InitCommonControls"
Насколько я понимаю, указанная "директива # pragma" добавляет комментарий в объектный файл для ссылки на библиотеку общих элементов управления, а также добавляет запись в файл манифеста для ссылки на библиотеку общих элементов управления, только если ее версия 6 или выше. (Поскольку syslink определяется только с версии 6)
Пожалуйста, поправьте меня, если я ошибаюсь.
Прагма заставляет библиотеку Microsoft быть связанной с вашей программой. Чтобы использовать эти "общие элементы управления 6", вам также необходимо вызвать InitCommonControlsEx во время запуска программы.
Это исправляет элемент управления SYSLink
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' "\
"version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
вы заметили, что добавление SYSLink выглядит хорошо в редакторе диалоговых форм, но при запуске реального приложения оно загружает диалоговое окно, в котором полностью отсутствуют все элементы управления, отсутствующие и т. д., некоторые говорят, что диалоговое окно вообще не загружается. Единственный способ это исправить.
Сбой из-за необходимости поддержки текста в кодировке Юникод, который по умолчанию не загружен, находится в версии 6 файла Comctl32.dll.
Все новые функциональные возможности, определенные в версии 6 ComCtl32.dll, поддерживают только Unicode. Следовательно, вы не можете создавать ANSI-версии элементов управления SysLink, только версии Unicode.
Так же не забудьте проверить наличие у вас флага /MANIFEST:YES иначе работать не будет.