что за программа gdi windows
Windows GDI+ — это API на основе классов для программистов C/C++. Она позволяет приложениям использовать графику и форматированный текст как на дисплее, так и на принтере. Приложения на основе API-интерфейса Microsoft Win32 не обращаются к графическому оборудованию напрямую. Вместо этого GDI+ взаимодействует с драйверами устройств от имени приложений. GDI+ также поддерживается Microsoft Win64.
Где применимо
функции и классы GDI+ не поддерживаются для использования в службе Windows. попытка использовать эти функции и классы из службы Windows может привести к непредвиденным проблемам, например к снижению производительности службы и исключениям или ошибкам времени выполнения.
при использовании GDI+ API не следует разрешать приложению скачивать произвольные шрифты из ненадежных источников. Операционная система требует повышенных привилегий, чтобы гарантировать, что все установленные шрифты являются доверенными.
Аудитория разработчиков
Интерфейс на основе классов GDI+ c++ предназначен для использования программистами C/C++. знание Windows графического пользовательского интерфейса и архитектуры, управляемой сообщениями, является обязательным.
Требования к среде выполнения
GDI+ можно использовать во всех приложениях на основе Windows. GDI+ было введено в Windows XP и Windows Server 2003. Сведения о том, какие операционные системы требуются для использования определенного класса или метода, см. в разделе «Дополнительные сведения» документации по классу или методу.
Поиск утечки GDI объектов: Как загнать мастодонта
Строго говоря именно это оригинальный текст статьи, а в блоге уже перевод. Здесь статья публикуется чуть позже и только потому получает бирку перевод.
В 2016 году, когда большинство программ выполняются в песочницах, из которых даже самый некомпетентный разработчик не сможет навредить системе, странно сталкиваться с проблемой, о которой дальше пойдет речь. Если честно, я надеялся, что она ушла в далекое прошлое вместе с Win32Api, но недавно я с ней столкнулся. До этого я лишь слышал жуткие байки старых более опытных разработчиков, что такое может быть.
Проблема
Утечка или использование слишком большого числа GDI объектов.
Симптомы:
Message: A generic error occurred in GDI+.
Source: System.Drawing
TargetSite: IntPtr GetHbitmap(System.Drawing.Color)
Type: System.Runtime.InteropServices.ExternalException
Почему?
В системах семейства Windows может быть одновременно создано не более 65535 объектов GDI. Число, на самом деле, невероятно большое и ни при каком нормальном сценарии и близко не должно достигаться. На процесс установлено ограничение в 10000, которое хоть и можно изменить (в реестре изменить значение HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\GDIProcessHandleQuota в пределах от 256 до 65535), но Microsoft настоятельно не рекомендует увеличивать это ограничение. Если это сделать, то у одного процесса будет возможность положить систему настолько, что та даже не сможет нарисовать сообщение об ошибке. В этом случае система сможет ожить только после перезагрузки.
Как исправлять?
Если Вы живете в аккуратном управляемом CLR’ом мире, то вероятность 9 из 10, что у Вас в приложении обычная утечка памяти. Проблема хоть и неприятная, зато довольно обыденная и есть по меньшей мере дюжина отличных инструментов для ее поиска. Подробно останавливаться на этом не буду. Вам лишь будет нужно использовать любой профилировщик, чтобы посмотреть, не увеличивается ли число объектов-оберток над GDI ресурсами, это: Brush, Bitmap, Pen, Region, Graphics. Если это действительно так, то Вам повезло, можете закрывать вкладку со статьей.
Если не нашлась утечка объектов-оберток, то значит у Вас в коде есть прямое использование функций GDI и сценарий, при котором они не удаляются.
Что Вам будут советовать другие?
Официальное руководство от Microsoft или другие статьи по этому поводу, которые Вы найдете в интернете, будут советовать примерно следующее:
Найти все Create%SOME_GDI_OBJECT% и узнать, есть ли соответствующий ему DeleteObject(или ReleaseDC для HDC-объектов), а если и есть, то, возможно, существует сценарий, при котором он не вызовется.
Есть еще чуть улучшенная версия этого метода, она содержит дополнительный первый шаг:
Скачать утилиту GDIView. Она умеет показывать конкретное количество GDI объектов по типу и единственное, что настораживает, так это то, что сумма всех не соответствует значению в последней колонке. На это можно попробовать не обращать внимание, если она поможет хоть как-то сузить зону поиска.
Проект, над которым я работаю, имеет кодовую базу в более 9 миллионов строк и еще примерно столько же в third-party библиотеках, сотни вызовов функций GDI, размазанных по десяткам файлов. Я потратил много сил и кофе, прежде чем понял, что вручную просто невозможно это проанализировать ничего не упустив.
Что предложу я?
Если этот способ Вам покажется слишком длинным и требующим лишних телодвижений, значит, Вы еще не прошли все стадии отчаяния с предыдущим. Можете еще несколько раз попробовать прошлые шаги, но если не поможет, то не сбрасывайте со счетов этот вариант.
После чего запустил процесс на отладку в Visual Studio, а здесь выбрал его в дереве процессов. Первая точка останова сработала мгновенно:
Вызовов было слишком много. Я быстро понял, что захлебнусь в этом потоке и нужно придумать что-то еще. Я снял точки останова с функций и решил посмотреть лог. Это были тысячи и тысячи вызовов. Стало очевидно, что их не проанализировать вручную.
Задача: Найти те вызовы функций GDI, которым не соответствует удаление. В логи присутствует все необходимое: список вызовов функций в хронологическом порядке, их возвращаемые значения и параметры. Получается, что мне нужно взять возвращаемое значение функции Create%SOME_GDI_OBJECT% и найти вызов DeleteObject с этим значением в качестве аргумента. Я выделил все записи в Api Monitor, вставил в текстовый файл и получил что-то вроде CSV с разделителем TAB. Запустил VS, где думал написать программу, чтобы попарсить это, но, прежде чем она загрузилась, мне пришла в голову идея получше: экспортировать данные в базу и написать запрос, чтобы выгрести то, что меня интересует. Это был правильный выбор, потому что позволил очень быстро задавать вопросы и получать на них ответы.
Есть множество инструментов, чтобы импортировать данные из CSV в базу, потому не буду на этом останавливаться (mysql, mssql, sqlite).
У меня получилась вот такая таблица:
Написал функцию mysql, чтобы получать дескриптор удаляемого объекта из вызова апи:
И наконец запрос, который найдет все текущие объекты:
(Строго говоря, он просто найдет все вызовы Delete на все вызовы Create)
На рисунке сразу видны вызовы, на которые так и не нашлось ни одного Delete.
Остался последний вопрос: Как найти откуда вызываются эти методы в контексте моего кода? И здесь мне помог один хитрый трюк:
Резюме:
Алгоритм длинный и сложный, в нем задействовано много инструментов, но мне он дал результат значительно быстрее, чем тупой поиск ошибок по огромной кодовой базе.
Вот он, для тех кому было лень читать или кто уже забыл с чего все начиналось, пока читал:
GLGDI+ или «переходим с GDI+ на OpenTK»
Почему выбор пал именно на OpenTK? Во-первых, OpenTK предоставляет класс GLControl (является прямым наследником UserControl), который позволяет упростить переход на данную библиотеку. Во-вторых, в комплекте идет класс TextPrinter, который позволяет довольно просто выводить текст на экран. В-третьих во время гугления я нашел небольшой архив «Engine.zip» с набором классов для 2D-отрисовки, инициализации OpenGL и прочими приятностями.
Некоторые моменты
Заключение
Библиотека лежит на GoogleCode, под BSD лицензией. Если кому понадобится — пользуйтесь на здоровье. Чтобы понять как работать с библиотекой — посмотрите исходный текст сэмпла, который идет в комплекте, он очень простой:
Все описанные выше «моменты» в нем учтены.
Данную библиотеку я пока не рекомендовал бы использовать для продуктов, нацеленных на массового пользователя — она слишком молода для этого, но в утилитах вполне пригодна к использованию.
На данный момент планов по развитию библиотеки у меня нет — мне ее функционала хватает. Но багфиксы и патчи приветствуются
Судя по тому, что я прочитал на OpenTK форуме, TextPrinter (используется для вывода текста) в будущем будет исключен из библиотеки, но, возможно, в отдельный проект. Так что его судьба пока что туманна. Сейчас он в состоянии Deprecated, поэтому дает warnings при компиляции библиотеки.
Вот теперь редактор карт работает значительно быстрее и ничего не тормозит, чего и вам желаю!
UPD: забыл указать ссылку на сайт OpenTK
UPD2: исправил баг с путями в исходниках сэмпла (как в архиве, так и в SVN)
Что за программа gdi windows
GDI (Graphics Device Interface, Graphical Device Interface) — один из трёх основных компонентов или «подсистем», вместе с ядром и Windows API, составляющих пользовательский интерфейс (оконный менеджер GDI) Microsoft Windows.
GDI — это интерфейс Windows для представления графических объектов и передачи их на устройства отображения, такие, как мониторы и принтеры.
Содержание
Краткое описание [ ]
Для определения атрибутов текста и изображения, которые выводятся на экран или принтер, используется программный объект под названием « контекст устройства » (Device Context, DC). DC, как и большинство объектов GDI, инкапсулирует подробности реализации и данные в себе и к ним нельзя получить прямой доступ.
Для любого рисования нужен объект HDC (Handle DC). При выводе на принтер HDC получается вызовом CreateDC, и на нём вызываются специальные функции для перехода на новую страницу печатаемого документа. При выводе на экран также можно использовать CreateDC, но это приведет к рисованию поверх всех окон вне их границ, потому обычно для рисования на экране используются вызовы GetDC и BeginPaint, принадлежащие уже не GDI, а USER, и возвращающие контекст, ссылающийся на регион отсечения окна.
Реализация [ ]
В Windows 9x и более ранних реализована в 16-битной GDI.DLL, которая, в свою очередь, подгружает выполненный в виде DLL драйвер видеокарты. Драйвер видеокарты первоначально и был обязан реализовать вообще все рисование, в том числе рисование через битмапы в памяти в формате экрана. Позже появилась DIBENG.DLL, в которой было реализовано рисование на битмапах типичных форматов, драйвер был обязан пропускать в неё все вызовы, кроме тех, для которых он задействовал аппаратный ускоритель видеокарты.
Драйвер принтера подгружался таким же образом и имел тот же интерфейс «сверху», но «снизу» он вместо рисования в памяти/на аппаратуре генерировал последовательности команд принтера и отсылал их в объект Job. Эти команды, как правило, были либо двоичные и не читаемые человеком, либо PostScript.
В Windows NT GDI была полностью переписана с нуля заново, причем на Си++ (по слухам, у Microsoft тогда не было компилятора этого языка и они использовали cfront). API для приложений не изменился (кроме добавления кривых Безье), для драйверов — обертки на языке Си вокруг реализованных на Си++ внутренностей (вроде BRUSHOBJ_pvGetRbrush).
Сама GDI была размещена сначала в WINSRV.DLL в процессе CSRSS.EXE, начиная с NT4 — в win32k.sys. Драйверы загружались туда же. DIBENG.DLL была переписана заново и перенесена туда же, как совокупность вызовов EngXxx — EngTextOut и другие. Логика взаимодействия драйвера-GDI-DIBENG осталась примерно та же.
GDI32.DLL в режиме пользователя реализована как набор специальных системных вызовов, ведущих в win32k.sys (до NT4 — как обертки вокруг вызова CsrClientCallServer, посылавшего сообщение в CSRSS.EXE).
Сам же WDDM-драйвер поддерживает только DirectDraw и Direct3D и не имеет отношения ни к GDI, ни к win32k.sys, сопрягаясь с модулем dxgkrnl.sys в ядре.
Критика [ ]
Однако тут речь скорее о компонентах, лежащих ниже GDI.
Однако CUPS имеет серьёзные проблемы с поддержкой WinPrinterов вроде всех дешевых лазерных принтеров Hewlett-Packard. Так как они не поддерживают распространенный формат PCL, для них надо ставить огромные, сложные в настройках и построении пакеты, такие, как HP OfficeJet (порт «hpoj» во FreeBSD). При этом CUPS прекрасно поддерживает струйные принтеры, дорогие модели лазерных принтеров Hewlett-Packard и принтеры PostScript.
Примерные аналоги [ ]
Динамические библиотеки GDI+ могут распространяться вместе с приложениями для использования в предыдущих версиях Windows.
Уязвимости [ ]
Примечания [ ]
Ссылки [ ]
Контакты • DVD Maker • Факсы и сканирование • Internet Explorer • Журнал • Экранная лупа • Media Center • Проигрыватель Windows Media • Программа совместной работы • Центр устройств Windows Mobile • Центр мобильности • Экранный диктор • Paint • Редактор личных символов • Удалённый помощник • Распознавание речи • WordPad • Блокнот • Боковая панель • Звукозапись • Календарь • Калькулятор • Ножницы • Почта • Таблица символов • Исторические: Movie Maker • NetMeeting • Outlook Express • Диспетчер программ • Диспетчер файлов • Фотоальбом • Windows To Go
Ntoskrnl.exe • Слой аппаратных абстракций (hal.dll) • Бездействие системы • svchost.exe • Реестр • Службы • Диспетчер управления сервисами • DLL ( формат модулей ) • PE • NTLDR • Диспетчер загрузки • Программа входа в систему (winlogon.exe) • Консоль восстановления • Windows RE • Windows PE • Защита ядра от изменений
Autorun.inf • Фоновая интеллектуальная служба передачи • Файловая система стандартного журналирования • Отчёты об ошибках • Планировщик классов мультимедиа • Теневая копия • Планировщик задач • Беспроводная настройка
Active Directory • Службы развёртывания • Служба репликации файлов • DNS • Домены • Перенаправление папок • Hyper-V • IIS • Media Services • MSMQ • Защита доступа к сети (NAP) • Службы печати для UNIX • Удалённое разностное сжатие • Службы удаленной установки • Служба управления правами • Перемещаемые профили пользователей • SharePoint • Диспетчер системных ресурсов • Удаленный рабочий стол • WSUS • Групповая политика • Координатор распределённых транзакций
NT • Диспетчер объектов • Пакеты запроса ввода/вывода • Диспетчер транзакций ядра • Диспетчер логических дисков • Диспетчер учетных записей безопасности • Защита ресурсов • lsass.exe • csrss.exe • smss.exe • spoolsv.exe • Запуск
BitLocker • Защитник • Предотвращение выполнения данных • Обязательный контроль целостности • Защищённый канал данных • UAC • UIPI • Брандмауэр • Центр обеспечения безопасности • Защита файлов
Взаимодействия между GDI и GDI+
Иногда желательно смешивать интерфейс Windows графических устройств (GDI) и GDI+ в одном кодовом пути. В этой статье данная статья содержит советы по написанию кода, который позволяет GDI и GDI+ работать вместе.
Оригинальная версия продукта: Windows Интерфейс графического устройства
Исходный номер КБ: 311221
Сводка
Некоторые правила применяются при смешивании GDI и GDI+ кода. Например, не следует вовлекать вызовы GDI и GDI+ одного целевого объекта. Можно обернуть объект Graphics вокруг HDC, но вы не должны получать доступ к HDC непосредственно из GDI до тех пор, пока объект Graphics не будет уничтожен.
Четыре основных сценария взаимодействия между GDI и GDI+ в этой статье:
Использование GDI на объекте GDI+ Graphics, при помощи экрана
Одним из примеров необходимости использования GDI на объекте GDI+ Graphics, опираемом на экран, является нарисовка резинки или прямоугольника фокуса. GDI+ в настоящее время не имеет прямой поддержки raster operations (ROP), поэтому GDI необходимо использовать непосредственно, R2_XOR необходимые операции пера. В этом случае вы можете получить HDC, на который будет направлен Graphics::GetHDC() вывод GDI. GDI+ не следует пытаться использовать объект Graphics для жизни HDC (т. е. пока Graphics::ReleaseHDC() не называется).
Использование GDI на объекте GDI+ Graphics с помощью bitmap
Когда вызван объект Graphics, который имеет не экран, а битовую карту, создается HDC памяти и создается и выбирается новый объект в Graphics::GetHDC() HBITMAP HDC памяти. Эта новая битовая карта памяти не инициализирована с изображением исходной битма, а скорее с шаблоном sentinel, который позволяет GDI+ отслеживать изменения в bitmap. Любые изменения, внесенные в битовую карту памяти с помощью кода GDI, становятся очевидными в изменениях в шаблоне sentinel. Когда Graphics::ReleaseHDC() называется, эти изменения копируется обратно в исходную bitmap. Так как битовая карта памяти не инициализирована с изображением bitmap, получаемый таким образом HDC должен считаться только пишите и поэтому не подходит для использования с roPs, использование которого требует возможности чтения цели, например R2_XOR. Кроме того, для этого подхода существует затрата на производительность, так как GDI+ необходимо скопировать изменения обратно в исходную bitmap.
Использование GDI+ на GDI HDC
Вы можете упростить использование GDI+ hdC с помощью конструктора Graphics, который принимает HDC в качестве параметра. Участники рисования класса Graphics можно использовать для рисования на HDC таким образом. После прикрепления объекта Graphics к HDC операции GDI не должны выполняться в HDC до тех пор, пока объект Graphics не будет уничтожен или не выходит из сферы действия. Если для hdC требуется вывод GDI, либо уничтожайте объект Graphics перед использованием исходного HDC, либо используйте для получения нового HDC, а затем следуйте правилам, описанным ранее в этой статье, для обеспечения связи при использовании GDI на объекте Graphics::GetHDC() GDI+.
Использование GDI+ на HBITMAP памяти GDI
Конструктор GDI+ Bitmap, который принимает параметр в качестве параметра, не использует фактический источник в качестве заднего изображения HBITMAP HBITMAP для bitmap. Скорее, копия изображения выполнена в конструкторе, и изменения не пишутся обратно в исходную битовую карту даже во время выполнения деструктора. Новую битовую карту можно использовать как копию при создании, поэтому для получения GDI+ нарисовать память из GDI и применить изменения к подходу, как следует из следующих HBITMAP HBITMAP действий:
Что такое GDI.EXE? Это безопасно или вирус? Как удалить или исправить это
GDI.EXE это исполняемый файл, который является частью Microsoft Windows, разработанный Корпорация Microsoft, Версия программного обеспечения для Windows: 3.10.0.103 обычно 220800 в байтах, но у вас может отличаться версия.
Расширение .exe имени файла отображает исполняемый файл. В некоторых случаях исполняемые файлы могут повредить ваш компьютер. Пожалуйста, прочитайте следующее, чтобы решить для себя, является ли GDI.EXE Файл на вашем компьютере — это вирус или вредоносная программа, которую вы должны удалить, или, если это действительно допустимый файл операционной системы Windows или надежное приложение.
GDI.EXE безопасен, или это вирус или вредоносная программа?
Первое, что поможет вам определить, является ли тот или иной файл законным процессом Windows или вирусом, это местоположение самого исполняемого файла. Например, для GDI.EXE его путь будет примерно таким: C: \ Program Files \ Microsoft Corporation \ Microsoft Windows \ GDI.EXE
Чтобы определить его путь, откройте диспетчер задач, перейдите в «Просмотр» -> «Выбрать столбцы» и выберите «Имя пути к изображению», чтобы добавить столбец местоположения в диспетчер задач. Если вы обнаружите здесь подозрительный каталог, возможно, стоит дополнительно изучить этот процесс.
Еще один инструмент, который иногда может помочь вам обнаружить плохие процессы, — это Microsoft Process Explorer. Запустите программу (не требует установки) и активируйте «Проверить легенды» в разделе «Параметры». Теперь перейдите в View -> Select Columns и добавьте «Verified Signer» в качестве одного из столбцов.
Если статус процесса «Проверенная подписывающая сторона» указан как «Невозможно проверить», вам следует взглянуть на процесс. Не все хорошие процессы Windows имеют метку проверенной подписи, но ни один из плохих.
- Имя: GDI.EXE
- Программного обеспечения: Microsoft Windows,
- Издатель: Корпорация Microsoft
- Ожидаемое местоположение: C: \ Program Files \ Microsoft Corporation \ Microsoft Windows \ подпапке
- Ожидаемый полный путь: C: \ Program Files \ Microsoft Corporation \ Microsoft Windows \ GDI.EXE
- SHA1: 0224F77B717590126A353911425161AFDADFF0A5
- SHA256:
- MD5: 1A9DF6CFA3F61EC4B0B0DF3C5F265DD2
- Известно, что до 220800 размер байт в большинстве Windows;
Если у вас возникли какие-либо трудности с этим исполняемым файлом, вы должны определить, заслуживает ли он доверия, прежде чем удалять GDI.EXE. Для этого найдите этот процесс в диспетчере задач.
Найти его местоположение и сравнить размер и т. Д. С приведенными выше фактами
Если вы подозреваете, что можете быть заражены вирусом, вы должны немедленно попытаться это исправить. Чтобы удалить вирус GDI.EXE, необходимо скачайте и установите приложение полной безопасности, как это, Обратите внимание, что не все инструменты могут обнаружить все типы вредоносных программ, поэтому вам может потребоваться попробовать несколько вариантов, прежде чем вы добьетесь успеха.
Кроме того, функциональность вируса может сама влиять на удаление GDI.EXE. В этом случае вы должны включить Безопасный режим с загрузкой сетевых драйверов — безопасная среда, которая отключает большинство процессов и загружает только самые необходимые службы и драйверы. Когда вы можете запустить программу безопасности и полный анализ системы.
Могу ли я удалить или удалить GDI.EXE?
Не следует удалять безопасный исполняемый файл без уважительной причины, так как это может повлиять на производительность любых связанных программ, использующих этот файл. Не забывайте регулярно обновлять программное обеспечение и программы, чтобы избежать будущих проблем, вызванных поврежденными файлами. Что касается проблем с функциональностью программного обеспечения, проверяйте обновления драйверов и программного обеспечения чаще, чтобы избежать или вообще не возникало таких проблем.