Не удается найти dll библиотеку компилятора ресурсов

Обновлено: 29.06.2024

В этой статье мы разберем что такое DLL-файлы и возможные причины ошибок при их выполнении в Windows 7, 8, 10/

p, blockquote 1,0,0,0,0 -->

p, blockquote 2,0,0,0,0 -->

Что такое DLL-файлы

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

p, blockquote 3,0,0,0,0 -->

Разберем на примере: Вам нужно распечатать документ Word. Вы выбираете функцию «Печать», и для выполнения этой операции из системной библиотеки выгружается соответствующий файл DLL, который управляет функциями печати. Но в процессе выполнения могут возникнуть ошибки разного рода (причины их появления будут описаны далее) из-за чего программа прекращает работу и не дает завершить процесс до конца.

p, blockquote 4,0,0,0,0 -->

Причины ошибок в работе библиотек

Каждый отдельный DLL отвечает за выполнение конкретной функции, и источник проблемы зависит от того, с каким именно файлом возникли неполадки. Как показывает практика, наиболее распространённые ошибки касаются файла Windows.dll – главной системной библиотеки. Он отвечает за запуск всех установленных приложений и операционной системы в целом.

p, blockquote 5,0,0,0,0 -->

p, blockquote 7,0,0,0,0 -->

Существуют и другие причины появления ошибок такого рода:

  • Несовместимость технических требований установленного приложения и возможностей компьютера. Можно попытаться скачать более ранние версии программы, или обновить сборку операционной системы.
  • Устаревшие драйверы также могут затормозить выполнение операций. Если для запуска необходимы «свежие» драйвера, которые отсутствуют на устройстве, задача не будет выполнена из-за целого ряда ошибок. Предупредить эту проблему поможет своевременное обновление «дров» вручную, или автоматически при помощи специальных утилит.
  • Аппаратные неполадки, как, например, поломка дисковода с последующей невозможностью корректного чтения оптических носителей, тоже может повредить DLL файл, отвечающий за его нормальную работу.
  • Наряду с устаревшими драйверами, много хлопот может доставить и неактуальная версия операционной системы Windows. Все обновления для оригинальных продуктов предоставляются бесплатно. Сами разработчики ОС настоятельно рекомендуют регулярно обновлять систему. Это не только избавит от «торможений» и ошибок, но и поможет защитить ее от вредоносного ПО.
  • Имеет место быть и случайное удаление. Часто неопытные пользователи в попытках расширить свободное пространство на жестком диске, не разобравшись, удаляют десятки файлов, среди которых может оказаться и DLL-файл.

Способы устранения ошибок

Есть несколько способов устранения ошибок. Большинство из них универсальны, но некоторые будут эффективны только в конкретных ситуациях.

p, blockquote 9,0,0,0,0 -->

Ошибочное удаление исполнительного файла

p, blockquote 10,0,0,0,0 -->

Для начала необходимо провести небольшую диагностику. В строке поиска (она находится в разделе «Пуск») нужно вписать название искомого файла. В большинстве случаев это дает положительный результат, так как нередко такие файлы находятся в неправильных папках. Если поиск увенчался успехом, найденный DLL нужно переместить обратно в нужное хранилище по адресу:

  • C\Windows\System32 (для ОС в 32-битных версиях)
  • Или в C\Windows\SysWoW64 (для 64-разрядных ОС).

Если файл не удалось найти, восстановить корректную работу системы поможет обновление программного пакета от Microsoft – Visual C++ последней версии. Он наладит работу всех системных файлов и исправит возникшие и потенциальные ошибки.

p, blockquote 12,0,0,0,0 -->

Самостоятельная регистрация библиотеки

Этот метод подойдет для частого случая, когда нужный системный файл находится в правильном месте, но система по своим причинам все равно его «не видит» или не может найти. Исходя из практики, можно сразу сказать, что апдейт программного пакета не даст никаких результатов, и придется перейти к более серьезным мерам.

p, blockquote 13,0,0,0,0 -->

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

p, blockquote 14,0,0,0,0 -->

Для самостоятельной регистрации библиотеки нужно выполнить три простых шага:

  1. Зажать комбинацию клавиш “Windows+R”.
  2. В строке выполнения вписать команду “cmd”.
  3. После этого откроется командное окно, в котором нужно провести регистрацию библиотеки. Ее название зависит от того, с каким именно файлом произошли неполадки.

Через среду восстановления

p, blockquote 16,0,0,0,0 -->

Из открытого списка нужно выбрать пункт «Обновление и безопасность», а затем вкладку «Восстановление». Нужный раздел «Особые варианты загрузки» будет находиться в самом низу. В нем нужно выбрать операцию «Перезагрузить сейчас».

p, blockquote 17,1,0,0,0 -->

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

p, blockquote 18,0,0,0,0 -->

Как только система будет перезагружена, вместо обычного экрана запуска появится окно для решения неполадок. Для автоматического анализа проблем и их решения понадобится кликнуть на кнопку «Troubleshoot».

p, blockquote 19,0,0,0,0 -->

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

p, blockquote 20,0,0,0,0 -->

Обновление программ и установка необходимых DLL вручную

Проблемы с DLL-файлами довольно распространены среди пользователей, поэтому в Интернете есть множество ресурсов, предоставляющих их рабочие копии бесплатно. Но среди них попадаются мошенники, которые раздают «зараженные» файлы. Пользоваться сторонними и непроверенными ресурсами в целях безопасности компьютера и информации, содержащейся на нем, строго запрещено. Перед тем, как скопировать скачанную библиотеку в системную директорию, ее нужно тщательно проверить антивирусом.

p, blockquote 21,0,0,0,0 -->

К надежным источникам для скачивания относятся такие крупные площадки, как:

Принцип использования довольно прост. Нужно ввести имя недостающего файла на сайте, скачать его и проверить антивирусом. Если с ним все в порядке, то его можно смело помещать в системную папку.

p, blockquote 23,0,0,0,0 -->

Переустановка программы

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

p, blockquote 24,0,0,0,0 -->

p, blockquote 25,0,0,1,0 -->

Обновление драйверов

Обновляя драйверное программное обеспечение, решается самая главная причина возникновения проблем – несовместимость между тремя основными составляющими устройства:

  • Аппаратным оборудованием.
  • Установленными программами.
  • Операционной системой.

Сделать это можно вручную, или при помощи специальных программ. Здесь будет рассмотрен первый метод:

  1. Для начала нужно войти в Диспетчер задач.
  2. Найти строку с названием компьютера и щелкнуть по ней правой кнопкой мышки.
  3. Выбрать функцию «Обновить конфигурацию».

Для обновления драйверов понадобится Интернет-соединение.

p, blockquote 28,0,0,0,0 -->

Очистка компьютера от вирусов

Еще один эффективный способ решения неполадок с DLL-файлами – это сканирование компьютера на вирусы с их последующим удалением. Для этих целей подойдет любой скачанный антивирус или же встроенный «Защитник». Он быстро обнаружит и поместит в карантин ошибочную библиотеку, созданную вирусом, и удалит ее.

p, blockquote 29,0,0,0,0 -->

После этого нужно будет установить или обновить пакет Microsoft Visual C++ и восстановить работу и взаимодействие системных файлов.

p, blockquote 30,0,0,0,0 -->

Программы для автоматического исправления ошибок

p, blockquote 31,0,0,0,0 -->

Помимо встроенных расширений для устранения неполадок (они описаны в разделе про среду восстановления) есть несколько сторонних утилит, которые также настраивают корректную работу ОС:

Заключение

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

Когда я пытаюсь открыть представление ресурсов проекта VC ++ 2012 (MFC) для редактирования ресурсов, я получаю эту ошибку: «Не удается найти DLL компилятора ресурсов. Пожалуйста, убедитесь, что путь правильный.

Я нашел более ранний вопрос по SO: «VS2010:« Не удается найти DLL компилятора ресурсов. Пожалуйста, убедитесь, что путь указан правильно ». И многие другие похожие через Google, но ни один из советов, приведенных там, не помогает. Делал дважды ремонт моя установка VS2012, пробовал все настройки реестра, упомянутые в статьях. Похоже, что DLL нужна rcdll.dll, нашел его в нескольких каталогах Windows SDK Bin, добавил их в системный путь (как 32-битный, так и x64 каталог) и до сих пор ничего.

Потрачено более 4 часов на эту проблему. Есть что-нибудь еще, чтобы попробовать? Спасибо!

Решение

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

В конце концов выяснили, что через час или около того, отслеживая все обращения к файлам и реестру, которые выполняет VS2012 devenv.exe, с помощью Sysinternals procmon. Оказывается, что VS2012, по крайней мере в моей системе, искал только этот ключ, игнорируя все остальное:

Однажды я установил InstallationFolder укажите там допустимую папку Windows SDK (независимо от того, была ли это версия 7, 7.1 или 8.1 SDK), все начали работать нормально. Что странно, что все остальные посты по аналогичным проблемам предлагалось установить:

ценность CurrentInstallFolder а также Текущая версия какой SDK вы хотели использовать, и он должен был работать. Не так, только вышеупомянутый ключ и значение были прочитаны и соблюдались. Переустановка Windows 7.1 и 8.1 SDK несколько раз также не помогла.

Может быть, это какая-то ошибка в VS2012 Update 4, самая актуальная на момент написания этой статьи. Так много часов потеряно на глупой проблеме, как эта, надеюсь, эта рецензия поможет кому-то еще избежать такой потери.

Я использую Visual Studio 2017. Когда я пытаюсь построить решение, я сталкиваюсь с этой ошибкой:

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

Я проверил свою систему и обнаружил, что v7.0, v8.0, v8.0A, v8.1A и v10.0A SDKs установлены на моей машине. Я проверил свойства своего проекта, и по умолчанию SDK - это v8.0

2 ответа

У меня есть код, который воспроизводит файл WAV через DLL. Он воспроизводил его, указывая на путь к каталогу, но я хотел бы включить его в свой EXE. Итак, я поставил его в качестве ресурса. Проблема в том, как правильно указать на него? UInt32 stream =.

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

У меня тоже есть только "windows 10 sdk версия 10.0.15063.0", установленная и решенная после:

Копия rddll.dll из: c:\Program Файлы (x86)\Windows Наборы\10\bin\10.0.15063.0\x86\rcdll.dll к: c:\Program Файлы (x86)\Windows Kits\10\bin\x86\

Просто временное решение, но оно работает.

Редактировать:

Запустите установщик Visual Studio из меню "Пуск" и нажмите "Обновить", через некоторое время все будет сделано, все сработало.

ему больше не нужно копировать файл.

вы можете скопировать с
C:\Program Файла (x86)\Windows комплектов\10\bin\10.0.15063.0\x64\rc.exe
C:\Program Файла (x86)\Windows комплектов\10\bin\10.0.15063.0\x64\rcdll.dll

C:\Program Файлов (x86)\Windows Kits\10\bin\x64\rc.exe
C:\Program Файлов (x86)\Windows Kits\10\bin\x64\rcdll.dll

C:\Program Файлов (x86)\Windows комплектов\10\bin\10.0.15063.0\x86\rc.exe
C:\Program Файлов (x86)\Windows комплектов\10\bin\10.0.15063.0\x86\rcdll.dll
к
C:\Program файлам (x86)\Windows Kits\10\bin\x86\rc.exe
C:\Program Файла (x86)\Windows Kits\10\bin\x86\rcdll.dll

Похожие вопросы:

Я следовал учебнику theForger ПО win32 API , и я решил открыть файл menu_one.rc , чтобы увидеть его содержимое из VS2010, и я получил эту ошибку: Я дважды проверил оба местоположения, и ни один из.

Когда я пытаюсь открыть представление ресурсов проекта VC++ 2012 (MFC) для редактирования ресурсов, я получаю следующую ошибку: “не удается найти компилятор ресурсов DLL. Пожалуйста, убедитесь, что.

У меня есть код, который воспроизводит файл WAV через DLL. Он воспроизводил его, указывая на путь к каталогу, но я хотел бы включить его в свой EXE. Итак, я поставил его в качестве ресурса. Проблема.

Недавно я купил лицензию DotNetBrowser, но когда я заменяю файл teamdev.licenses моего проекта, форма выдает мне ошибку при запуске приложения: не удается найти действительную лицензию.

Я добавил правильный путь JRebel к моему файлу local.properties. но тогда я сталкиваюсь с нижеприведенной ошибкой Не удалось найти библиотеку агента.

я хочу использовать файл ini в своей программе, используя устройство windows CE. и я получил исключение не могу найти pinvoke dll 'kernel32' что я должен сделать, чтобы решить эту проблему.

Я скачал Autodesk fbx sdk и пытаюсь создать простое консольное приложение. Я добавил дополнительные каталоги в каталоги Linker / General / Additional Library следующим образом: смотрите скриншот.

Исполняемый файл можно связать с библиотекой DLL (загрузить ее) одним из двух способов:

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

Явное связывание — операционная система загружает библиотеку DLL по запросу во время выполнения. Исполняемый файл, который использует библиотеку DLL, должен явно загружать и выгружать ее. Кроме того, в нем должен быть настроен указатель функции для доступа к каждой используемой функции из библиотеки DLL. В отличие от вызовов функций в статически скомпонованной или неявно связанной библиотеке DLL, при работе с явно связанной DLL исполняемый файл клиента должен вызывать экспортированные функции с помощью указателей функций. Процесс явного связывания также иногда называют динамической загрузкой или динамической компоновкой времени выполнения.

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

Определение подходящего метода связывания

Решение о применении неявного или явного связывания принимается на уровне архитектуры приложения. Каждый из этих способов имеет свои преимущества и недостатки.

Неявное связывание

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

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

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

Наконец, система изменяет код исполняемого файла процесса и предоставляет функциям DLL начальные адреса.

Как и в случае с остальном кодом программы, загрузчик сопоставляет код DLL в адресном пространстве процесса при запуске процесса. Операционная система загружает его в память только при необходимости. В связи с этим атрибуты кода PRELOAD и LOADONCALL , которые использовались DEF-файлами для управления загрузкой в предыдущих версиях Windows, более не имеют смысла.

Явное связывание

В большинстве приложений используется более простой способ неявного связывания. Тем не менее иногда явное связывание необходимо. Такой подход может требоваться в следующих случаях:

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

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

Процесс с неявным связыванием также завершается, если в любой из связанных библиотек DLL функция DllMain завершается сбоем. Процесс с явным связыванием в таких ситуациях не завершается.

Приложение, в котором применяется неявное связывание с множеством библиотек DLL, может долго запускаться, поскольку операционная система Windows при загрузке приложения загружает все библиотеки DLL. Чтобы ускорить процесс запуска приложения, можно выполнять неявное связывание только с теми библиотеками DLL, которые необходимы непосредственно после загрузки. Другие библиотеки DLL могут загружаться позднее по мере необходимости посредством явного связывания.

При явном связывании приложению не требуется библиотека импорта. Если из-за изменений в библиотеке DLL изменяются порядковые номера экспорта, приложениям не нужно будет повторно выполнять связывание, если для вызова GetProcAddress в них используется имя функции, а не ее порядковый номер. Если приложение использует неявное связывание, в случае изменений в библиотеке импорта им потребуется выполнить связывание повторно.

При использовании явного связывания следует учитывать два потенциально опасных фактора:

Если библиотека DLL имеет функцию точки входа DllMain , операционная система вызывает функцию в контексте потока, который вызывал LoadLibrary . Функция точки входа не вызывается, если библиотека DLL уже связана с процессом в рамках предыдущего вызова LoadLibrary , во время которого не выполнялся соответствующий вызов функции FreeLibrary . При явном связывании могут возникать проблемы, если библиотека DLL использует функцию DllMain для инициализации каждого потока в процессе, поскольку все потоки, существовавшие на момент вызова LoadLibrary (или AfxLoadLibrary ), не инициализируются.

Если в библиотеке DLL статические элементы данных объявляются как __declspec(thread) , при явном связывании может произойти сбой системы защиты. После загрузки библиотеки DLL посредством вызова LoadLibrary сбой системы защиты будет происходить каждый раз, когда в коде используется ссылка на такие данные. Статические элементы данных включают как глобальные, так и локальные статические элементы. Поэтому при создании библиотеки DLL не рекомендуется использовать локальную память потока. Если это все же необходимо, следует проинформировать пользователей библиотеки о возможных проблемах при ее динамической загрузке. Дополнительные сведения см. в разделе Использование локальной памяти потока в библиотеке динамической компоновки (пакет SDK для Windows).

Использование неявного связывания

Чтобы использовать библиотеку DLL посредством неявного связывания, исполняемые файлы клиента должны получить от ее поставщика следующие файлы:

Один или несколько файлов заголовка (с расширением h), в которых содержатся объявления экспортированных данных, функций и классов C++ в библиотеке DLL. Все классы, функции и данные, экспортируемые из библиотеки DLL, должны быть отмечены в файле заголовка как __declspec(dllimport) . Дополнительные сведения см. в статье dllexport, dllimport.

Библиотека импорта, которая связывается с исполняемым файлом. Библиотека импорта создается компоновщиком при построении DLL. Дополнительные сведения см. в разделе Использование LIB-файлов в качестве входных данных для компоновщика.

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

Для построения исполняемого файла клиента необходимо выполнить связывание с библиотекой импорта DLL. Если вы используете внешние файл makefile или систему сборки, необходимо указывать библиотеку импорта вместе с другими связываемыми файлами объектов или библиотеками.

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

Явное связывание с библиотекой DLL

Чтобы использовать библиотеку DLL посредством явного связывания, необходимо вызвать функцию для явной загрузки библиотеки DLL во время выполнения. Для явного связывания с библиотекой DLL приложение должно выполнить следующие действия:

Вызвать LoadLibraryEx или аналогичную функцию для загрузки библиотеки DLL и получения дескриптора модуля.

Вызвать GetProcAddress, чтобы получить указатель для каждой экспортированной функции, которую вызывает приложение. Поскольку приложения вызывают функции DLL с помощью указателя, компилятор не создает внешние ссылки и нет необходимости связываться с библиотекой импорта. Тем не менее, необходимо использовать оператор typedef или using , определяющий сигнатуру вызова для вызываемых экспортированных функций.

По завершении работы с библиотекой DLL вызовите FreeLibrary.

В приведенном ниже примере функции вызывается LoadLibrary для загрузки библиотеки MyDLL, затем вызывается GetProcAddress для получения указателя на функцию DLLFunc1, далее вызывается эта функция и сохраняется результат, после чего вызывается FreeLibrary для выгрузки библиотеки DLL.

В отличие от этого примера, в большинстве случаев LoadLibrary и FreeLibrary следует вызывать в приложении только один раз для нужной библиотеки DLL. Это особенно важно, если вы планируете многократно вызывать функции в библиотеке DLL.

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