2016-05-11 5 views
2

Я добавляю вызов функции окон SetProcessDpiAwareness в качестве первой вещи в приложении Delphi XE7 (после динамической загрузки библиотеки shcore). Я знаю, что предпочтительнее использовать манифест для установки значения DPIAware, и у меня это работает отдельно, и я буду использовать его в конечном итоге. Однако во время разработки я хочу использовать параметр командной строки для установки значения DPIAwareness, иначе мне придется перестроить приложение, чтобы изменить этот статус.Код ошибки SetProcessDpiAwareness

Проблема заключается в том, что SetProcessDpiAwareness возвращает код ошибки $ 800700A0. Это не описано в описании функции, что означает код?

А я нашел его, благодаря ответу смотреть на параметр, я объявил тип функции неправильно, я имел:

TSetDPIFunc = функция (константный PROCESS_DPI_AWARENESS): HRESULT; STDCALL;

, но PROCESS_DPI_AWARENESS не был определен как перечисление. Изменено на следующее, и теперь оно отлично работает:

TSetDPIFunc = function (const x: Integer): HRESULT; STDCALL;

+1

Вы вызываете 'SetProcessDPIAwareness' или' SetProcessDPIAware'? Название предлагает первое. Последний не возвращает код ошибки, ненулевое возвращение означает, что функция выполнена успешно. Пожалуйста, отредактируйте вопрос, чтобы очистить. –

+0

Если вы действительно звоните в SetProcessDPIAwareNESS, пожалуйста, покажите нам, с каким аргументом вы его называете! – CherryDT

+0

Функция SetProcessDpiAwareness, извините опечатка в оригинальной записи. – kaj66

ответ

1

0x8007XXXX является Win32 error code encapsulated in a COM HRESULT с использованием HRESULT_FROM_WIN32(). WIN32_FROM_HRESULT(0x800700A0) дает 0xA0, то есть код ошибки 160, который равен ERROR_BAD_ARGUMENTS («Один или несколько входных параметров неверны»).

Это не имеет значения для меня, хотя вы получаете эту ошибку, так как эта функция даже не принимает никаких аргументов!

Так что единственное, что я могу думать, было бы, что у него есть что-то с the issue described here, если вы изменили DPI настройки самостоятельно для тестирования и это не удалось, то:

Таким образом, кажется, что для того, чтобы SetProcessDPIAware (и связанные с ним подходы: SetProcessDpiAwareness() и manifest with true), чтобы работать правильно, вам нужно выйти из системы и войти в систему после изменения настройки DPI и перед запуском программы.

Кстати, в случае, если это полезно: Для тестирования проявляется не полностью восстановления, вы можете использовать mt.exe прикрепить манифест к приложению из командной строки.

+1

Вы также можете сохранить содержимое манифеста в отдельный файл '.manifest' в той же папке, что и исполняемый, вместо того, чтобы компилировать его в ресурс вообще. Например, если исполняемый файл вашего приложения называется 'MyApp.exe', сохраните манифест в' MyApp.exe.manifest'. Затем вы можете просто отредактировать файл по мере необходимости между прогонами. –

+0

Только если у вас нет уже установленного манифеста, который может быть по умолчанию у компилятора (потому что его также поощряет Microsoft). С Windows Vista внешние манифесты будут игнорироваться, если существует встроенный. – CherryDT

+2

Вы можете отключить встроенный манифест по умолчанию в параметрах проекта. –

 Смежные вопросы

  • Нет связанных вопросов^_^