Delphi не найден указанный модуль dll
Не удалось загрузить 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.
I’m testing on Delphi 2007 and my groupproject is composed by 2 packages.
PackageRun.bpl
It’s marked as «runtime only» and contains a unit named «uMyTestRun.pas» in which is defined an empty TFrame descendant:
PackageDes.bpl
It requires PackageRun.bpl, it’s marked as «designtime only» and contains a unit named «uMyTestDes.pas» in which I wrote the following code:
Output directories of both packages are in Library paths (Inside there are bpl, dcp and dcu).
Trying to install PackageDes.bpl (Component, Install Packages. Add. ), I’m getting the following error:
Can’t load package C: PackageDes.bpl. Impossibile trovare il modulo specificato.
The last part of the message is in my OS’s language, in english it should be something like «Can’t find specified module». (My OS is Windows 10 Pro 64bit).
PackageDes.bpl is exactly in the same path shown in the error message (C: PackageDes.bpl). After some tests, I found that the error disappear by removing the following line from uMyTestDes.pas unit:
Is there something wrong in my code/projects/environment?
4 Answers 4
Then clear the log in PM, switch to Delphi and try to load the package, then as soon as error pops up switch back to PM and stop capturing events. Try to do it fast as you can, for example do not waste your time closing error box.
Now you would get a trace of file I/O activity of Delphi loading the package of yours (and some other background activity noise — the faster you do the less noise there’d be). In that trace look for all the errors and see where and which package Delphi tries to find.
You can also try Microsoft Dependency Walker or similar tools to se if your Design-Time BPL has all the DLL-dependency tree resolvable. Personally I usually use Unreal/Total commander with FileInfo plugin or ntCore CFF Explorer.
Hi.
I am using a set of libraries like this:
ThirdPartyPackages.dpk
MyVCLs.dpk -> using ThirdPartyPackages
MyDnaPkg.dpk -> using ThirdPartyPackages
All packages contains visual components.
All packages are compiled and installed.
However, sometimes when I load MyDnaPkg.dpk and try to build it, Delphi tells me:
Delphi 7: delphi32.exe — Unable To Locate Component. This application has failed to start because MyVCLs.bpl was not found. Re-installing the application may fix this problem
followed by
Can’t load package c:program filesorlanddelphi7Proj ectsBplM yDnaPkg.bp l. The specified module could not be found
and then
Package c:program filesorlanddelphi7Proj ectsBplM yDnaPkg.bp l could not be installed after rebuilding.
The following component(s) are no longer registered: xx, yy, zz, blabla
At this moment, if I try again, I can re-build and instal the VCL/components.
Basically it toggles between two states: is the package is installed, then ‘Build’ or ‘Install’ un-installs the VCL. If the VCL is un-installed, ‘Install’ installs the VCL.
При компиляции пишет мне unit not found system.pas or binary eqivalent
Как могло стандартного то модуля не быть.
Народ подскажите плиз , чтобы нескачать чегонибудь не то ,можите дать провереную ссылку или выложить лучше сюда, если конечно возможно.
Да, просто делфи плохо — вот и всё. Такое обычно бывает, если решили поставить какую-то иную делфи от той что была, или поставили поверх, или в реестре куча гавна осталась от предыдущей установки(да, делфи этим болеет, так видимо до скончания времён не исправят). И как вариант, запустили не от имени администратора, в этом случае может быть что угодно.
P.S. нельзя так просто взять и переустановить делфи
P.P.S. честн слово ещё не разу без приключений не обошлось
Цитата (supervladislav @ 7.9.2012, 19:01 ) |
Народ ктонибудь мог бы выложить модуль system.pas слёзно умоляю. |
Если делфа старая, то добро пожаловать в мир больших приключений.
Удаляйте то что есть, через установщик.
Потом руками ищите всё чем нагадил установщик(все папки куда он что-либо поставил) и удаляете. Потом реестр чистите используя CCleaner, ну а далее самая сексапильная часть — лезете в реестр и всё что называется Borland, Delphi удаляете, разделы, просто пункты отдельные.
Делаете перезагруз и по новой устанавливаете. Устанавливать естесно с правами админа и с дистрибутива в котором вы уверены.
KAA ( 2003-05-12 11:07 ) [0]
Есть dll с процеурами. Необходимо из MSSQL вызвать нужную процедуру из этого dll файла.
← →sniknik ( 2003-05-12 12:37 ) [5]
там кроме того описано как подключить готовую (после скомпиляния), а это то тебе и нужно. ?
← →KAA ( 2003-05-12 12:51 ) [6]
Подключение Extended Stored Procedures в sql? Я тоже самое делаю.
← →sniknik ( 2003-05-12 13:04 ) [7]
чего то мы друг друга не понимаем.
делаеш, но судя по вопросу чегото не получается, а по тому примеру можно посмотреть как получается (и программа и компиляция и подключение/вызов описано).
ладно будем считать я не понял чего ты хочеш.
всетаки скачал пример (а то что проверял давно, посеял), и попытаюсь еще раз обратить внимание (вам то недосуг вникать в исходники, а зря)
информация к размышлению.
из инсталяции "моей" dll
.
- copy BIN\xp_acnt.dll to MSSQL\BINN directory;
- run install.sql in SQL Query Analizer, current database must be "master";
install.sql = sp_addextendedproc " xp_send_params_to_pipe", "xp_acnt.dll"
которая присутствует именно в таком виде (Case Sensitive, maybe)
в
exports
GetXpVersion name "__GetXpVersion",
xp_send_params_to_pipe name " xp_send_params_to_pipe";
а у Вас так же? в той, правильной, директории имеющаяся экспортируемая процедура регистрируется?
← →KAA ( 2003-05-12 18:32 ) [15]
Запускать левые фалы на сервере, это все-равно что курить на бенозаправке. Не обязательно должно все взорваться, но сам факт нарушения правил уже череват. Пробую я то на тестовой базе, а тестового сервера у меня нет.
Вообщем использовали подобную dll из другого источеника, выяснили что в нашей dll что-то там недописано, в частности в рабочей подключался некий модуль Opends60.dll. Но исходники того примера dll крайне непонравились программисту, пишущего нашу dll.
p.p.s. начал бы сразу внимание на исходники обращать, сэконимил бы себе день.
← →KAA ( 2003-05-12 19:17 ) [17]
А чем этот sql так выделяется. Вот у меня есть старая dll, ее можно отработать. По идее это библиотека с опредеенными процедурами. В чем вообще принципиальная разница межу запуском из sql или еще откуда?
Вообще честно говоря в этих исходниках черт голову сломит, чтоб их под свои нужды переделывать. Хорошо бы как можно больше сделать средствами самого sql, и как можно меньше выполнять всякими дополнительными модулями.
← →sniknik ( 2003-05-12 23:50 ) [18]
> Вообще честно говоря в этих исходниках черт голову сломит.
;о))))
э да ты батенька под 1С dll-и не писал (имею ввиду не стандартный COM с которыми он тоже работает после регистрации в системе а "родные" написанные под 1С и регистрируемые изнутри) после них эти ясны и прозрачны как слеза ребенка. :о)
> больше сделать средствами самого sql
есть уже такая вещь как SQL Alert и у самого MSSQL дополнительный пакет, но там скорее всего оповещения только "своим" SQL серверам. а не широковешательные посылки. но конкретного по нему ничего сказать не могу (не пользовался, только читал да еще на вражеском, не все понял) могу только послать не мелкософт. ищи.
KAA ( 2003-05-13 09:43 ) [19]
С 1С я пока не связывался и желанием связываться не горю. :) У меня есть своя база, которую я и пестую, а клиентом занимается другой человек. Подобные навороты с dll - не моя специализация.
А по поводу SQL Alert, так я там что-то даже не видел описния, что он делает. А пример я нашел очень простой, буквально пара процедур и пара объявлений. А цель очень проста, подать по UDP сигнал в нужный момент.
← →sniknik ( 2003-05-13 11:01 ) [20]
> что-то даже не видел описния, что он делает
прямо под ссылкой на скачивание читать не пробовал?
Can`t load package C:\. \dclrx7.bpl. Не найден указанный модуль. Do you want to attempt .
Файлы по указанному месту есть. После загрузки самой Delphi, если попробовать добавить bpl через Component \ Install packages, то они ставяться нормально и без вопросов. Компиляция так же проходит хорошо.
Почему Delphi не находит bpl при старте?
← →MBo © ( 2007-11-02 09:39 ) [1]
к RXLib прилагается readme.txt на русском, где пошагово описана инсталляция
← →Ega23 © ( 2007-11-02 09:50 ) [2]
1. Rx должен быть для D7
2. > к RXLib прилагается readme.txt на русском, где пошагово описана инсталляция
Anatoly Podgoretsky © ( 2007-11-02 09:56 ) [3]
> 1. Rx должен быть для D7
Неверно, должен быть клон Rx для D7
ЮЮ © ( 2007-11-02 09:57 ) [4]
На днях как раз ставил XP и D7.
← →Reindeer Moss Eater © ( 2007-11-02 10:07 ) [5]
Файлы по указанному месту есть.
Этого мало.
Их грузит не Delphi а винда.
Правила поиска те же, что и для DLL
Reindeer Moss Eater © ( 2007-11-02 10:11 ) [6]
После загрузки самой Delphi, если попробовать добавить bpl через Component \ Install packages, то они ставяться нормально и без вопросов.
Это только потому что, OpenDialog ищущий эти bpl сменил текущий каталог процесса делфи. Вот они и загрузились.
← →AndrewK ( 2007-11-06 11:44 ) [7]
RX всегда ставился на ура.
Проблема появилась после того, как потребовалось поставить на одну машину D6 и D7.
Сначала поставил D6 - работает нормально.
После установки D7 - указанные выше проблемы.
До этого ставил - все работало без проблем.
Пробовал переустанавливать D7, перегружать комп - не помогает.
> Reindeer Moss Eater
А как можно сказать D7, чтобы она срау искала в нужном месте?
AndrewK ( 2007-11-06 12:30 ) [8]
Хм.
Проблема решилась сама собой.
Наверное не стоило работать в пятницу .
Всем спасибо за помощь.
← →Reindeer Moss Eater © ( 2007-11-06 12:40 ) [9]
А как можно сказать D7, чтобы она срау искала в нужном месте?
Их грузит не Delphi а винда.
← →Alex007 ( 2006-03-03 13:42 ) [0]
Проблемма в следующем: При попыпте отладить dll Delphi6 на точки останова не реагирует, хотя соответственно рекомендациям в переменной path указан путь к исходникам dll. При билде в левой части окна появляются синие точки(место где можно поставить точку останова), но при попытке запустить приложение они исчезают.
В свойствах проэкта(dll) указан пунт включать отладочную информацию. Грузится именно отлаживаемая dll(проверенно ShowMessage :) ).
Уже не знаю что делать.
MBo © ( 2006-03-03 13:44 ) [1]
апдейты к D6 установлены?
← →ancara © ( 2006-03-03 13:45 ) [2]
текущий проект - это та dll?
и все написано в Run->Parameters ?
Alex007 ( 2006-03-03 13:48 ) [3]
2: MBo © (03.03.06 13:44) [1]
угу. Update2
2: ancara © (03.03.06 13:45) [2]
конечно. И в Run->Parameters указанна имено вызывающая прога.
PS: раньше работал с Delphi7, таких проблемм не было. А теперь пришлось подхватить проект на Delphi6 и зашел в тупик.
← →Alkid © ( 2006-03-03 13:51 ) [4]
Совет - объедени проекты приложения и DLL в группу проектов,у проекта DLL в Run/Parameters/Host Application выставь программу, загружающую DLL.
Может быть совсем жёсткий случай, если у тебя Дельфя всё равно не будет находить исходники для DLL (не будет синих точек против строк кода), то
можно открыть окно модулей (View/Debug Windows/Modules), выбрать
DLL и через контекстное меню указать расположение иходников для неё.
MBo © ( 2006-03-03 13:52 ) [5]
Не уверен, что это к твоему варианту относится, но попробуй:
Юрий Зотов © (23.06.03 15:24)
Так я и предполагал, но решил все же уточнить. Это известная проблема. Причина в том, что по непонятным причинам под XP отладчику не всегда удается загрузить таблицу символов DLL, а без нее он, конечно, не работает. Сделайте вот что.
1. Сразу после LoadLibrary поставьте любой ShowMesssage, лишь бы притормозить программу.
2. При появления этого ShowMessage переключитесь в Delphi, нажмите Ctrl+Alt+M (или меню View |Debug Windows | Modules), щелкните на своей DLL правой кнопкой и выберите Reload Symbol Table.
3. Вернитесь в свою программу и в ShowMessagе нажмите ОК, чтобы продолжить ее выполнение. Отладчик должен заработать.
← →isasa © ( 2006-03-03 14:24 ) [6]
Project -> Options -> Linker
Include remote debug symbols = ON
Для DLL и EXE. Пересобрать оба. Должны быть *.rsm файлы для DLL и EXE.
← →Alkid © ( 2006-03-03 14:27 ) [7]
> Project -> Options -> Linker
> Include remote debug symbols = ON
Совершенно необязательно.
Alex007 ( 2006-03-03 14:28 ) [8]
Народ, сорри решил перепроверить какая версия, оказалось, что она не апдейченная. После установки Update2 проблемма решилась.
2 MBo: 10х, а я уже пару дней мучаюсь не могу понять в чем проблемма. Просто после переустановки Делфи забыл вкатить обновления.
Читайте также: