Добавление 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 иначе работать не будет.

Другие вопросы по тегам