{"id":24655155,"url":"https://github.com/xtenzq/screenshotasm","last_synced_at":"2025-03-21T02:16:33.362Z","repository":{"id":115828684,"uuid":"130457222","full_name":"xtenzQ/ScreenshotASM","owner":"xtenzQ","description":"Статья, объясняющая принцип создания скриншотов экрана с использованием FASM на примере кода Томаша Грыштара","archived":false,"fork":false,"pushed_at":"2018-04-26T14:42:46.000Z","size":74,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-25T22:40:05.748Z","etag":null,"topics":["asm","assembler","fasm","screenshot","win-api"],"latest_commit_sha":null,"homepage":"https://flatassembler.net/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xtenzQ.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-04-21T09:02:35.000Z","updated_at":"2018-04-26T14:42:47.000Z","dependencies_parsed_at":null,"dependency_job_id":"ac2ce719-9b3f-43b1-a256-15d11d0b66ef","html_url":"https://github.com/xtenzQ/ScreenshotASM","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xtenzQ%2FScreenshotASM","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xtenzQ%2FScreenshotASM/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xtenzQ%2FScreenshotASM/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xtenzQ%2FScreenshotASM/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xtenzQ","download_url":"https://codeload.github.com/xtenzQ/ScreenshotASM/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244722744,"owners_count":20499154,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asm","assembler","fasm","screenshot","win-api"],"created_at":"2025-01-25T22:36:17.263Z","updated_at":"2025-03-21T02:16:33.356Z","avatar_url":"https://github.com/xtenzQ.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Создание снимков экрана при помощи FASM\n\n## Содержание\n1. [Введение](#Введение)\n2. [Секция импорта](#Секция-импорта)\n3. [Структуры](#Структуры)\n4. [API-функции](#api-функции)\n5. [Ссылки](#Ссылки)\n\n## Введение\nЭта статья основана на коде **Томаша Грыштара** (Tomasz Grysztar) [[Ссылка на исходники](https://flatassembler.net/examples/screenshot.zip)] и написана исключительно в *образовательных целях*. Она объясняет работу ассемблерного кода, который создает снимки экрана в формате JPEG.\n\nОписание структур и API-функции преимущественно является переводом описаний с [MSDN](https://msdn.microsoft.com/).\n\n[Пост на **FlatAssembler.net**](https://board.flatassembler.net/topic.php?t=10427)\n\n## Секция импорта\n\n```ASM\nsection '.rdata' data readable\n\n; импортируемые функции и библиотеки\ndata import\n  library                           \\\n    kernel32,       'KERNEL32.DLL', \\\n    user32,         'USER32.DLL',   \\\n    gdi32,          'GDI32.DLL',    \\\n    gdiplus,        'GDIPLUS.DLL'\n\n  import  gdiplus,                                               \\\n    GdiplusStartup,               'GdiplusStartup',              \\\n    GdiplusShutdown,              'GdiplusShutdown',             \\\n    GdipGetImageEncodersSize,     'GdipGetImageEncodersSize',    \\\n    GdipGetImageEncoders,         'GdipGetImageEncoders',        \\\n    GdipSaveImageToFile,          'GdipSaveImageToFile',         \\\n    GdipDisposeImage,             'GdipDisposeImage',            \\\n    GdipCreateBitmapFromHBITMAP,  'GdipCreateBitmapFromHBITMAP'\n\n  include 'api/kernel32.inc'\n  include 'api/user32.inc'\n  include 'api/gdi32.inc'\nend data\n```\n\n## Структуры\n\nПрограмма представлена двумя структурами:\n- [GdiplusStartupInput](#gdiplusstartupinput)\n- [ImageCodecInfo](#imagecodecinfo)\n\n### GdiplusStartupInput\n[[Описание на MSDN](https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms534067(v=vs.85).aspx)]\n\nСтруктура, содержащая блок аргументов, требуемых для функции GdiplusStartup.\n\nСинтаксис:\n```Cpp\ntypedef struct GdiplusStartupInput {\n  UINT32         GdiplusVersion;\n  DebugEventProc DebugEventCallback;\n  BOOL           SuppressBackgroundThread;\n  BOOL           SuppressExternalCodecs;\n};\n```\n\nОбъявление структуры в FASM:\n```ASM\nstruct GdiplusStartupInput\n  GdiplusVersion           dd ?\n  DebugEventCallback       dd ?\n  SuppressBackgroundThread dd ?\n  SuppressExternalCodecs   dd ?\nends\n```\n\nЧлены структуры представлены в таблице ниже:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nGdiplusVersion | UINT32 | Указывает версию GDI+. Должна быть 1.\nDebugEventCallback | DebugEventProc | Указатель на функцию обратного вызова, которую GDI+ может вызывать. Значение по умолчанию - NULL.\nSuppressBackgroundThread | BOOL | Логическое значение, указывающее, следует ли подавлять фоновый поток GDI+\nSuppressExternalCodecs | BOOL | Логическое значение, указывающее, необходимо ли, чтобы GDI+ подавлял внешние кодеки изображений.\n\nСтруктура **GdiplusStartupInput** предоставляет конструктор, который устаналивает член структуры **GdiplusVersion** в **1** и позволяет указать значения для остальных трех членов. Все параметры конструктора являются необязательными, поэтому можно объявить перменную типа **GdiplusStartupInput** без передачи каких-либо аргументов конструктору, и все члены будут инициализированы соответствующими значениями по умолчанию.\n\n### ImageCodecInfo\n[[Описание на MSDN](https://msdn.microsoft.com/ru-ru/library/system.drawing.imaging.imagecodecinfo(v=vs.110).aspx)]\n\nСтруктура ImageCodecInfo предоставляет информацию об установленных кодеках изображения.\n\nСинтаксис:\n```Cpp\ntypedef struct ImageCodecInfo {\n   CLSID ClassID;\n   GUID FormatID;\n   WCHAR * CodecName;\n   WCHAR * DllName;\n   WCHAR * FormatDescription;\n   WCHAR * FilenameExtension;\n   WCHAR * MimeType;\n   DWORD Flags;\n   DWORD Version;\n   DWORD SigCount;\n   DWORD SigSize;\n   BYTE * SigPattern;\n   BYTE * SigMask;\n};\n```\n\nОбъявление структуры в FASM:\n```ASM\nstruct ImageCodecInfo\n  Clsid             db 16 dup ?\n  FormatID          db 16 dup ?\n  CodecName         dd ?\n  DllName           dd ?\n  FormatDescription dd ?\n  FilenameExtension dd ?\n  MimeType          dd ?\n  Flags             dd ?\n  Version           dd ?\n  SigCount          dd ?\n  SizeSize          dd ?\n  SigPattern        dd ?\n  SigMask           dd ?\nends\n```\nЧлены структуры представлены в таблице ниже:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nClsid | CLSID | Идентификатор кодека\nFormatID | GUID | Идентификатор формата файла\nCodecName | WCHAR | Указатель строку, содержащую имя кодека.\nDllName | WCHAR | Указатель на строку, содержащую имя пути к DLL, в котором находится кодек\nFormatDescription | WCHAR | Указатель на строку, которая содержит имя формата файла, используемого кодеком\nFilenameExtension | WCHAR | Указатель на строку, которая содержит все расширения имен файлов, связанные с кодеком\nMimeType | WCHAR | Указатель на строку, которая содержит тип mime-кодека.\nFlags | DWORD | Комбинация флагов из перечисления ImageCodecFlags\nVersion | DWORD | Целое число, указывающее версию кодека\nSigCount | DWORD | Целое число, которое указывает количество подписей, используемых файловым форматом, связанным с кодеком\nSizeSize | DWORD | Целое число, указывающее количество байтов в каждой подписи\nSigPattern | BYTE | Указатель на массив байтов, содержащий шаблон для каждой подписи\nSigMask | BYTE | Указатель на массив байтов, содержащий маску для каждой подписи\n\n\n## API-функции\n\nAPI-функции, использованные в программе:\n- [GdiplusStartup](#gdiplusstartup)\n- [GdipGetImageEncodersSize](#gdipgetimageencoderssize)\n- [VirtualAlloc](#virtualalloc)\n- [GetImageEncoders](#getimageencoders)\n- [VirtualFree](#virtualfree)\n- [GetDC](#getdc)\n- [GetSystemMetrics](#getsystemmetrics)\n- [CreateCompatibleBitmap](#createcompatiblebitmap)\n- [CreateCompatibleDC](#createcompatibledc)\n- [SelectObject](#selectobject)\n- [BitBlt](#bitblt)\n- [GdipCreateBitmapFromHBITMAP](#gdipcreatebitmapfromhbitmap)\n- [GdipSaveImageToFile](#gdipsaveimagetofile)\n- [GdipDisposeImage](#gdipdisposeimage)\n- [DeleteObject](#deleteobject)\n- [ReleaseDC](#releasedc)\n- [GdiplusShutdown](#gdiplusshutdown)\n- [ExitProcess](#exitprocess)\n\n### GdiPlusStartup\n[[Описание на MSDN](https://msdn.microsoft.com/en-us/library/windows/desktop/ms534077(v=vs.85).aspx)]\n\nФункция **GdiplusStartup** инициализирует Windows GDI+.\n```Cpp\nStatus GdiplusStartup(\n  __out  ULONG_PTR token *token,\n  __in   const GdiplusStartupInput *input,\n  __out  GdiplusStartupOutput *output\n);\n```\n\nАргументы функции GdiplusStartup:\n\nНазвание | Тип | Описание\n-------- | --- | --------\ntoken [out] | ULONG_PTR token* | Указатель на ULONG_PTR, который получает токен\ninput [in] | const | GdiPlusStartupInput* | Указатель на структуру GdiplusStartupInput\noutput [out] | GdiplusStartupOutput* | Указатель на структуру GdiplusStartupOutput\n\nИспользование в коде:\n```ASM\n  invoke  GdiplusStartup, token, input, NULL\n  test    eax, eax\n  jnz     exit\n```\n\n### GdipGetImageEncodersSize\n[[Описание на MSDN](https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms534081(v=vs.85).aspx)]\n\nФункция GdipGetImageEncodersSize получает число доступных кодировщиков изображения и размер массива объектов типа ImageCodecInfo, который возвращает функция GetImageEncoders.\n\nСинтаксис:\n```Cpp\nStatus GetImageEncodersSize(\n  __out  UINT *numEncoders,\n  __out  UINT *size\n);\n```\n\nАргументы функции GdipGetImageEncodersSize:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nnumEncoders [out]\t| UINT*\t| Указатель на UINT, который получает число доступных кодировщиков изображения\nsize [out] | UINT* | Указатель на UINT, который получает размер массива объектов ImageCodecInfo (в байтах), возвращаемых функцией GetImageEncoders\n\nИспользование в коде:\n```ASM\n  invoke  GdipGetImageEncodersSize, encoders_count, encoders_size\n  test    eax, eax\n  jnz     gdiplus_shutdown\n```\n\n### VirtualAlloc\n[[Описание на MSDN](https://msdn.microsoft.com/en-us/library/windows/desktop/aa366887(v=vs.85).aspx)]\n\nС помощью данной функции есть возможность выделить или зарезервировать страницы виртуальной памяти. Между выделением и резервированием есть разница. При выделении физически выделяется память и естественно увеличивается файл подкачки. При резервировании этого не происходит. \n\nСинтаксис:\n```Cpp\nLPVOID WINAPI VirtualAlloc(\n  _In_opt_ LPVOID lpAddress,\n  _In_     SIZE_T dwSize,\n  _In_     DWORD  flAllocationType,\n  _In_     DWORD  flProtect\n);\n```\nАргументы функции VirtualAlloc:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nlpAddress [in, optional] | LPVOID | Базовый адрес\nsize [out] | SIZE_T | Размер области в байтах\nflAllocationType [in] | DWORD | Способ получения\nflProtect [in] | DWORD | Тип доступа\n\nСпособ получения:\n\nНазвание | Описание\n-------- | --------\nMEM_COMMIT | Выполняется выделение страниц памяти для непосредственной работы с ними. Выделенные страницы заполняются нулями.\nMEM_RESERVE | Резервирует страницы памяти\n\nТип доступа:\n\nНазвание | Описание\n-------- | --------\nPAGE_READONLY | Только чтение\nPAGE_READWRITE | Чтение и запись\nPAGE_EXECUTE | Только исполнение программного кода\nPAGE_EXECUTE_READ | Исполнение и чтение\nPAGE_EXECUTE_READWRITE | Исполнение, чтение и запись\nPAGE_GUARD | Сигнализация доступа к странице\nPAGE_NOACCESS | Запрещен любой вид доступа\nPAGE_NOCACHE | Отмена кэширования для страницы памяти\n\nИспользование в коде:\n```ASM\n  invoke  VirtualAlloc, 0, [encoders_size], MEM_COMMIT, PAGE_READWRITE\n  test    eax, eax\n  jz      gdiplus_shutdown\n  mov     ebx, eax\n```\n\n### GetImageEncoders\n[[Описание на MSDN](https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms534080(v=vs.85).aspx)]\n\nФункция GetImageEncoders получает массив объектов типа ImageCodecInfo, которые содержат информацию о доступных кодировщиках изображений.\n\nСинтаксис:\n```Cpp\nStatus GetImageEncoders(\n  __in   UINT numEncoders,\n  __in   UINT size,\n  __out  ImageCodecInfo *encoders\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nnumEncoders [in] | UINT | Целое число, определяющее количество доступных кодировщиков изображений\nsize [in] | UINT | Целое число, которое задает размер в байтах массив объектов типа ImageCodecInfo\nencoders [out] | ImageCodecInfo* | Указатель на буфер, который получает массив объектов типа ImageCodecInfo\n\nИспользование в коде:\n```Cpp\n  invoke  GdipGetImageEncoders, [encoders_count], [encoders_size], ebx\n  test    eax, eax\n  jnz     gdiplus_shutdown\n```\n\n### VirtualFree\n\n[[Описание на MSDN](https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa366892(v=vs.85).aspx)]\n\nФункция VirtualFree освобождает выделенную память. \n\nСинтаксис:\n```Cpp\nBOOL VirtualFree\n(  \n  LPVOID lpAddress,\n  SIZE_T dwSize,\t\n  DWORD dwFreeType\t\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nlpAddress | LPVOID | Базовый адрес\ndwSize | SIZE_T | Размер, если мы будем использовать тип освобождения, как MEM_RELEASE, то размер должен быть установлен в 0.\nencoders [out] | DWORD | Определяет, какая операция произойдет с памятью\n\nТипы операций с памятью:\n\nНазвание | Описание\n-------- | --------\nlpAddress | LPVOID | Базовый адрес\nMEM_RELEASE\t| Высвобождение используемой памяти\nMEM_DECOMMIT\t| Высвобождение зарезервированной памяти\n\nИспользование в коде:\n```ASM\ninvoke  VirtualFree, ebx, 0, MEM_RELEASE\n```\n\n### GetDC\n\n[[Описание на MSDN](https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd144871(v=vs.85).aspx)]\n\nФункция GetDC идентифицирует контекст устройства для CWnd клиентской области если успешно иначе, возвращаемое значение NULL.\n\nСинтаксис:\n```Cpp\nHDC GetDC(\n  _In_ HWND hWnd\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nhWnd | HWND | Дескриптор окна, чей контекст устройства должен быть извлечен\n\nИспользование в коде:\n```ASM\ninvoke  GetDC, HWND_DESKTOP\ntest    eax, eax\njz      gdiplus_shutdown\nmov     esi, eax\n```\n\n### GetSystemMetrics\n\n[[Описание на MSDN](https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms724385(v=vs.85).aspx)]\n\nФункция GetSystemMetrics идентифицирует заданный системный показатель или настройку конфигурации системы.\n\nСинтаксис:\n\n```Cpp\nint WINAPI GetSystemMetrics(\n  _In_ int nIndex\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nnIndex | int | Идентификатор настройки\n\nИспользование в коде:\n```ASM\ninvoke  GetSystemMetrics, SM_CYSCREEN\nmov     [screen_height], eax\ninvoke  GetSystemMetrics,SM_CXSCREEN\nmov     [screen_width], eax\n```\n\n### CreateCompatibleBitmap\n\n[[Описание на MSDN](https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd183488(v=vs.85).aspx)]\n\nФункция CreateCompatibleBitmap создает точечный рисунок, совместимый с контекстом устройства.\n\nСинтаксис:\n\n```Cpp\nHBITMAP CreateCompatibleBitmap(\n  _In_ HDC hdc,\n  _In_ int nWidth,\n  _In_ int nHeight\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nhdc [in] | HDC | Дескриптор контекста устройства\nnWidth [in] | int | Ширина рисунка в пикселях\nnHeight [in] | int | Высота рисунка в пикселях\n\nИспользование в коде:\n```ASM\ninvoke  CreateCompatibleBitmap, esi, [screen_width], [screen_height]\ntest    eax, eax\njz      release_desktop_dc\nmov     ebx, eax\n```\n\n### CreateCompatibleDC\n\n[[Описание на MSDN](https://msdn.microsoft.com/en-us/library/windows/desktop/dd183489(v=vs.85).aspx)]\n\nФункция CreateCompatibleDC создает контекст устройства памяти, который является совместимым с устройством, определенным pDC.\n\nСинтаксис:\n```Cpp\nHDC CreateCompatibleDC(\n  _In_ HDC hdc\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nhdc [in] | HDC | Указатель на контекст устройства\n\nИспользование в коде:\n```ASM\ninvoke  CreateCompatibleDC, esi\ntest    eax, eax\njz      delete_bitmap\nmov     edi, eax\n```\n\n### SelectObject\n\n[[Описание на MSDN](https://msdn.microsoft.com/en-us/library/windows/desktop/dd162957(v=vs.85).aspx)]\n\nФункция SelectObject выбирает объект в указанном контексте устройства. Новый объект заменяет предыдущий объект того же типа.\n\nСинтаксис:\n```Cpp\nHGDIOBJ SelectObject(\n  _In_ HDC     hdc,\n  _In_ HGDIOBJ hgdiobj\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nhdc [in] | HDC | Указатель на контекст устройства\nhgdiobj [in] |\tHGDIOBJ |\tУказатель на объект, который должен быть выбран\n\nИспользование в коде:\n```ASM\ninvoke  SelectObject, edi, ebx\ntest    eax, eax\njz      delete_dc\n```\n\n### BitBlt\n\n[[Описание на MSDN](https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd183370(v=vs.85).aspx)]\n\nФункция BitBlt копирует точечный рисунок от исходного контекста устройства до этого текущего контекста устройства.\n\nСинтаксис:\n\n```Cpp\nBOOL BitBlt(\n  _In_ HDC   hdcDest,\n  _In_ int   nXDest,\n  _In_ int   nYDest,\n  _In_ int   nWidth,\n  _In_ int   nHeight,\n  _In_ HDC   hdcSrc,\n  _In_ int   nXSrc,\n  _In_ int   nYSrc,\n  _In_ DWORD dwRop\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nhdcDest [in]\t| HDC | Указатель на контекст конечного устройства\nnXDest [in]\t| int | Определяет логическую x-координату левого верхнего угла прямоугольника адресата.\nnYDest [in]\t| int | Определяет логическую y-координату левого верхнего угла прямоугольника адресата.\nnWidth [in]\t| int | Определяет ширину (в логических модулях) прямоугольника адресата и исходного точечного рисунка.\nnHeight [in]\t| int | Определяет высоту (в логических модулях) прямоугольника адресата и исходного точечного рисунка.\nhdcSrc [in]\t| HDC | Указатель на объект HDC, который идентифицирует контекст устройства из которого точечный рисунок будет скопирован\nnXSrc [in]\t| int | Определяет логическую x-координату левого верхнего угла исходного точечного рисунка\nnYSrc [in]\t| int | Определяет логическую y-координату левого верхнего угла исходного точечного рисунка\ndwRop [in]\t| DWORD | Определяет растровую операцию, которую нужно выполнить\n\nИспользование в коде:\n```ASM\ninvoke  BitBlt, edi, 0, 0, [screen_width], [screen_height], esi, 0, 0, SRCCOPY\ntest    eax, eax\njz      delete_dc\n```\n\n### GdipCreateBitmapFromHBITMAP\n\n[[Описание на MSDN](https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms533971(v=vs.85).aspx)]\n\nФункция GdipCreateBitmapFromHBITMAP создает точечное изображение на основе дескриптора GDI и дескриптора палитры GDI.\n\nСинтаксис:\n\n```Cpp\nGpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(\n    HBITMAP hbm,\n    HPALETTE hpal,\n    GpBitmap** bitmap\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nhbm [in] | HBITMAP | Дескриптор точечного изображения\nhgdiobj [in] | HPALETTE | Дескриптор палитры GDI\nbitmap [out] | GpBitmap | Указатель на переменную DWORD, которая получает указатель на объект bitmap\n\nИспользование в коде:\n```ASM\ninvoke  GdipCreateBitmapFromHBITMAP, ebx, NULL, gdip_bitmap\ntest    eax, eax\njnz     delete_dc\n```\n\n### GdipSaveImageToFile\n\n[[Описание на MSDN](https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms534041(v=vs.85).aspx)]\n\nФункция GdipSaveImageToFile сохраняет изображение в файл.\n\nСинтаксис:\n\n```Cpp\nGpStatus WINGDIPAPI GdipSaveImageToFile(\n    GpImage *image,\n    GDIPCONST WCHAR* filename,\n    GDIPCONST CLSID* clsidEncoder,\n    GDIPCONST EncoderParameters* encoderParams\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nimage [in] | GpImage | Указатель на изображение\nfilename [in] | GDIPCONST | Указатель на строку unicode, которая указывает имя пути для сохраненного изображения\nclsidEncoder [in] | GDIPCONST | Указатель на CLSID, который указывает кодировщик, который будет использоваться для сохранения изображения\nencoderParams [in] | GDIPCONST | Указатель на структуру EncoderParameters, которая содержит параметры, используемые кодировщиком\n\nИспользование в коде:\n```ASM\ninvoke  GdipSaveImageToFile, [gdip_bitmap], file_name, encoder_clsid, NULL\n```\n\n### GdipDisposeImage\n\n[[Описание на MSDN](https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms534041(v=vs.85).aspx)]\n\nФункция GdipDisposeImage удаляет указанное изображение.\n\nСинтаксис:\n```Cpp\nGpStatus WINGDIPAPI GdipDisposeImage(\n    GpImage *image\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nimage [in] | GpImage | Указатель на изображение\n\nИспользование в коде:\n```ASM\ninvoke  GdipDisposeImage, [gdip_bitmap]\n```\n\n### DeleteObject\n\n[[Описание на MSDN](https://msdn.microsoft.com/en-us/library/windows/desktop/dd183539(v=vs.85).aspx)]\n\nФункция DeleteObject удаляет перо, кисть, шрифт, растровое изображение, область или палитру, освобождая все системные ресурсы, связанные с объектом. После удаления объекта указанный дескриптор более недействителен.\n\nСинтаксис:\n```Cpp\nBOOL DeleteObject(\n  _In_ HGDIOBJ hObject\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nhObject [in] | HGDIOBJ | Дескриптор объекта\n\nИспользование в коде:\n```ASM\ninvoke  DeleteObject, edi\n```\n\n### ReleaseDC\n\n[[Описание на MSDN](https://msdn.microsoft.com/en-us/library/windows/desktop/dd162920(v=vs.85).aspx)]\n\nФункция ReleaseDC освобождает контекст устройства (DC) для его использования другими приложениями.\n\nСинтаксис:\n```Cpp\nint ReleaseDC(\n  _In_ HWND hWnd,\n  _In_ HDC  hDC\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nhWnd [in] | HWND | Дескриптор окна, чей контекст должен быть высвобожден\nhDC [in] | HDC | Дескриптор контекста устройства, который надо высвободить\n\nИспользование в коде:\n```ASM\ninvoke  ReleaseDC, HWND_DESKTOP, esi\n```\n\n### GdiplusShutdown\n\n[[Описание на MSDN](https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms534076(v=vs.85).aspx)]\n\nФункция GdiplusShutdown очищает ресурсы, используемые Windows GDI+. \n\nСинтаксис:\n```Cpp\nvoid GdiplusShutdown(\n  __in  ULONG_PTR token\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\ntoken [in] | ULONG_PTR | Токен, возвращенный предыдущим вызовом GdiplusStartup\n\nИспользование в коде:\n```ASM\ninvoke  GdiplusShutdown, [token]\n```\n\n### ExitProcess\n\n[[Описание на MSDN](https://msdn.microsoft.com/ru-ru/ms682658)]\n\nФункция ExitProcess заканчивает работу процесса и всех его потоков. \n\nСинтаксис:\n```Cpp\nVOID ExitProcess(\n  UINT uExitCode\t\n);\n```\n\nАргументы функции:\n\nНазвание | Тип | Описание\n-------- | --- | --------\nuExitCode [in] | UINT | Определяет код выхода для процесса, и для всех потоков, которые завершают работу в результате вызова этой функци\n\nИспользование в коде:\n```ASM\ninvoke  ExitProcess, 0\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxtenzq%2Fscreenshotasm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxtenzq%2Fscreenshotasm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxtenzq%2Fscreenshotasm/lists"}