Создание COM-сервера Delphi 7 в приложении XE2 приводит к масштабированию формы на ноутбуке с высоким DPI
У нас есть DLL-сервер COM-сервера, написанный на Delphi 7, который используется из приложения VCL, написанного на XE2.
В Microsoft Surface Book с разрешением 3000x2000 приложение XE2 запускается нормально и масштабируется нормально, но когда пользователь выбирает параметр, который вызывает использование COM DLL, основная форма внезапно уменьшается до половины своего размера, наряду с текст и элементы управления.
У нас есть связанное приложение Delphi 7 VCL, в котором возникла та же проблема, но теперь мы включили пользовательский манифест, в котором конкретно указано, что DPIAware является ложным. Это отлично работает на поверхности книги. Мы попробовали ту же технику на COM DLL, но это не имеет никакого эффекта.
Мы можем заставить программу XE2 корректно масштабироваться с нашей Delphi 7 COM DLL, если у нас есть значение реестра для предпочтения внешних манифестов и включить файл манифеста с приложением XE2. Тем не менее, он также выполняет другое приложение XE2 изнутри, используя WinExec, и тогда это второе приложение XE2 плохо масштабируется. Включение манифеста для второго приложения XE2 не имеет никакого эффекта, если только он не запущен напрямую, а не из первого приложения XE2.
Как ни странно, если мы создаем COM-сервер в XE2, он всегда правильно масштабируется в ситуациях с высоким DPI, даже без специального манифеста, поэтому в настоящее время мы пытаемся преобразовать DLL-библиотеку Delphi 7 в XE2, но это большая работа, поскольку есть ряд устаревших пакетов компонентов, которые больше не доступны для XE2.
Обратите внимание, что приложение XE2 масштабируется, как только CoCreate вызывается для COM-сервера. При освобождении COM-сервера он не уменьшается до своего первоначального размера.
У кого-нибудь есть идеи о том, как заставить DLL-библиотеку Delphi 7 сообщать Windows, что она не поддерживает DPI, чтобы другие приложения, не поддерживающие DPI, не использовали ее при правильном масштабировании?
1 ответ
У меня была похожая проблема с VB6 Exe и.Net Com Interop Dll (оба не поддерживают DPI). На дисплеях с высокой настройкой DPI размер окна внезапно изменился.
Этот обходной путь решил эту проблему: я установил настройку совместимости exe "Отключить масштабирование дисплея при настройках с высоким DPI".