Точка входа в процедуру setprocessdpiawarenesscontext не найдена в dll user32 dll

Обновлено: 21.11.2024

Рекомендуется установить осведомленность о DPI процесса по умолчанию через манифест приложения. Дополнительную информацию см. в разделе Настройка поддержки DPI по умолчанию для процесса. Установка осведомленности о DPI процесса по умолчанию с помощью вызова API может привести к неожиданному поведению приложения.

Задает для текущего процесса указанный контекст осведомленности о количестве точек на дюйм (dpi). Контексты осведомленности о DPI берутся из значения DPI_AWARENESS_CONTEXT.

Синтаксис

Параметры

Возвращаемое значение

Эта функция возвращает TRUE, если операция прошла успешно, и FALSE в противном случае. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Возможные ошибки: ERROR_INVALID_PARAMETER для недопустимых входных данных и ERROR_ACCESS_DENIED, если режим осведомленности об API по умолчанию для процесса уже установлен (через предыдущий вызов API или в манифесте приложения).

Примечания

Этот API представляет собой более продвинутую версию ранее существовавшего API SetProcessDpiAwareness, позволяющую устанавливать для процесса по умолчанию более точные значения DPI_AWARENESS_CONTEXT. Самое главное, это позволяет вам программно установить Per Monitor v2 в качестве значения процесса по умолчанию, что было невозможно с предыдущим API.

Этот метод устанавливает значение DPI_AWARENESS_CONTEXT по умолчанию для всех потоков в приложении. Отдельные потоки могут изменить свою осведомленность о DPI по умолчанию с помощью метода SetThreadDpiAwarenessContext.

В целом рекомендуется не использовать SetProcessDpiAwarenessContext для установки поддержки DPI для вашего приложения. Если возможно, вы должны объявить поддержку DPI для своего приложения в манифесте приложения. Дополнительные сведения см. в разделе Настройка поддержки DPI по умолчанию для процесса.

Вы должны вызывать этот API перед вызовом любых API, зависящих от осведомленности о DPI (в том числе перед созданием любого пользовательского интерфейса в вашем процессе). После того как для приложения настроена поддержка API, любые будущие вызовы этого API не будут выполняться. Это верно независимо от того, задали ли вы поддержку DPI в манифесте или с помощью этого API.

Если уровень осведомленности о DPI не задан, по умолчанию используется значение DPI_AWARENESS_CONTEXT_UNAWARE.

B1tF1ghter: Ну, это ФАКТ, который, к сожалению, МНОГИЕ люди не видят, что у GOG настоящие двойные стандарты, к сожалению.

Да, я понял сообщение. Это довольно забавно. Это дополнительное наказание для клиентов за то, что им доверили бесплатную копию DRM.
Похоже, что законным клиентам они доверяют меньше, чем пиратам. В конце концов, история доказывает, что в ДОЛГОСРОЧНОЙ ПЕРСПЕКТИВЕ DRM докучал законным покупателям.
Также: protip: Если вы цитируете длинное сообщение, вы можете поставить . или что-то еще между тегами кавычек, и он все равно будет ссылаться на исходное цитируемое сообщение, не занимая много места визуально.

Я знаю, что это региональная проблема. Я вижу много игр, которые в Steam дешевле, чем в GOG. Потому что там, где я живу, видеоигры по-прежнему считаются роскошью, не говоря уже о высоких ценах на железо и т. д. Если бы издатели устанавливали цены на свои игры в Steam так же, как в других регионах, они не собирались бы хорошо продаваться. И я никогда не виню GOG, потому что у меня есть выбор покупать более дешевые игры в Steam, но я решил купить их здесь. Это лично на мне.

И при этом, если какие-то игры стоят в 3-4 раза больше, чем в стиме, надо это учитывать. Другие игры, такие как Cyberpunk, сравнивая (мои местные) цены в Steam и GOG, разница невелика, всего на несколько долларов больше. Поэтому в этом случае нечего рассматривать.

timmy010: Если бы этот саппорт выиграл 7-dx12, я бы взял его, а то меня это не беспокоит. Кто-нибудь проверял это на win7?

Наконец-то я попробовал его с автономным установщиком, и, по крайней мере, у меня он устанавливается в Windows 7, но не запускается.

При попытке запустить игру выдает ошибку:

Точка входа не найдена:

Не удалось найти точку входа в процедуру SetProcessDpiAwarenessContext в библиотеке динамической компоновки USER32.dll.

Некоторые комментарии:

<р>1. Я не обновлял свою установку Windows 7 до самой последней версии (когда появились новости, что MS реализовала отслеживание, подобное Win10, для Windows 7), я прекратил обновление W7 в этот момент. Я думаю, что поддержка W7 в любом случае была относительно близка к концу в тот момент.

<р>2. У меня есть только DirextX 11. Да, я слышал, что DX12 каким-то образом должен быть возможен в Windows 7 (по крайней мере, с некоторыми играми, такими как World of Warcraft), но понятия не имею, нужно ли его устанавливать вручную или что (гугл не очень помог). Таким образом, если предварительным условием для того, чтобы это вообще могло работать в Windows 7, является установка DirectX12, я не выполнил это требование.

<р>3. Это довольно старый игровой ноутбук (NVidia Geforce GTX 670M и т. д.), поэтому я не уверен, смогу ли я успешно запустить игру, даже если я работаю под управлением Windows 10. На нем едва ли можно запускать старые игры ААА, такие как GTA V или The Witcher 3, на средней скорости. /низкие настройки.

В любом случае, судя по тому, что говорили другие, я бы отказался, если бы единственным вариантом было играть в Windows 7. на низких настройках, но на данный момент на его SSD-накопителе емкостью 500 ГБ явно недостаточно свободного места.)


EDIT: вот еще одна игра с такой же ошибкой в ​​Windows 7, чтобы дать некоторое представление о том, что это может быть:

timppu: точка входа не найдена:

Не удалось найти точку входа в процедуру SetProcessDpiAwarenessContext в библиотеке динамической компоновки USER32.dll.

Эта ошибка означает, что этот метод "SetProcessDpiAwarenessContext" не был найден в DLL user32, эта DLL является системной, а не частью игры или даже DirectX

Быстрая проверка этого метода в MSDN:

Минимальный поддерживаемый клиент: Windows 10, версия 1703 [только настольные приложения]
Минимальный поддерживаемый сервер: Windows Server 2016 [только настольные приложения]

Gersen: Эта ошибка означает, что этот метод "SetProcessDpiAwarenessContext" не был найден в DLL user32, эта DLL является системной, а не частью игры или даже DirectX< /p>

Да, мне просто было интересно узнать об этой статье, как по крайней мере некоторым удалось заставить Teardown (другую игру) работать в Windows 7, когда у нее было такое же сообщение об ошибке, но это, по-видимому, заключалось в изменении чего-то в самой игре с помощью шестнадцатеричного кода. редактор и, возможно, это даже не исправило это для всех.

В любом случае, я думаю, Windows 7 не подходит для этой игры, вот и все. Интересно, сможет ли кто-нибудь запустить его на Linux WINE?

EDIT: В любом случае, да, возможно, это не имеет никакого отношения к DirectX12, я даже не знаю, использует ли игра DX12 или Vulkan, или оба, или ни то, ни другое.

timmy010: Если бы этот саппорт выиграл 7-dx12, я бы взял его, а то меня это не беспокоит. Кто-нибудь проверял это на win7?

timppu: я, наконец, попробовал его с помощью автономного установщика, и, по крайней мере, для меня он устанавливается в Windows 7, но не запускается.

При попытке запустить игру выдает ошибку:

Точка входа не найдена:

Не удалось найти точку входа в процедуру SetProcessDpiAwarenessContext в библиотеке динамической компоновки USER32.dll.

Некоторые комментарии:

<р>1. Я не обновлял свою установку Windows 7 до самой последней версии (когда появились новости, что MS реализовала отслеживание, подобное Win10, для Windows 7), я прекратил обновление W7 в этот момент. Я думаю, что поддержка W7 в любом случае была относительно близка к концу в тот момент.

<р>2. У меня есть только DirextX 11. Да, я слышал, что DX12 каким-то образом должен быть возможен в Windows 7 (по крайней мере, с некоторыми играми, такими как World of Warcraft), но понятия не имею, нужно ли его устанавливать вручную или что (гугл не очень помог). Таким образом, если предварительным условием для того, чтобы это вообще могло работать в Windows 7, является установка DirectX12, я не выполнил это требование.

<р>3. Это довольно старый игровой ноутбук (NVidia Geforce GTX 670M и т. д.), поэтому я не уверен, смогу ли я успешно запустить игру, даже если я работаю под управлением Windows 10. На нем едва ли можно запускать старые игры ААА, такие как GTA V или The Witcher 3, на средней скорости. /низкие настройки.

В любом случае, судя по тому, что говорили другие, я бы отказался, если бы единственным вариантом было играть в Windows 7. на низких настройках, но на данный момент на его SSD-накопителе емкостью 500 ГБ явно недостаточно свободного места.)

EDIT: вот еще одна игра с такой же ошибкой в ​​Windows 7, чтобы дать некоторое представление о том, что это может быть:

Проголосуйте за то, что попробовали и написали об этом :)

Интересно следить за попытками сделать «невозможное», заставив что-то работать на W7 (или нет). По крайней мере, до того момента, как некоторые неуверенные в себе тролли пытаются снести его со спамом типа «его мертвый и т. д.», о котором никто не просил. Я имею в виду, что не так с этими людьми?

Довольно часто при попытке открыть игру или получить доступ к Adobe Photoshop вы можете столкнуться с ошибкой «Точка входа не найдена, точка входа в процедуру не найдена в динамической библиотеке “. Эта ошибка возникает в основном, когда приложению не удается найти библиотеку DLL.

Вы также можете увидеть ошибку из-за повреждения файла dll, если файл dll отсутствует, если он не находится по указанному пути, из-за поврежденных файлов конфигурации или драйверов или просто из-за неправильной конфигурации. Удаление и повторная установка приложения, обновление до текущей версии или восстановление системы иногда могут помочь вам избавиться от ошибки, но не всегда решают проблему.

К счастью, есть несколько способов исправить эту ошибку. Посмотрим, как.

Оглавление

Способ 1: путем установки DLL-файла

Шаг 1. Нажмите на ссылку ниже, чтобы открыть официальную страницу загрузки DLL-файла Microsoft:

Нажмите на ссылку "Скачать", выделенную красным цветом.

Шаг 2. Затем выберите загружаемый файл в зависимости от типа вашей системы (32-разрядная/64-разрядная) и нажмите "Далее".

Здесь мы выбрали файл загрузки для 64-битной архитектуры системы. Если у вас 32-битный ПК, выберите vc_redist.x86.exe

*Примечание. Если вы не знаете, как найти информацию о системе/тип системы в Windows 10, обратитесь к этой статье.

Шаг 3. После завершения загрузки нажмите на нее, чтобы открыть файл установки. Установите флажок рядом с Я принимаю условия лицензии и нажмите Установить.

Теперь дождитесь завершения установки.

После завершения установки перезагрузите компьютер, и ошибка DLL должна исчезнуть. Но если проблема не устранена, воспользуйтесь вторым способом.

Способ 2. Запуск проверки системных файлов

Шаг 1. Перейдите в меню "Пуск" и введите cmd в поле поиска.

Шаг 2. Щелкните результат правой кнопкой мыши и выберите «Запуск от имени администратора» в контекстном меню, чтобы открыть командную строку в режиме с повышенными привилегиями.

Шаг 3. В окне командной строки (администратора) выполните приведенную ниже команду и нажмите Enter:

Этот процесс занимает немного больше времени, поэтому подождите, пока он не закончится. Он найдет поврежденные файлы и соответствующим образом восстановит их.

Перезагрузите компьютер и попробуйте открыть приложение, которое показало ошибку, и ошибка больше не должна появляться.

Если вы по-прежнему сталкиваетесь с ошибкой, попробуйте третий способ.

Способ 3. Установка загружаемых сред выполнения All-in-One

All in One Runtimes Download предлагает некоторые из известных сред выполнения и надстройки для браузера в одном файле. Вы можете выбрать один из множества пакетов, которые хотите установить.

Шаг 1. Нажмите на ссылку ниже, чтобы перейти на страницу загрузки сред выполнения All-in-One, и нажмите ссылку «Загрузить».

После завершения загрузки откройте установочный файл и следуйте инструкциям для завершения установки.

Перезагрузите компьютер и попробуйте открыть приложение, в котором возникла проблема. Вы больше не должны видеть эту ошибку.

Мне нужно отключить масштабирование DPI в моем приложении Win32. Рекомендуемый способ сделать это программно — через вызов:

Я использую среду Windows mingw. Я проверил, что в заголовках mingw нет вызова, но затем в заголовках mingw отсутствуют несколько новых вызовов. Я уверен, что их обновление требует много работы.

Я создал локальное определение этого:

В лучшей документации, которую я могу найти, говорится, что это находится в user32.dll.

Используется Windows 10, недавно обновленная, сборка: 19042.1052

Спасибо за любую помощь. Скотт Франко, Сан-Хосе, Калифорния

Почти готово. Я сделал:

Я видел в другом месте, что 2 является допустимым значением, но очевидно, что это может быть неправильным. Предложение Саймона получить среду Visual Studio может работать только для того, чтобы получить правильное значение. Извиняюсь перед Саймоном, в данный момент я не могу принять остальную часть вашего предложения. Есть длинный список причин, по которым я не хочу утомлять людей здесь.

Я установил и запустил визуальную студию с образцом кода. Это работает, теперь я пытаюсь выяснить, что такое DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2, это не простое целое число.

В любом случае уже поздно. Я постараюсь найти окончательный ответ завтра.

Рабочий код:

Как вы, наверное, догадались, я собираюсь связать это с опцией пользователя. Теперь мне просто нужно выяснить, как этот новый режим влияет на виджеты и другие функции ОС.

Спасибо за помощь.

Если копия user32.lib вашего компилятора не предоставляет функцию, вы всегда можете использовать GetProcAddress() для доступа к ней непосредственно из user32.dll во время выполнения.

Реми, интересно. Я думаю, прежде чем я это сделаю, я должен вывести список символов для user32.dll и убедиться, что он действительно существует. У меня сложилось впечатление, что gcc/mingw напрямую использует .dll, поэтому вы говорите, что он проходит через файл .lib? Вероятно, отчасти это происходит из-за того, что я никогда не пытался получить доступ к вызову, не входящему в каталог вызовов Windows mingw. Спасибо.

Насколько мне известно, заголовки/библиотека gcc/mingw (часто/всегда) устарели (не основаны на Windows SDK). Я настоятельно рекомендую использовать Microsoft IDE/SDK/компиляторы/отладчики при серьезной работе с Windows.

1 Ответ 1

GetProcAddress работает и является рекомендуемым методом, когда вы не можете быть уверены, что ОС пользователя будет иметь эту функцию.

Если вы хотите разрешить символ во время компоновки, вам необходимо убедиться, что (1) в библиотеке импорта есть символ и (2) что соглашение о вызовах, оформление и изменение имени верны.

Я не очень хорошо знаком с mingw, но мне кажется, что он поставляется с библиотеками импорта для некоторых версий распространенных библиотек DLL Windows. Поскольку это более новая функция, ее может не быть в библиотеке импорта. Существуют инструменты для сканирования существующей библиотеки DLL и создания соответствующей библиотеки импорта, поэтому, возможно, вам потребуется создать новую.

Соглашение о вызовах для Win32: __stdcall . Если ваш компилятор по умолчанию использует другое соглашение о вызовах, вам придется установить его явно в предварительном объявлении функции. Кроме того, если вы компилируете в режиме C++, вам необходимо обернуть предварительное объявление во внешний «C», чтобы предотвратить искажение имени. Если что-то из этого неверно, вы получите от компоновщика диагностическое сообщение "неопределенная ссылка", потому что символ будет "украшен" по-другому.

Читайте также: