Исправлено: 10 августа 2017
Версия документа: 1.0
Когда ты вызываешь функцию Windows, она проверяет переданные ей параметры, а затем пытается выполнить свою работу. Если ты передал недопустимый параметр или если данную операцию нельзя выполнить по какой‐то другой причине, она возвращает значение, свидетельствующее об ошибке.
Типы данных для возвращаемых значений
Большинство функций Windows возвращают следующие типы:
Подпрограммы‐процедуры Sub не возвращают значений. Такие функции всегда (или почти всегда) выполняется успешно, хотя их количество в Windows очень мало. Пример: функция ExitProcess.
BOOL или Boolean:
Если вызов функции оканчивается неудачей, то возвращается ложь False (она же 0), в остальных случаях возвращается любое другое число, отличное от нуля. Однако не пытайся сравнить это число с True, лучше просто сравнивать с нулём.
Если вызов функции оканчивается неудачей, то обычно возвращается NULL, что эквивалентно нулю, в остальных случаях возвращаемое значение идентифицирует объект, которым ты можешь манипулировать. Однако некоторые функции вместо NULL в случае ошибки возвращают константу INVALID_HANDLE_VALUE, например, функция CreateFile. В документации для каждой функции чётко указано, что именно она возвращает при ошибке: NULL или INVALID_HANDLE_VALUE.
PVOID или Any Ptr:
Если вызов функции оканчивается неудачей, то возвращается NULL, в остальных случаях PVOID сообщает адрес блока данных в памяти.
Integer, Long или DWORD:
Это значение — «крепкий орешек». Функции, которые возвращают значения каких‐либо счётчиков, обычно возвращают Integer, Long или DWORD. Если по какой‐либо причине функция не сумела сосчитать то, что ты хотел, она обычно возвращает 0 или -1, всё зависит от конкретной функции. Лучше всего проверь в документации, каким именно значением функция уведомляет об ошибке.
Почему же произошла ошибка?
При возникновении ошибки необходимо разобраться почему вызов данной функции оказался неудачен. За каждой ошибкой закреплён свой код — 32‐битное целое число.
Функция Windows, обнаружив ошибку, через механизм локальной памяти потока сопоставляет соответствующий код ошибки с вызывающим потоком. Это позволяет потокам работать независимо друг от друга, не вмешиваясь в чужие ошибки. Когда функция вернёт управление, её возвращаемое значение будет указывать на то, что произошла какая‐то ошибка. Какая именно — можно узнать, вызвав функцию GetLastError.
Declare Function GetLastError()As DWORD
Она просто возвращает числовое значение, характеризующее код ошибки.
Список кодов ошибок лежит в заголовочной файле winwinerror.bi. Здесь приведена его небольшая часть, чтобы примерно представлять, на что он похож:
Const ERROR_SUCCESS = 0
Const NO_ERROR = 0
Const ERROR_INVALID_FUNCTION = 1
Const ERROR_FILE_NOT_FOUND = 2
Const ERROR_PATH_NOT_FOUND = 3
Const ERROR_TOO_MANY_OPEN_FILES = 4
Const ERROR_ACCESS_DENIED = 5
Const ERROR_INVALID_HANDLE = 6
Функцию GetLastError необходимо вызывать сразу же после неудачного вызова функции Windows, иначе код ошибки может быть потерян.
Некоторые функции Windows всегда завершаются успешно, но по разным причинам. Например, попытка создать объект ядра «событие» с определённым именем может быть успешна потому, что оно действительно создано, либо потому, что такой объект уже существует. Но иногда нужно знать причину успеха. Для возврата этой информации корпорация Microsoft предпочла использовать механизм установки кода последней ошибки. Так что и при успешном выполнении некоторых функций ты можешь использовать GetLastError и получать дополнительную информацию. К таким функциям относится, например, CreateEvent.
Ты наверняка спросишь, составит ли корпорация Microsoft полный список всех кодов ошибок, возможных в каждой функции. Ответ: нет. Такого списка никогда не будет, уж слишком сложно его составлять и поддерживать для всё новых и новых версий системы.
Проблема с подобным списком ещё и в том, что ты вызываешь одну функцию, а она может обратиться к другой, та — к следующей и так далее. Любая из этих функций может завершиться неудачно и по самым разным причинам. Иногда функция более высокого уровня сама справляется с ошибкой в одной из вызванных ею функций, и в конечном счёте выполняет то, что от неё хотели. В общем, для создания такого списка пришлось бы проследить цепочки вызовов в каждой функции, что очень трудно. А с появлением новой версии операционной системы цепочки вызовов пришлось бы пересматривать заново.
Определение собственных кодов ошибок
Механизм установки кода ошибки можно использовать и в собственных функциях. Предположим, ты пишешь библиотечную функцию, к которой будут обращаться другие части программы или вообще другие программы. Вызов этой функции по каким‐либо причинам может оказаться неудачным и тебе придётся тоже сообщать об этом. С этой целью ты просто устанавливаешь код последней ошибки в потоке и возвращаешь значение False, INVALID_HANDLE_VALUE, NULL или что‐то другое, более подходящее в твоём случае.
Чтобы установить код последней ошибки вызывай функцию SetLastError и передай ей нужной число.
Declare Sub SetLastError( _
ByVal dwErrorCode As DWORD _
)
Можно использовать коды ошибок, уже определённые в winerror.bi, если они подходят. Если ты считаешь, что ни один из кодов ошибок из winerror.bi не годится для ошибки, возможной в твоей функции, можно определить свой код.
Формат кода ошибки
Код ошибки представляет 32‐битное беззнаковое число, которое разбито на поля:
Биты 30 и 31:
Представляют собой степень тяжести ошибки. В двоичном виде: 00 — успех, 01 — информация, 10 — предупреждение, 11 — ошибка.
Корпорация Microsoft обещала, что никогда не будет его устанавливать. Следовательно, если ты определяешь собственный код ошибки, то установи этот бит в 1 для гарантии, что твой код ошибки не будет конфликтовать с кодами, определёнными Microsoft.
Биты с 16 по 27:
Код подсистемы (facility code). Определяется корпорацией Microsoft. Указывает на компонент операционной системы, вызвавший ошибку.
Биты с 0 по 15:
Код ошибки. Определяется корпорацией Microsoft или пользователем.
Подробнее об этих полях будет рассказано в следующих статьях. На данный момент единственное важное для тебя поле — это бит 29. Чтобы гарантировать непересекаемость кодов ошибок от Microsoft, установи его в 1. В переводе на числа это означает, что твой код ошибки должен быть больше, чем &h20000000 или 536870912 в десятичном виде.
Получение описания ошибки
Для получения текстового описания ошибки подойдёт функция FormatMessage. Использовать её можно так:
Устраняем проблемы с ЭЦП ФСЗН
В связи с прекращением работы старой версии портала ФСЗН с 1.10.2019 года информация в данной статье уже не актуальна, хотя приведенные в ней советы по-прежнему могут оказаться полезными. В блоге есть свежая статья с советами по работе с новой версией портала.
Для формирования ЭЦП используются удостоверяющие сертификаты, соответствующие им криптографические ключи, сохраненные на специальных носителях, а также криптографическое программное обеспечение (ПО). Ранее выдачей сертификатов и ключей занимался сам фонд, причем ключи предоставлялись пользователям бесплатно. С 1 апреля 2017 года ФСЗН перестал выдавать собственные сертификаты и ключи для ЭЦП. Все новые ключи выдаются учреждением ГосСУОК и только на платной основе. Ключи от ГосСУОК универсальные, с их помощью можно подписывать документы и авторизоваться в программах и на порталах МНС, ФСЗН, ЭСЧФ, Госкомстата, Белгосстраха и т.д. Но пока еще в организациях страны используется значительное количество сертификатов и ключей, выданных ранее Фондом соцзащиты. Их можно использовать до окончания срока действия сертификата. Ключи от ФСЗН хранились на обычных флешках, ключи от ГосСУОК хранятся на специальном носителе, который только внешне напоминает флешку.
Для использования ЭЦП необходимо установить на компьютер специальное ПО: программу работы с ЭЦП ПСКЗИ АСУ ПУ в случае использования старых ключей, выданных ФСЗН, или автоматизированное рабочее место плательщика ИОК КАИС Фонда при работе с новыми ключами ГосСУОК. При установке данного ПО из инсталляционных пакетов, скачиваемых с сайта ФСЗН (ссылки будут приведены ниже), на компьютер также устанавливается криптопровайдер «Авест» (Avest).
Проблемы с ЭЦП чаще всего встречаются на тех компьютерах, где помимо ПО для работы с ЭЦП Фонда соцзащиты населения установлены другие программы, также использующие ЭЦП. На сегодняшний день цифровые подписи требуются для работы с банками, электронными счетами-фактурами, для предоставления отчетности в МНС, Госкомстат и другие организации. Однако каждая из организаций может использовать различные версии криптографического ПО, а их совместное использование часто приводит к нарушению работы ЭЦП.
Итак, если вы не можете подписать пачку документов, получаете сообщение об ошибке при входе в программу или в момент подписи, не видите свой криптографический ключ и т.п., то причин обычно не так уж много:
В первых двух случаях ошибки обычно проявляются уже при входе в программу или в момент подписи документа. Например, пользователь получает сообщения «Ошибка AvFundCrypt», «Ошибка AvCryptMail», «Ошибка при вызове функции Win32 API». В таких случаях поможет правильная установка нужных версий программного обеспечения. Выполняем следующие шаги (рассматриваем пример для старых ключей ФСЗН):
Такая последовательность действий обычно позволяет исправить проблемы с использованием ЭЦП Фонда и не нарушает работы остальных установленных программ, использующих ЭЦП. Впрочем, со стопроцентной уверенностью это утверждать нельзя: в используемых программах много недоработок. Пути устранения некоторых из них рассматривались в материалах, ссылки на которые расположены в начале данной статьи.
Если программа запускается, но ругается на отсутствующий сертификат или СОС, то нужно просто в самой программе импортировать скачанные с сайта сертификаты. Если по какой-то причине сертификат вашей организации не был установлен ранее, то, конечно же, его тоже надо установить. Ничего страшного не произойдет, если попытаться импортировать уже установленные сертификаты: вы получите уведомление о том, что сертификат уже присутствует в системе. Чаще всего приходится обновлять только СОС областного (городского) удостоверяющего центра: прочие сертификаты и СОС имеют продолжительный срок действия.
И напоследок, хоть и обещал не писать о проблемах с государственными порталами, напомню о часто встречающейся невозможности подключения или авторизации на портале ФСЗН при работающем антивирусе. В таком случае приходится отключать антивирус до входа на портал. Также можно отключить в настройках антивируса проверку протокола HTTPS (обычно в настройках модуля, отвечающего за проверку веб-страниц).
3 простых шага по исправлению ошибок AVCRYPT. DLL
3- Настройка Windows для исправления критических ошибок avcrypt. dll
Всего голосов ( 181 ), 115 говорят, что не будут удалять, а 66 говорят, что удалят его с компьютера.
Как вы поступите с файлом avcrypt. dll?
(avcrypt.dll) столкнулся с проблемой и должен быть закрыт. Просим прощения за неудобство.
(avcrypt.dll) перестал работать.
avcrypt.dll. Эта программа не отвечает.
(avcrypt.dll) — Ошибка приложения: the instruction at 0xXXXXXX referenced memory error, the memory could not be read. Нажмитие OK, чтобы завершить программу.
(avcrypt.dll) не является ошибкой действительного windows-приложения.
(avcrypt.dll) отсутствует или не обнаружен.
Проверьте процессы, запущенные на вашем ПК, используя базу данных онлайн-безопасности. Можно использовать любой тип сканирования для проверки вашего ПК на вирусы, трояны, шпионские и другие вредоносные программы.
Процессов
Cookies help us deliver our services. By using our services, you agree to our use of cookies.
Как исправить ошибки DLL файлов в Windows
Ниже мы рассмотрим проблемы с работой DDL файлов в самых популярных версиях операционной системы Windows, разберем почему возникают проблемы с DLL, а также предоставим способы их устранения.
Динамические исполняемые библиотеки (DLL) представляют собой специальные программные компоненты, которые позволяют обращаться к одному файлу сразу нескольким приложениям. Основным предназначением таких библиотек является расширение возможностей утилит и экономия места, поскольку для использования аналогичных компонентов можно иметь всего одну версию файла, которая будет делиться между всеми программами.
Почему возникают ошибки с DLL?
Ошибки DLL могут возникать по самым различным причинам. Чаще всего они проявляют себя при запуске каких-либо приложений и программ. Нередки случаи, когда ошибки с DLL происходят во время запуска недавно вышедших компьютерных игр или программ.
Из-за ошибок DLL приложение может не корректно работать или вовсе не загружаться, поэтому следует ознакомиться с возможными причинами появления ошибок.
Одной из основных причин возникновения ошибок DLL является простое отсутствие библиотек, которые требуются для работы приложений. Недостающие файлы могут быть удалены самим пользователем, уничтожены вирусами или перезаписанными более старыми версиями в процессе установки программных компонентов. Помимо этого, ошибки могут возникать из-за неправильной работы драйверов, недостающего программного обеспечения, такого как NET Framework, DirectX и т.д.
Ошибки DLL могут быть вызваны и более серьезными проблемами, связанными с жестким диском.
Решение проблем с DDL файлами
DLL библиотеки тесно вплетены в различные системные процессы, поэтому при повреждении некоторых из них операционная система может попросту перестать запускаться. Если это произошло, следует прибегнуть к встроенным средствам восстановления системы. Чтобы попасть в среду восстановления, достаточно вставить загрузочную флешку или диск с Windows либо автоматически попасть в среду после трех неудачных попыток загрузки.
Для быстрого возврата работоспособности системы пользователь может выбрать один из трех пунктов восстановления, представленных в левой части окна среды восстановления.
Если проблема кроется в некорректной работе загрузчика, рекомендуем ознакомиться со способами решения этой проблемы в статье «Как восстановить загрузчик Windows 10».
Недостающие компоненты C++ Runtime Library и DirectX
Чаще всего пользователи сталкиваются с проблемой ошибок DLL, которые связаны с отсутствием необходимых компонентов C++ Runtime Library либо DirectX.
Существует два способа решения проблем с недостающими компонентами DLL. Первый и более правильный – полная переустановка сбойного ПО. Второй – скачивание непосредственно одного компонента, вызывающего ошибку.
Ошибка msvcr100.dll – сбойный компонент в системе безопасности.
Ошибки dxgi.*, d3dx9_25.*, d3d11.*, d3dx9.*, d3dx9_43.*, xinput1_3.*, d3dx9_31.*, xinput1_2.*, d3dx9_31.*, d3dx9_34.*, d3dx9_42.*, x3daudio1_7.*, x3daudio1_6.*, xrsound.* d3dx10_43.*, d3dx9_26.*, d3dx9_30.*, d3dx9_27.*, d3dx11_43.*, d3dcompiler_43.*, d3d10.*.
Ошибка steam_api.dll – распространённая ошибка среди геймеров и пользователей магазина цифровой дистрибуции Steam. Часто возникает при установке пиратских сборок игр и взломанных клиентов Steam.
Решение – удаление Steam через панель управления и чистая переустановка программы-магазина с официального сайта. https://store.steampowered.com/about/
Важно: мы настоятельно не рекомендуем скачивать отдельные недостающие файлы steam_api.dll, которые можно часто встретить на просторах интернета. Это обусловлено тем, что многие злоумышленники специально распространяют зараженные файлы или шпионские утилиты под видом dll-файлов. Если такой файл попадет на компьютер пользователя, существует большая вероятность утери доступа к аккаунту.
Ошибка uplay_r1_loader.*, Uplay.exe, uplay.*, ubiorbitapi_r2_loader.* — аналогичная ошибка, как и с со Steam.
Решение – удаление и переустановка цифрового магазина https://uplay.ubisoft.com/en-GB
Ошибка xlive – проблемы с файлами цифрового магазина Microsoft.
Ошибка msvcrt.*, msvcr71.*, msvcrt.*, msvcp120.*, msvcp110.* x64 msvcr90.*, msvcr110.*, msvcr100.*, msvcr80.*, msvcr120.*.
Ошибка physxcudart_20.*, physxloader.* и т.д.- проблемы с файлами NVIDIA PHYSX SYSTEM.
Удаление сбойного приложения
В некоторых случаях установка компонентов может не помочь, поскольку проблема кроется в сбойной программе, использующей DLL библиотеки.
Чтобы определить сбойное приложение, необходимо:
Шаг 1. Нажимаем левой кнопкой мыши по иконке «Поиск» (изображение лупы возле кнопки «Пуск») и вводим в строку фразу «Панель управления», после чего переходим в непосредственно сам пункт «Панель управления».
Шаг 2. В открывшемся окне выбираем режим отображения «Категория» и переходим в «Удаление программы».
Шаг 3. В списке установленных программ выбираем метод сортировки по дате и находим приложение, после которого начались проблемы с файлами DLL. Это может быть компьютерная игра, устаревшая версия какой-либо программы или любое другое приложение. Для удаления программы достаточно дважды кликнуть левой кнопкой мыши по её имени и провести деинсталляцию.
Обновление драйверов устройства
Нередки случаи, когда ошибки DLL библиотек возникали из-за устаревшей версии драйверов жестких дисков и другого оборудования. Чтобы исключить эти неисправности следует провести обновление драйверов видеокарты и оборудования. Как правило, это можно сделать на официальных сайтах производителей компонентов.
Помимо этого, рекомендуем проверить драйвера носителей следующим образом:
Шаг 1. Находясь в панели управления выбираем пункт «Оборудование и звук».
Шаг 2. В открывшемся окне переходим в пункт «Диспетчер устройств».
Шаг 3. Переходим во вкладку «Дисковые устройства», выбираем нужный носитель и нажимаем по нему ПКМ, после чего в меню будет доступен пункт «Обновить драйвер».
Другие проблемы с DLL библиотеками
Нередко DLL библиотеки используются вирусами или сами файлы вредоносного ПО маскируются под компоненты DLL. В таком случае следует провести глубокую проверку системы при помощи надёжных антивирусных программ. Стоит понимать, что самые новые вирусы могут не находиться даже передовым программным обеспечением, поэтому при сильном поражении системы рекомендовано провести чистую установку либо выполнить откат системы до предыдущего состояния.
Чтобы сделать это из работающей системы, необходимо:
Шаг 1. Нажать ПКМ по кнопке «Пуск» и выбрать пункт «Выполнить». В открывшемся окне вводим команду «rstrui.exe» и нажимаем «Ок».
Шаг 2. В следующем окне следует выбрать точку восстановления. Если проблема появилась после обновлением Windows, не следует выбирать последнюю точку восстановления — восстановите систему из той точки, где ошибки еще не было.
Что делать, если важный файл или DLL библиотека были случайно удалены?
Библиотеки DLL, как и любые другие данные, могут пострадать по многим причинам: повреждение вирусами, случайное удаление сочетанием клавиш Shift+Delete, форматирование или изменение файловой системы и логической структуры диска и т.д.
В таких случаях незаменимым помощником станет специальная утилита для восстановления данных RS Partition Recovery.
Функционал программы позволяет производить быстрое восстановление удаленных файлов с жестких дисков, карт памяти, флеш-накопителей и других носителей любых типов. Для работы RS Partition Recovery используется два метода анализа диска: полный – для поиска всех возможных для восстановления данных, и быстрый – поверхностный анализ носителя для поиска информации, которая была удалена недавно. Это позволяет выбирать и использовать наиболее эффективный метод, способный вернуть DDL библиотеки, изображения, медиафайлы, компоненты программ и другую информацию независимо от расширения.
Быстрое исправление ошибок «Не найден Avcrypt. dll»
Как правило, ошибки AvCrypt, связанные с DLL, возникают в результате повреждения или отсутствия файла avcrypt.dll. Как правило, решить проблему можно заменой файла DLL. В качестве дополнительного шага по устранению неполадок мы настоятельно рекомендуем очистить все пути к неверным файлам и ссылки на расширения файлов DLL, которые могут способствовать возникновению такого рода ошибок, связанных с avcrypt.dll.
Типы Системные файлы, которые используют DLL, также известны в качестве формата Dynamic Link Library. Если вам нужно заменить файл avcrypt.dll, вы можете найти версию %%os%% в нашей базе данных, перечисленной в таблице ниже. Если в настоящее время необходимая вам версия avcrypt.dll недоступна для загрузки, вы можете запросить её копию, нажав на кнопку Request (Запрос) ниже. Кроме того, Avest также может предоставить вам некоторые редкие файлы, которые отсутствуют в нашем каталоге.
Правильное расположение файла avcrypt.dll является решающим фактором в успешном устранении ошибок подобного рода. Однако, не будет лишним выполнить быструю проверку. Чтобы убедиться в том, что удалось решить проблему, попробуйте запустить AvCrypt, и посмотреть выведется ли ошибка.
Идентификатор статьи: 1006550
Выберите версию ОС
Выберите программное обеспечение
Программа работы с ЭЦП ПСКЗИ АСУ ПУ
Всем доброе утро. Может кто подскажет при подписании в фонде ПУ-2-выдает ошибку, может кто подскажет в чем проблема а то инспектор не знает. Спасибо. Ошибка при выработке подписи для пачки документов.
Обратитесь к документации АРМ плательщика для выяснения причины ошибки и уточнений способа её исправления.
Детали выполнения операции:
Операция: Выработка ЭЦП для пачки документов
Дата и время выполнения: 27.07.2016 9:26:13
Контрольная сумма входного файла: 1D896317450DB9787D2A5D1A029410B263DEC66310D488FE32EE173DB61E7273
Результат выполнения: Ошибка AvFundCrypt: Ошибка AvCryptMail: Произошла ошибка при вызове функции Win32 API. Код 0x0080004001 Не поддерживается
У меня такое было. Я по новой формировала пачку, только не путём копирования, а полностью по новой, и тогда только мне удалось её сформировать, подписать и отправить. И кстати проверьте ещё на всякий случай версии проги по заполнению ПУ ))
Чаще всего проблемы WIN32API.DLL типа DLL, возникают в результате повреждения или отсутствия файла, связанного с MSDN Disc 11. В большинстве случаев скачивание и замена файла DLL позволяет решить проблему. В качестве дополнительного шага по устранению неполадок мы настоятельно рекомендуем очистить все пути к неверным файлам и ссылки на расширения файлов DLL, которые могут способствовать возникновению такого рода ошибок, связанных с WIN32API.DLL.
Несмотря на то, что в большинстве случаев после размещения файла WIN32API.DLL в надлежащем месте на жёстком диске, сообщения об ошибках, связанных с этим файлом, больше не выводятся, следует выполнить быструю проверку, чтобы окончательно в этом убедиться. Убедитесь в том, что вам удалось устранить ошибку, открыв MSDN Disc 11 и (или) выполнив операцию, при выполнении которой возникала проблема.
ЗагрузкаWinThruster 2023 – Сканировать ваш компьютер на наличие ошибок реестра в WIN32API.DLL
Идентификатор статьи: 1094713
WIN32API. DLL
Эти проблемы MSDN Disc 11, связанные с WIN32API.DLL, включают в себя:
- “Отсутствует файл WIN32API.DLL.”
- «Отсутствует WIN32API.DLL. «
- “WIN32API.DLL нарушение прав доступа.”
- “Файл WIN32API.DLL не удалось зарегистрировать.”
- “Файл C:WindowsSystem32\WIN32API.DLL не найден.”
- «Не удается загрузить MSDN Disc 11 – отсутствует требуемый файл WIN32API.DLL. Установите MSDN Disc 11 еще раз. «
Проблемы MSDN Disc 11 WIN32API.DLL возникают при установке, во время работы программного обеспечения, связанного с WIN32API.DLL, во время завершения работы или запуска или реже во время обновления операционной системы. Важно отметить, когда возникают проблемы с WIN32API.DLL, так как это помогает устранять проблемы MSDN Disc 11 (и сообщать Microsoft).
Причины ошибок в файле WIN32API. DLL
Как правило, WIN32API.DLL проблемы атрибут поврежденного/отсутствующего WIN32API.DLL. Обычно проблемы MSDN Disc 11 возникают из-за того, что WIN32API.DLL является файлом из внешнего источника.
Повреждение WIN32API.DLL происходит во время неожиданного завершения работы, вирусов или других проблем, связанных с MSDN Disc 11s. После повреждения WIN32API.DLL не может загрузиться, вызывая проблемы MSDN Disc 11 при запуске.
Другая возможность проблем MSDN Disc 11 и WIN32API.DLL связана с нарушением реестра. Сломанные ссылки на DLL-файлы могут помешать правильной регистрации файла DLL, давая вам ошибку WIN32API.DLL Перемещение WIN32API.DLL, отсутствующие файлы WIN32API.DLL или неправильная и оставшаяся ссылка на файл из неправильной установки/удаления MSDN Disc 11 приводят к их нарушению.
Более конкретно, данные ошибки WIN32API.DLL могут быть вызваны следующими причинами:
- Поврежденная или недопустимая запись реестра WIN32API.DLL.
- Вирус или вредоносное ПО поврежден WIN32API.DLL.
- Аппаратный сбой, связанный с Microsoft, например видеокарта, повреждает WIN32API.DLL.
- Требуется версия другого программного обеспечения перезаписала версию WIN32API.DLL.
- Другая программа (не связанная с MSDN Disc 11) удалила WIN32API.DLL по ошибке (или злонамеренно).
- Другая программа удалила файл WIN32API.DLL.
<< к списку вопросов
Данная статья является введением в программирование на WinAPI. Важно понимать, что она носит скорее информационный характер, чем служит примером кода для реальных приложений. Дело в том, что WinAPI создавался для языка С, и имеет целый ряд недостатков в применении, как-то: невысокая безопасность, большой объем ручного кодирования для решения простейших задач, С-стиль, плохо выглядящий в C++-приложениях. Практически любое средство разработки на языке C++ для Windows включает те или иные высокоуровневые C++-библиотеки (MFC, ATL/WTL для Visual C++, VCL для C++ Builder), значительно упрощающие разработку Windows-приложений, и делающие ее более безопасной.
Предисловие
Эта статья посвящена описанию программирования приложений на «чистом» Win32 API. Она написана в основном для начинающих программистов, пишущих программы на Visual C++ 6 с использованием библиотеки MFC, но я надеюсь, может пригодиться и более опытным людям.
First Blood
После создания нового проекта Win32 Application, в зависимости от выбранных опций, мастер генерирует стартовый код. Из этого кода программисту впоследствии, и придется писать программу. Создавая новый проект Win32 Application, выберите в окне мастера опцию An empty project и добавьте в раздел Source Files новый файл с расширением .cpp.
Убираем Ошибку Win32
В этом файле добавьте функцию WinMain вида:
Вот и готова первая программа на WinAPI. Она выводит сообщение, после чего завершает свою работу. Обратите внимание на параметры функции WinMain :
- HINSTANCE hInstance – дескриптор экземпляра приложения. Этот дескриптор содержит адрес начала кода программы в ее адресном пространстве. Дескриптор hInstance чаще всего требуется функциям, работающим с ресурсами программы.
- HINSTANCE hPrevInstance – дескриптор предыдущего экземпляра приложения. Этот дескриптор остался от старых версий Windows — скорее всего, вам он никогда не пригодится.
- LPSTR lpCmdLine – указатель на начало командной строки, введенной при запуске программы.
- int nCmdShow – это значение содержит желаемый вид окна (например, свернутый или развернутый)
Функция WinMain – первая функция, которая выполнятся в программе (ее еще называют «точка входа» или «entry point»). С нее все начинается, и ею (желательно) все должно закончиться.
Функция WinMain – это первая функция, которую вы можете увидеть и заполнить кодом. На самом деле до этой функции выполняется достаточно много кода из библиотеки C++
You have a Message!
Программисты, незнакомые с программированием на WinAPI, спросят: «Что с этим делать?!», — или: «Где создавать CDialog?». В данном случае ответ прост – нигде! В нашем проекте нет класса CDialog или, предположим, CButton – ведь эта статья посвящена тому, как обойтись без них.
В Windows при каждом событии, произошедшем в системе, отсылается «сообщение Windows» («windows message»). Эти сообщения уведомляют программу о событиях в системе, а программа в свою очередь, может на них реагировать. Сообщения может отсылать не только Windows, но и сами приложения. Это является одним из способов организации связи между процессами в системе. Конечно, программа может отсылать сообщения и самой себе.
Сообщение можно отослать функцией SendMessage или ее асинхронным аналогом PostMessage.
Для приема сообщений в программе должен находиться «цикл сообщений» («message loop») который обычно выглядит так:
Функция GetMessage принимает следующие параметры:
- LPMSG lpMsg – указатель на структуру сообщения, в которую GetMessage вернет результат.
- HWND hWnd – описатель окна, от которого GetMessage примет сообщение ( NULL означает, что GetMessage принимает сообщения от всех окон, принадлежащих потоку).
- UINT wMsgFilterMin – наименьший идентификатор сообщения, которое примет GetMessage.
- UINT wMsgFilterMax – наибольший идентификатор сообщения, которое примет GetMessage (если в значениях параметров wMsgFilterMin и wMsgFilterMax передать 0, функция будет принимать ВСЕ сообщения).
Функция GetMessage не отдает управление программе, пока не придет какое-либо сообщение. Если пришедшее сообщение – WM_QUIT , функция GetMessage вернет 0 . Тогда цикл прервется, и программа завершит свою работу. При любом другом сообщении функция GetMessage возвращает значение больше нуля, и начинатся выполнение тела цикла. При ошибке GetMessage возвращает -1.
Сообщение WM_QUIT лучше посылать с помощью специальной функции PostQuitMessage(int iExitCode). Эта функция отошлет сообщение WM_QUIT, а в параметре wParam передаст код завершения программы, указанный в iExitCode.
Функция DispatchMessage должна вызвать «функцию обработки сообщений». В простейшем варианте она выглядит так:
При вызове этой функции ей передаются следующие параметры:
- HWND hWnd – описатель окна, от которого пришло сообщение.
- UINT message – идентификатор сообщения.
- WPARAM wParam и LPARAM lParam – параметры сообщения.
Функция обработки сообщений не обязательно должна иметь имя WndProc . Таких функций в программе может быть несколько, но их прототипы обязательно должны выглядеть так:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
При вызове этой функции DispatchMessage передает в параметре message идентификатор сообщения. По этому идентификатору производится выборка и выполняется какое-либо действие ( «реакция на сообщение» ).
В Windows существует очень много сообщений! Писать обработчики для всех сообщений – нереальная задача. Чтобы Windows сама обработала бесполезное для вас сообщение, необходимо вызвать функцию DefWindowProc :
LRESULT DefWindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
Желательно передавать все необработанные сообщения этой функции, а результат ее выполнения возвращать при выходе из WndProc . Это очень важно, так как от обработки некоторых сообщений Windows ждет возврата конкретных результатов или действий.
Одной функцией обработки сообщений могут пользоваться несколько окон, но для одного окна может существовать только одна функция обработки сообщений! Как же система определяет, какой именно функцией обработки сообщения пользоваться для конкретного окна и где она находится?! За это отвечает «класс окна» («window class»).
CLASSные окна
При создании нового окна ему присваивается «Класс окна» (window class). Класс окна задает оконную функцию, используемую по умолчанию. Кроме этого, класс окна задает другие параметры окна, такие, как стиль, меню окна, цвет рабочей области и т.д. Разные классы окон могут указывать на одну и ту же функцию обработки сообщений. Для создания класса его необходимо зарегистрировать.
Итак, регистрация! За нее отвечает функция RegisterClass . В ее параметре необходимо передать указатель на структуру WNDCLASS . Обычно для заполнения структуры и вызова RegisterClass создают отдельную функцию. Но это — дело вкуса.
Вот простейший пример такой функции:
- WNDPROC lpfnWndProc – адрес функции обработки сообщений.
- HINSTANCE hInstance – уже знакомая переменная, описывающая экземпляр.
- LPCTSTR lpszClassName – имя нового класса.
- HICON hCursor – описатель курсора мыши.
- HBRUSH hbrBackground – цвет рабочей области окна.
Функция RegisterClass возвращает уникальный «описатель класса окна» типа ATOM . Если при регистрации класса произошла ошибка, это значение будет равно нулю. Чтобы узнать, что произошло, можно вызвать функцию GetLastError() .
Существует также функция RegisterClassEx. Это аналог функции RegisterClass с возможностью присвоения окнам маленькой иконки. При работе с этой функцией необходимо пользоваться структурой WNDCLASSEX.
Если вы решились работать с GUI Windows вручную, то пользоваться нужно именно RegisterClassEx, поскольку приложение, не имеющее маленькой иконки, сегодня выглядит в Windows как минимум странно. – прим.ред.
Следите, чтобы имя вашего класса не совпадало с именами системных классов (например: button или edit).
Я описал не всю структуру. Все незаполненные поля, которых нет в примере, сейчас равны нулю. Об их значениях можно узнать из MSDN.
Сообщения от окон, созданных на базе класса, зарегистрированного описанной выше функцией RegMyWindowClass, будут обрабатываться функцией с именем WndProc. Чтобы функция WndProc поняла, от какого именно окна пришло сообщение, ей передается уникальный описатель окна HWND .
Our Windows
На вашем месте у меня возникло бы желание увидеть те самые пресловутые окна, из-за которых столько шума. Окно в Windows создается функцией CreateWindow . Вот ее прототип:
HWND CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD wStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);
Как видите, у функции множество параметров:
- LPCTSTR lpClassName – имя класса для создаваемого окна (это имя использовалось при регистрации класса).
- LPCTSTR lpWindowName – имя окна.
- DWORD dwStyle – стиль окна.
- int x – позиция по горизонтали верхнего левого угла окна.
- int y – позиция по вертикали.
- int nWidth – ширина окна.
- int nHeight – высота окна.
- HWND hWndParent – используется для создания «дочернего окна» («child window»). Сюда передается описатель «родительского окна» («parent window»).
- HMENU hMenu – описатель меню (если hMenu равно нулю, используется меню класса, указанного в lpClassName ).
- HINSTANCE hInstance – экземпляр приложения.
- LPVOID lpParam – указатель на пользовательский параметр окна. Этот указатель со всеми остальными параметрами функции CreateWindow будет занесен в структуру CREATESTRUCT . В сообщениях WM_CREATE или WM_NCCREATE параметр lParam будет содержать указатель на эту структуру.
Функция CreateWindow возвращает уникальный описатель окна HWND . Если функция вернула ноль, значит, во время создания окна произошла ошибка. Какая именно, можно узнать, вызвав функцию GetLastError .
Существует также функция CreateWindowEx, в которой дополнительно присутствует параметр dwExStyle. С его помощью можно создать окно с дополнительными стилями.
План полета
Итак, сейчас я упрощенно расскажу, что же произойдет, если щелкнуть по окну левой кнопкой мыши.
- Пользователь нажимает левую кнопку мыши в то время когда курсор мыши находится над рабочей областью окна.
- Windows помещает сообщение WM_LBUTTONDOWN в очередь потока.
- Цикл обработки сообщения должен вынуть сообщение с помощью функции GetMessage и передать его на обработку функции DispatchMessage .
- Функция DispatchMessage находит окно, которому предназначено сообщение и помещает сообщение в его очередь.
- Функция окна обрабатывает сообщение WM_LBUTTONDOWN и возвращает результат.
- Тело цикла заканчивается, и управление снова передается функции GetMessage для ожидания новых сообщений.
Итого
WinMain, регистрация класса, цикл сообщений, функция обработки сообщений, создание окна. Как все это связать?! Вот код, который объединяет все написанное выше в одну программу:
Вот, в принципе, и все! Это полноценное приложение на WinAPI.
Программа регистрирует класс, создает окно этого класса и обслуживает сообщение WM_LBUTTONUP (оно приходит по событию отпускания левой кнопки мыши), показывает окно, и после обработки сообщения снова возвращается в цикл сообщений, находящийся в WinMain .
Признаю, что данная статья и программа опускает очень много деталей! Многие вещи были не раскрыты (например, остальные переменные структуры WNDCLASS ). Все это сделано для того, чтобы максимально упростить статью и уменьшить код программы.
Буду рад получить отзывы и критику.
Эта статья опубликована в журнале RSDN Magazine #4-2005. Информацию о журнале можно найти здесь
Как исправить api-ms-win-crt, ошибка в Windows 10, 8. 1 и 7
Иногда вы можете столкнуться с ошибкой отсутствия api-ms-win-crt-runtime-l1-1-0.dll при попытке запустить или открыть программу или файл на вашем компьютере с Windows 10, что мешает вам открывать определенные программы и выполнять определенные задачи.
api-ms-win-crt-runtime-l1-1-0.dll — это системный файл, встроенный в распространяемый компонент Microsoft Visual C++ для Visual Studio 2015. И эта ошибка api-ms-win-crt-runtime-l1- Отсутствие 1-0.dll означает, что либо универсальный CRT (он является частью распространяемого пакета Visual C++) не удалось установить должным образом, либо файл api-ms-win-crt-runtime-l1-1-0.dll поврежден или отсутствует.
Что делать если запуск невозможен api-ms-win-crt
api-ms-win-crt-runtime-l1-1-0.dll — файл DLL (библиотеки динамической компоновки), в котором в основном находятся внешние части программы, работающей в Windows и других ОС. И если этот файл DLL отсутствует или поврежден, вы можете столкнуться с этой ошибкой при открытии Skype, Adobe Premiere, Adobe, Autodesk, XAMPP, Corel Draw, Microsoft Office и т. д.
Давайте сначала проверим, установлен ли распространяемый пакет Microsoft Visual C++ 2015 на вашем компьютере.
После этого перезагрузите компьютер, чтобы применить обновления Windows и проверьте, исправлена ли ошибка, когда отсутствует api-ms-win-crt-runtime.
Загрузите и установите Visual C++ Redistributable вручную
Если на вашем устройстве уже установлен Microsoft Visual C++ Redistributable, и он по-прежнему показывает, что запуск невозможен api-ms-win-crt, сделайте следующее:
Если предыдущие решения вам не помогли, перейдите к следующему варианту:
Скачать api-ms-win-crt-stdio-l1-1-0. dll
Теперь скопируйте и вставьте 64-битный файл api-ms-win-crt-stdio-l1-1-0.dll в папку по пути C:WindowsSystem32, а 32-битный файл в C:WindowsSysWOW64
Если вам помогла статья или не помогла, вы всегда сможете задать свой вопрос ниже в комментариях.
Структура оконного приложения
Оконные приложения строятся по принципам событийно-управляемого программирования (event-driven programming) — стиля программирования, при котором поведение компонента системы определяется набором возможных внешних событий и ответных реакций компонента на них. Такими компонентами в Windows являются окна.
Задача любого оконного приложения — создать главное окно и сообщить Windows функцию обработки событий для этого окна. Все самое интересное для приложения будет происходить именно в функции обработки событий главного окна.
В Windows программа пассивна. После запуска она ждет, когда ей уделит внимание операционная система. Операционная система делает это посылкой сообщений. Сообщения могут быть разного типа, они функционируют в системе достаточно хаотично, и приложение не знает, какого типа сообщение придет следующим. Логика построения Windows-приложения должна обеспечивать корректную и предсказуемую работу при поступлении сообщений любого типа.
Классическое оконное приложение, как правило, состоит по крайней мере из двух функций:
Стартовая функция WinMain
Эта функция использует последовательность вызовов API и при завершении возвращает операционной системе целое число. Аргументы функции:
В структуре стартовой функции Windows можно выделить следующие операции, образующие «скелет» программы:
Регистрация класса окна
Регистрация класса окна осуществляется функцией
Члены структуры style — устанавливает стиль(и) класса. Этот член структуры может быть любой комбинацией стилей класса.
lpfnWndProc — указатель на оконную процедуру.
cbWndExtra — устанавливает число дополнительных байтов, которые размещаются вслед за экземпляром окна. Система инициализирует байты нулями.
hInstance — дескриптор экземпляра, который содержит оконную процедуру для класса.
hIcon — дескриптор значка класса, дескриптор ресурса значка. Если этот член структуры — NULL, система предоставляет заданный по умолчанию значок.
hCursor — дескриптор курсора класса, дескриптор ресурса курсора. Если этот член структуры — NULL, приложение устанавливает форму курсора всякий раз, когда мышь перемещается в окно прикладной программы.
Создание окна
Создание окна осуществляется функцией
Аргументы функции : lpClassName – указывает на строку с ‘’ в конце, которая определяет имя класса окна. Имя класса может быть зарегистрированным функцией RegisterClass или любым из предопределенных имен класса элементов управления.
lpWindowName — указывает на строку с ‘’ в конце, которая определяет имя окна.
dwStyle — определяет стиль создаваемого окна.
у – определяет координату верхней стороны окна относительно верхней стороны экрана. Измеряется в единицах измерения устройства, чаще всего в точках (pt). Для дочернего окна определяет координату верхней стороны относительно начальной координаты родительского окна.
nHeight – определяет высоту окна в единицах измерения устройства.
hWndParent – дескриптор родительского окна.
hInstance — идентифицирует экземпляр модуля, который будет связан с окном.
lpParam — указывает на значение, переданное окну при создании.
Отображение и перерисовка окна
Отображение окна осуществляется функцией
Аргументы функции : hWnd – дескриптор отображаемого окна.
nCmdShow – константа, определяющая, как будет отображаться окно согласно таблице.
Перерисовка окна осуществляется функцией
Цикл обработки сообщений
Для получения сообщения из очереди используется функция:
Аргументы функции : lpMsg — указатель на структуру сообщения.
Структура POINT имеет вид
hWnd — дескриптор окна, очередь для которого просматривается.
wMsgFilterMin — нижняя граница фильтра идентификаторов сообщений.
wMsgFilterMax — верхняя граница фильтра идентификаторов сообщений.
передает аргумент — структуру msg обратно в Windows для преобразования какого-либо сообщения с клавиатуры. Возвращает ненулевое значение в случае успешной расшифровки сообщения, 0 – ошибка.
передает аргумент — структуру msg обратно в Windows. Windows отправляет сообщение для его обработки соответствующей оконной процедуре — таким образом, Windows вызывает соответствующую оконную функцию, указанную при регистрации класса окна.
Пример стартовой функции, создающей и выводящей окно размером 500х300 точек:
Примечание : Для корректной сборки приложения используется многобайтовая кодировка.
Оконная функция — обработка сообщений окна
Оконная функция предназначена для обработки сообщений окна. Функция обработки сообщений окна организована по принципу ветвления, состоящего из последовательной проверки типа сообщения. При совпадении типа сообщения, переданного в структуре Message с соответствующей веткой, осуществляется его обработка. Минимальный вид оконной функции представлен ниже.
Вызов функции DefWindowProc() обрабатывает по умолчанию все сообщения, которые не обрабатывает оконная процедура. Функция PostQuitMessage() сообщает Windows, что данный поток запрашивает завершение. Аргументом является целочисленное значение, которое функция вернет операционной системе.
Результат выполнения программы, выводящей окно:
Импорт ошибки win32api в Python 2
при запуске python26 под ОС windows (64bits). У меня есть ошибки, такие как:
import win32api» error in Python 2.6: pywintypes26.dll
pythoncom26.dll missing ImportError: DLL load failed: The specified module could not be found.
Я сделал установку msi для python26 все DLL можно найти в разделе C:Python26Libsite-packagespywin32_system32