Не удалось зарегистрировать модуль sqldmo dll hresult 2147024714
Не удалось загрузить DLL «MyOwn.dll»: указанный модуль не найден. (Исключение из HRESULT: 0x8007007E)
Я прочитал и попробовал несколько решений, которые я нашел в Интернете. Ничего не работает..
Я пробовал использовать следующие методы:
Когда я попытался следовать эта статья, и когда я запускаю этот пример (из загруженного кода), он работает без проблем (используемая dll находится в папке bin/debug)
Я скопировал свою dll (вместе со всеми файлами, от которых она зависит, в мою папку bin).
Я также пробовал этот подход, но получил ту же ошибку:
Вы можете использовать инструмент dumpbin, чтобы узнать необходимые зависимости DLL:
Это скажет вам, какие библиотеки DLL необходимо загрузить вашей DLL. Особенно обратите внимание на MSVCR*.dll. Я видел, как ваш код ошибки возникает, когда правильный распространяемый компонент Visual C++ не установлен.
Вы можете получить «Распространяемые пакеты Visual C++ для Visual Studio 2013» с веб-сайта Microsoft. Он устанавливает c:\windows\system32\MSVCR120.dll
В имени файла 120 = 12.0 = Visual Studio 2013.
Будьте осторожны, чтобы у вас была правильная версия Visual Studio (10.0 = VS 10, 11 = VS 2012, 12.0 = VS 2013. ), правильная архитектура (x64 или x86) для целевой платформы вашей DLL, а также вам нужно быть осторожным отладочные сборки. Отладочная сборка DLL зависит от MSVCR120d.dll, которая является отладочной версией библиотеки, которая устанавливается вместе с Visual Studio, но не с помощью распространяемого пакета.
Есть ли способ определить, требуются ли 64-разрядные или 32-разрядные версии распространяемых компонентов?
Для тех, кто все еще страдает от этой проблемы, если вы используете двоичный файл debug , версия распространяемых компонентов среды выполнения C++ должна быть точно такой же, как и та, в которой вы ее создали.
Комментарий @skyline75489 спас меня. Библиотека C++ отлично работала на моей машине, но не смогла загрузиться где-либо еще из-за того, что VS связал ее с отладочной версией msvcr.
DLL должна находиться в папке bin.
В Visual Studio я добавляю dll в свой проект НЕ в «Ссылки», а «Добавить существующий файл». Затем установите свойство «Копировать в выходной каталог» для dll на «Копировать, если новее».
Это «кладж», но вы можете использовать его, по крайней мере, для проверки работоспособности: Попробуйте жестко указать путь к DLL в коде.
Было сказано, что; в моем случае запуск dumpbin /DEPENDENTS , предложенный @anthony-hayward, и копирование 32-разрядных версий перечисленных там библиотек DLL в мой рабочий каталог решили эту проблему для меня.
Есть одна очень забавная вещь (и имеющая техническое значение), которая может отнять у вас много времени, поэтому решил поделиться ею здесь -
Я создал проект консольного приложения ConsoleApplication1 и проект библиотеки классов ClassLibrary1 .
Весь код, выполнявший вызов p/invoke, находился в ClassLibrary1.dll . Поэтому перед отладкой приложения из Visual Studio я просто скопировал неуправляемую сборку C++ ( myUnmanagedFunctions.dll ) в каталог \bin\debug\ проекта ClassLibrary1 , чтобы его можно было загрузить во время выполнения CLR. .
Я продолжал получать
Ошибка на часы. Позже я понял, что все такие неуправляемые сборки, которые должны быть загружены, необходимо скопировать в каталог \bin\debug запускаемого проекта ConsoleApplication1 , который обычно представляет собой форму win, консоль или веб-приложение.
Поэтому, пожалуйста, будьте осторожны, Current Directory в принятом ответе на самом деле означает Current Directory основного исполняемого файла, с которого запускается процесс вашего приложения. Вроде бы очевидная вещь, но иногда это может быть не так.
Извлеченный урок. Всегда размещайте неуправляемые библиотеки DLL в том же каталоге, что и запускаемый исполняемый файл, чтобы его можно было найти.
Это исправило ситуацию и для меня. Хотя странно помещать библиотеки DLL в основной проект, а не в проект, который их фактически использует.
Это потому, что это «библиотека динамической компоновки», что означает, что она используется (загружается) во время выполнения, в отличие от статических библиотек, которые используются во время компоновки.
В моем случае одна неуправляемая dll зависела от другой, которой не было. В этом случае ошибка будет указывать на существующую dll вместо отсутствующей, что может сбивать с толку.
Именно так и произошло в моем случае. Надеюсь, это поможет кому-то другому.
По сути, это линия DOS, и вы можете настроить ее в зависимости от того, для чего создается ваша DLL.
Я думаю, что вашей неуправляемой библиотеке нужен манифест.
Вот как добавить его в свой двоичный файл. и здесь Зачем.
Таким образом, в вашем компьютере может быть установлено несколько версий распространяемой библиотеки, но только одна из них должна удовлетворять вашему приложению, и она может не быть версией по умолчанию, поэтому вам нужно сообщить системе, какая версия нужна вашей библиотеке, поэтому файл manifest.
Установка: 32-разрядная версия Windows 7
Контекст: установлен драйвер PCI-GPIB, через который мне не удалось связаться из-за вышеупомянутой проблемы.
Короткий ответ: переустановите драйвер.
Длинный ответ: Я также использовал Dependency Walker, который выявил несколько отсутствующих модулей зависимостей. Я сразу подумал, что это, должно быть, была неудачная установка драйвера. Я не хотел проверять и восстанавливать каждый отсутствующий файл.
Тот факт, что мне не удалось найти программу удаления в разделе «Программы и компоненты» панели управления, является еще одним признаком неправильной установки. Мне пришлось вручную удалить пару *.dll в \system32 и ключах реестра, чтобы можно было переустановить драйвер.
Неожиданной частью было то, что не все модули зависимостей были разрешены. Тем не менее, теперь можно сослаться на интересующую *.dll.
Не удалось загрузить DLL «PrinterSettings.dll»: указанный модуль не найден. (Исключение из HRESULT: 0x8007007E)
Я только что создал свой проект в конфигурации Режим отладки, и на этот раз мой cpp dll работал нормально.
"Невозможно загрузить DLL 'xxx.dll': указанный модуль не найден. (Исключение из HRESULT: 0x8007007E)" означает, что файл МОЖЕТ быть найден, НО это не так. смог его загрузить. Попробуйте скопировать файл DLL в корневую папку вашего приложения, некоторые библиотеки DLL должны быть доступны в корневой папке приложения, чтобы оно работало. Или проверьте, есть ли какие-либо другие зависимые DLL-файлы, необходимые для этого.
"Не удается найти DLL 'xxx.dll':. " означает, что файл НЕ МОЖЕТ быть найден. Попробуйте проверить путь. Например, [DllImport(@"\Libraries\Folder\xxx.dll")]
1.Проверена совместимость dll с 32-битным или 64-битным процессором.
2.Проверены правильные пути к папке DLL .bin, system32/sysWOW64 или заданному пути.
3. Проверено, отсутствуют ли файлы PDB (база данных программы). Лучший undestand о файлах pdb.
При запуске 32-битного двоичного кода C/C++ в 64-битной системе это может возникнуть из-за несовместимости платформы. Вы можете изменить его в меню «Сборка»> «Диспетчер конфигурации».
Это не имеет ничего общего с зависимостями, если вы проверили все зависимости и знаете, что получили их все, это не имеет ничего общего ни с тем, что файл находится в неправильном каталоге, ни с неверными АРГУМЕНТАМИ, переданными в dll, DLL не загружается с помощью LoadLibrary. Вы можете проверить, что адрес, возвращаемый из LoadLibrary, всегда 0x0000000 (не загружен).
Я не мог понять эту ошибку, либо она нормально работала в Windows 7, но в Windows 10 она не работает. Я исправил проблему, хотя она не имела ничего общего с отсутствующими зависимостями или распространяемыми пакетами Runtime.
Проблема заключалась в том, что мне пришлось упаковать DLL с upx, и она снова заработала.
Что-то с файлом, распаковываемым и скомпилированным в старой операционной системе Windows XP, создало плохой заголовок PE или плохой формат файла или что-то в этом роде, но упаковка его с помощью UPX сделала трюк теперь отлично, и DLL стала в 3 раза меньше, ха-ха.
Я получил эту ошибку для одного проекта C++ в нашем решении и только на машине нашего сборщика. Остальные из нас могли построить его без проблем.
В нашем случае это произошло потому, что в этом конкретном проекте в файле .vcxproj было установлено значение "10.0" вместо "10.0.18362.0", как и во всех других наших проектах на C++.
Отсутствие указания полного номера версии SDK, по-видимому, позволило MSBuild выбрать новейший (?) SDK и связанные инструменты сборки.
У нашего мастера сборки, вероятно, были остатки более нового SDK на его машине, и MSBuild пытался его использовать (поэтому RC.exe не был найден).
В любом случае, открыв страницу свойств проекта и изменив Свойства конфигурации > Общие > Версия Windows SDK на «10.0.18362.0» (или любую другую конкретной версии SDK, которую вы установили) для всех конфигураций/платформ проекта.
Из того, что я помню в Windows, порядок поиска dll следующий:
- Текущий каталог
- Системная папка, C:\windows\system32 or c:\windows\SysWOW64 (для 32-битного процесса на 64-битной машине).
- Чтение из переменной окружения Path
Обнаружил отсутствие некоторых зависимостей (Oracle и некоторые dll из IE). Нужно установить Oracle, так как моя dll зависит от этого . тогда я узнаю :) Нашел проблему с DependencyWalker;)
Не беспокойтесь, это избавило меня от многих часов головокружения, отличный маленький инструмент! :-)
+1 Киту Халлигану за предложение DependencyWalker. Он сказал мне, что не все зависимости имеют один и тот же тип процессора (x86/x64). Я скопировал все файлы с одинаковым типом процессора в папку bin моего приложения, и это решило проблему.
В каждой dll, которую я могу найти в своей системе, есть DependencyWalker, утверждающий, что есть ошибка с разными типами ЦП - даже System.Web.Mvc.dll. Тут какая-то ложная тревога.
В моем случае проблема заключалась в попытке загрузить DLL C++, скомпилированную для отладки. Для этого требуется среда выполнения отладки C++, что означает, что вам необходимо установить Visual Studio. Или перекомпилируйте DLL для выпуска и установите распространяемый компонент среды выполнения C++.
Попробуйте ввести полный путь к dll. Если не получится, попробуйте скопировать dll в папку system32.
В вашем приложении возникло неуправляемое исключение. Если нажать кнопку продолжить, приложение будет игнорировать эту ошибку и попытаться продолжить. При нажатии кнопки выход приложение немедленно завершает работу. Не удалось получить фабрику классов COM для компонента с CLSID [A440BD76-CFE-4D46-AB1F-15F238437A3D] из-за следующей ошибки: 80040154.
Ошибка во время выполнения 429 "активный компонент х" не удается создать объект для получения фабрики класса COM для компонента с CLSID
Почему не удается зарегистрировать DLL
Ошибка при регистрации с помощью regsvr32 вида «Точка входа DllRegisterServer не найдена» говорит о том, что эта библиотека DLL не поддерживает регистрацию описанным методом. Можно попробовать использовать вариант команды:
но с большой вероятностью и это не поможет.
У большинства домашних пользователей такая проблема возникает при регистрации файлов DLL для игр и программ, часто не вполне лицензионных, которые сообщили, что нужный файл DLL не обнаружен или отсутствует. Причем сами библиотеки DLL обычно скачаны со сторонних сайтов (и чаще всего имеют имена начинающиеся с «vc», «msvc» или «d3d»). А решение, как правило, простое — выяснить, частью какого набора компонентов является эта DLL и установить эти компоненты с помощью их собственного установщика. Более подробно проблема и подходы к решению описаны в инструкции Точка входа DllRegisterServer не найдена — причины и возможные решения.
Решение
Воспользуйтесь одним или несколькими из указанных ниже способов разрешения в зависимости от ситуации.Разрешение 1 Зарегистрируйте файл SQLDMO. dll вручную. Для этого выполните следующие действия:
Найдите файл SQLDMO. dll на локальном компьютере. По умолчанию этот файл находится в папке c:\Program Files\Microsoft SQL Server\MSSQL\80\Tools\Binn.
Щелкните файл SQLDMO. dll правой кнопкой мыши и выберите команду Открыть с помощью.
В диалоговом окне Windows выберите пункт выбрать программу из списка, а затем нажмите кнопку ОК.
В диалоговом окне " Открыть с помощью " нажмите кнопку " Обзор".
Найдите и откройте следующую папку: systemdrive : \Windows\System32.
Дважды щелкните файл regsvr32. exe и нажмите кнопку ОК.
RegSvr32-DllRegisterServer в SQLDMO. DLL выполнена успешно.
Примечание. Если вы не можете зарегистрировать файл SQLDMO. dll или файл SQLDMO. dll отсутствует в каталоге BINN, перейдите к разделу "разрешение 3". Разрешение 2
Найдите файл CAPICOM. dll на локальном компьютере. По умолчанию этот файл находится в файле systemdrive : \Windows\System32.
Щелкните правой кнопкой мыши файл CAPICOM. dll и выберите команду Открыть с помощью.
В диалоговом окне Windows выберите пункт выбрать программу из списка, а затем нажмите кнопку ОК.
В диалоговом окне " Открыть с помощью " нажмите кнопку " Обзор".
Найдите и откройте следующую папку: systemdrive : \Windows\System32.
Дважды щелкните файл regsvr32. exe и нажмите кнопку ОК.
RegSvr32-DllRegisterServer в CAPICOM. DLL выполнена успешно.
Windows 10 Pro released in July 2015 Windows Vista Enterprise Windows Vista Business Windows Vista Home Basic Windows Vista Home Premium Windows Vista Ultimate Microsoft Windows XP Home Edition Microsoft Windows XP Professional Microsoft Windows XP Tablet PC Edition Windows 7 Enterprise Windows 7 Home Basic Windows 7 Home Premium Windows 7 Professional Windows 7 Ultimate Windows 8 Windows 8 Enterprise Windows 8 Pro Windows 8.1 Windows 8.1 Enterprise Windows 8.1 Pro Еще. Меньше
Типичные решения ошибок Regsvr32
При появлении ошибки Regsvr32 попробуйте устранить ее одним из следующих способов.
Способ 1. Повторный запуск команды Regsvr32 в командной строке с повышенными привилегиямиЧтобы открыть командную строку с повышенными привилегиями, выполните указанные ниже действия.
Windows 8.1 и Windows 8Проведите пальцем от правого края экрана к центру и коснитесь кнопки Поиск. Либо, если вы используете мышь, переместите указатель в правый нижний угол экрана и щелкните кнопку Поиск. Введите запрос Командная строка в поле Поиск, щелкните правой кнопкой мыши элемент Командная строка, затем выберите команду Запуск от имени администратора. Если система запросит пароль администратора или подтверждение, введите пароль или нажмите кнопку Разрешить.
Windows XPВойдите в систему в качестве администратора или с другой учетной записью с правами администратора и откройте окно "Командная строка".
Способ 2. Использование 32-разрядной версии Regsvr32 для регистрации 32-разрядной библиотеки DLL в 64-разрядной версии ОС WindowsЕсли при регистрации 32-разрядной библиотеки DLL в 64-разрядной версии ОС Windows появляется ошибка, выполните следующие действия.
Откройте командную строку с повышенными привилегиями.
Если 32-разрядная библиотека DLL находится в папке %systemroot%\System32, переместите ее в папку %systemroot%\SysWoW64.
Среди частых вопросов пользователей, особенно после того, как они сталкиваются с тем, что какая-то из библиотек DLL отсутствует в Windows 10, Windows 11 или других версиях системы — как зарегистрировать DLL в соответствующей версии ОС.
В этой инструкции подробно о способах регистрации библиотек DLL в Windows x64 и x86 (32-бит) с помощью regsvr32.exe (и кратко о regasm.exe), о возможных нюансах и проблемах, которые могут возникнуть в процессе.
Дальнейшие шаги описаны в предположении, что DLL, которую нужно зарегистрировать, уже находится в нужном расположении: папке C:\Windows\System32, C:\Windows\SysWOW64 или, в некоторых случаях — отдельных папках программ, к которой относится соответствующая библиотека, например, для 1С — C:\Program Files\1cv8\номер_версии\bin (или Program Files x86 в случае 32-битной версии).
Прежде чем приступить к регистрации библиотеки, учитывайте следующие моменты:
- В x64 версиях Windows 64-битные DLL хранятся в System32, а 32-битные — в SysWOW64 (у некоторых начинающих пользователей бывает обратное предположение исходя из имён папок).
- Файлы DLL x64 и x86 (32-бит) — это разные файлы. И если прямого указания на разрядность в месте загрузки файла нет, то чаще это 32-битный файл (что не мешает ему работать в x64 системе), но это не всегда так.
- Для регистрации библиотеки DLL используется системный инструмент regsvr32.exe, который также доступен в двух версиях, которые лежат в папках System32 и SysWOW64 (в случае 64-битных систем). По умолчанию при описываемых далее действиях запускается x64 версия.
- 32-битным программам и играм (по умолчанию устанавливаются в Program Files x86 в 32-битных системах) для работы нужны 32-битные DLL, не зависимо от разрядности Windows.
Сам процесс регистрации в общем случае состоит из следующих шагов:
Причина
Синтаксис команды Regsvr32
Программа RegSvr32.exe имеет следующие параметры командной строки.
Regsvr32 [/u] [/n] [/i[:строка_команд]] DLL-файл
/u — отменяет регистрацию сервера
/i — вызывает DllInstall, передавая ей в параметре необязательную строку_команд; при использовании с ключом /u вызывает DllUnInstall.
/n — не вызывает DllRegisterServer; это может использоваться с ключом /i
Что значит точка входа DllRegisterServer не найдена
Файлы библиотек DLL в общем случае представляют собой наборы программных функций, иногда — ресурсов, которые могут быть вызваны из других программ Windows 10 и предыдущих версий.
Когда в командной строке от имени администратора вы вводите команду regsvr32 имя_файла.dll, программа regsvr32.exe ищет и пробует вызвать функцию DllRegisterServer из указанного вами файла DLL для регистрации сервера, не находит её и сообщает об ошибке «Точка входа DllRegisterServer не найдена».
Почему так происходит? Потому что далеко не все DLL содержат такую функцию и не все библиотеки можно установить в системе с помощью regsvr32.exe, а рекомендации использовать команду для регистрации DLL во многих инструкциях вводят в заблуждение и неприменимы.
Для исправления проблемы можно предложить следующие подходы:
- Попробовать использовать ту же команду, но с дополнительными параметрами для установки файла DLL (перед слэшами и именем файла пробелы):При использовании этих ключей, поиск процедуры DllRegisterServer выполняться не будет, вместо этого будет использоваться DllInstall. Но и её может не оказаться в файле и это нормально.
- Разобраться, что это за файл DLL и устанавливать его правильно, обычно в составе набора компонентов, содержащих этот файл, при условии, что это требуется. Что имеется в виду? Например, при проблемах с файлами, имена которых начинаются с msvc, как правило требуется установить нужную версию распространяемых компонентов Visual C++ (причем для x64 систем часто нужно устанавливать также и x86 или 32-бит версии), для файлов с именами dx — установить недостающие библиотеки DirectX, используя веб-установщик от Microsoft, а для файлов unarc.dll, ISDone.dll обычно и вовсе не требуется установка каких-либо файлов и дело не в них.
- Иногда может сработать следующий подход: просто копируем файл .dll в ту же папку, где находится файл .exe программы или игры, которая сообщает об ошибке.
- Использовать поиск у меня по сайту, указав имя DLL, из-за которой происходит ошибка: по большинству наиболее часто встречающихся у меня есть подробные инструкции с указанием, какие именно компоненты необходимо установить.
Важный момент по всем пунктам: файлы DLL для x64 и 32-бит (x86) систем отличаются даже при одинаковом имени, при этом даже в 64-бит Windows 10, 8.1 или Windows 7 для работы какой-то программы может требоваться DLL для 32-бит, а с DLL для x64 она может не запускаться.
Видео
Надеюсь, цель достигнута, а количество вопросов, связанных с регистрацией DLL в Windows, уменьшилось.
Видео инструкция
Также вы можете описать вашу проблему с DLL в комментариях, а я постараюсь подсказать решение.
Аннотация
Regsvr32 — это служебная программа командной строки для регистрации и отмены регистрации элементов управления OLE, например ActiveX и библиотеки DLL в реестре Windows. Средство Regsvr32.exe установлено в папке %systemroot%\System32 в ОС Windows XP и более поздних версиях Windows.
Примечание. В 64-разрядных версиях Windows есть две версии файла Regsv32.exe:
64-разрядная версия — %systemroot%\System32\regsvr32.exe;
32-разрядная версия — %systemroot%\SysWoW64\regsvr32.exe.
Читайте также: