Borlndmm dll отсутствует c builder
borlndmm.dll это файл библиотеки динамических ссылок, который является частью Borland Delphi Professional разработанный Borland Software Corp., Версия программного обеспечения для Windows: 1.0.0.0 обычно 22016 по размеру, но версия у вас может отличаться. Файлы DLL - это формат файлов для динамических библиотек, который используется для хранения нескольких кодов и процедур для программ Windows. Файлы DLL были созданы, чтобы позволить нескольким программам использовать их информацию одновременно, тем самым сохраняя память. Это также позволяет пользователю изменять кодировку нескольких приложений одновременно, не изменяя сами приложения. Библиотеки DLL могут быть преобразованы в статические библиотеки с помощью дизассемблирования MSIL или DLL в Lib 3.00. Формат файла .exe файлов аналогичен формату DLL. Файлы DLL, и оба типа файлов содержат код, данные и ресурсы.
Наиболее важные факты о borlndmm.dll:
- Имя: borlndmm.dll
- Программного обеспечения: Borland Delphi Professional
- Издатель: Borland Software Corp.
- SHA1: 2486135DE57224740428A3F4F5FC33757096CD80
- SHA256:
- MD5: 3E7DEDDEEE7DAC29CD4DBBF079D33860
- Известно, что до 22016 по размеру на большинстве окон;
Borlndmm.dll безопасный, или это вирус или вредоносная программа?
Ответ - нет, сам по себе borlndmm.dll не должен повредить ваш компьютер.
В отличие от исполняемых программ, таких как программы с расширением EXE, файлы DLL не могут быть выполнены напрямую, но должны вызываться другим кодом, который уже выполнен. Тем не менее, DLL имеют тот же формат, что и EXE, и некоторые могут даже использовать расширение .EXE. В то время как большинство динамических библиотек заканчиваются расширением .DLL, другие могут использовать .OCX, .CPL или .DRV.
Файлы DLL полезны, потому что они позволяют программе разделять свои различные компоненты на отдельные модули, которые затем могут быть добавлены или удалены для включения или исключения определенных функций. Если программное обеспечение работает таким образом с библиотеками DLL, программа может использовать меньше памяти, поскольку ей не нужно загружать все одновременно.
С другой стороны, если файл .dll прикреплен к исполняемому файлу, который предназначен для повреждения вашего компьютера, возможно, это опасно. Мы рекомендуем вам запустить сканирование вашей системы с инструмент, подобный этому это может помочь выявить любые проблемы, которые могут существовать.
Вот почему обычно, когда вы видите новый файл .dll на вашем компьютере, где-то будет файл .exe.
Убедитесь, что вы сканируете оба вместе, чтобы вам не пришлось беспокоиться о заражении вашего компьютера чем-то плохим.
Обновлено май 2022 г .:
Мы рекомендуем вам попробовать этот новый инструмент. Он исправляет множество компьютерных ошибок, а также защищает от таких вещей, как потеря файлов, вредоносное ПО, сбои оборудования и оптимизирует ваш компьютер для максимальной производительности. Это исправило наш компьютер быстрее, чем делать это вручную:
(опциональное предложение для Reimage - Cайт | Лицензионное соглашение | Политика конфиденциальности | Удалить)
Если borlndmm.dll отсутствует или поврежден, это может повлиять на многие приложения, включая операционную систему, что может помешать вам выполнять свою работу или использовать критические функции в критически важных программах.
Восстановление при загрузке
Восстановление при загрузке - это еще один способ восстановить все файлы .dll, такие как borlndmm.dll, до их первоначального рабочего состояния. Однако это исправление может вызвать проблемы в других программах, особенно если программа обновила файлы DLL.
В большинстве учебников и руководств авторы предупреждают своих читателей не загружать отсутствующие файлы borlndmm.dll со случайных и непригодных для использования веб-сайтов, которые могут предоставить им вредоносное ПО. Это не без причины, конечно. Правда в том, что в Интернете полно сайтов, которые обещают пользователям решить их проблемы, открыв определенные приложения или программы как можно скорее. К сожалению, очень немногие могут действительно оправдать ваши ожидания.
Хотя эта проблема встречается реже, потенциально гораздо более серьезная проблема заключается в том, что библиотеки DLL, которые вы загружаете из источников, отличных от поставщика, иногда могут быть загружены вирусами или другими вредоносными программами, которые могут заразить ваш компьютер. Это особенно верно для веб-сайтов, которые не слишком заботятся о том, откуда берутся их файлы. И это не так, как будто эти сайты сделают что-нибудь, чтобы рассказать вам о своих источниках высокого риска.
К счастью, процесс установки borlndmm.dll довольно прост. Короче говоря, все, что вам нужно сделать, это скопировать оригинальный файл DLL в C: \ Windows \ System32. После того, как .DLL будет скопирован, выполните следующую команду: regsvr32 borlndmm.dll, и ваш .DLL будет успешно установлен.
Единственный способ убедиться, что вы получаете стабильный, современный и чистый файл borlndmm.dll, - это получить его из источника, из которого он поступил.
access violation at address in module borlndmm.dll
Ошибку такую выдаёт. Причём делает это два раза: первый раз при выполнении расчётов, второй раз при закрытии программы. При этом после закрытия прога висит в памяти.
Методом тыка я понял, что, по крайней мере в первый раз, ошибка из-за delete []. Когда я их удаляю, то ошибки нет. Но вот на закрытие как с эти справится . . . не понял. При этом, я изменяю свою старую прогу, которая работает без ошибок. Изменения, на самом деле, не очень существенные. Прикладываю cpp новой и старой программ.
Старый
Ошибка с BORLNDMM.Dll
Добрый день! При выполнении вот таких кусков кода возникает еррор "Access violation at adress.
Точка входа в процедуру _dbk_fcall_wraper не найдена в библиотеке DLL BORLNDMM.DLL
При попытке скомпилировать файл выдает такую ошибку Точка входа в процедуру _dbk_fcall_wraper не.
Ошибка access violation at address in module borlndmm.dll write of address
Всем здравствуйте. Не могу побороть ошибку "access violation at address in module borlndmm.dll.
- присмотритесь к последним четырем строчкам в функции N3Click; когда я их закомментировал, программа нормально сотрудничала с MSExcel и нормально закрывалась. В детали я, разумеется, не вникал.
yogurt, во-первых, давай разберёмся с инициализацией и удалением массивов.
Ну, и самое главное, чтобы не путаться в звёздочках int ***A, int ******B,
в С++ придумано прекрасное действие - определение собственного типа typedef
Если есть проблема, когда старый файл работал, а новый почему-то не работает,
рекомендую пользоваться программами-сравнивалками, которые показывают в каком месте,
как и что поменялось.
Если старый файл точно работал, тогда надо возвращаться к старому файлу и постепенно вносить изменения, пока не проявится ошибка.
Спасибо, но всё равно ничего не помогает.
Я пошагово заменял в старой программе всё. Проблема с циклом (его я, понятное дело, пошагово не заменю, ибо он полностью новый)
Что-то здесь такое происходит, что заставляет выскакивать ошибку, когда я делаю delete массивов после цикла.
Скачал твой проект, немного пошаманил над ним, ошибку устранил.
Алгоритмы твои не менял за исключением одного момента (я его в коде отметил)
Сбрасываю исправленный мой вариант
yogurt, окончательно разобрался с твоим кодом. Как я и писал, алгоритм я не трогал.
После того, как я поменял i с j местами, перестало вылетать. Я тогда подумал, что ты перепутал.
Но затем, когда ты сказал, что должно быть именно [j][i] я стал копать дальше и нашел в каком месте у тебя неправильно алгоритм работает.
Я указал тебе на ошибку, а ты разбирайся, почему в этом месте у тебя -1 попадает.
АЛГОРИТМ Я НЕ МЕНЯЛ.
У тебя в коде много неправильных оборотов, постарайся разобрать почему я написал именно так.
Допустим, не надо использовать goto для того, чтобы выйти из цикла, можно просто использовать break.
П.С. С сохранением я подправил, я забыл там dValue второе добавить, в общем, увидишь?
Чувствую себя дураком. Там -1 получается потому что цикл до нуля включительно, что неправильно. Я, блин, даже на бумажке написал i > 0, а напечатал >=.
Спасибо тебе огромное.
ЗЫ. Я бы много что здесь исправил бы, но ситуация просто такая, что в программе кроме алгоритма менять ничего нельзя, вернее не желательно, что в данном случае равносильно "нельзя".
Компиляция программы под XE10, отсутствие файла BORLNDMM.DLL
Народ, помогите пожалуйста, ошибка с отсутствием файла BORLNDMM.DLL задолбала уже. Галочки с.
ошибка в dll с классом AnsiString
Возникла такая проблема: при использовании во внутренних функциях dll типа AnsiString возникают.
Ошибка при создании dll
Первый раз делаю dll (понадобилась для пользовательской функции CDATA() базы Firebird) .
( выдержки из книги "Borland C++Builder 6. Руководство
разработчика" за авторством коллектива в составе: Джаррод Холингворт, Боб Сворт,
Марк Кэшмэн, Поль Густавсон)
В среде С++ Билдер ДЛЛ можно создать двумя способами:
1. С использованием Мастера (Wizard).
2. "С нуля", т.е. начиная с абсолютно пустых файлов.
Первая функция, которая должна присутствовать в любой ДЛЛ, — главная точка
входа. У Майкрософт эта ф-ция именуется DllMain().
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
return 1;
>
В мире Борланда эта ф-ция называется DllEntryPoint().
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void *lpReserved)
return 1;
>
NB. Начиная с версии 6.0 С++Билдер поддерживает обе ф-ции. В целях бОльшей
совместимости рекомендуется использовать ф-цию DllMain().
1. Использование Мастера.
На первом шаге Мастер создания ДЛЛ предложит выбрать несколько опций:
- C. При выборе этого переключателя в качестве исходного языка будет
использоваться стандартный Си. Доступны опции MultiThread, VC++ Style DLL,
но блокированы Use VCL Use CLX.
- С++. Все опции доступны. При компиляции используется компилятор С++ со
всеми вытекающими.
- Use VCL. Данный флажок позволяет использовать VCL при написании кода ДЛЛ.
- Use VCL. Данный флажок позволяет использовать CLX при написании кода ДЛЛ.
/*При подключении любой из двух вышеуказанных библиотек автоматически
устанавливается флаг MultiThread и его невозможно сбросить.*/
- MultiThread. Подключение/отключение поддержки многопоточности.
- VC++ Style DLL. Задаёт имя точки входа в ДЛЛ. См. выше.
После того, как Вы установите все необходимые опции и нажмёте ОК, С++Билдер
автоматически сгенерирует каркас ДЛЛ-приложения. При этом в исходном файле
генерируется пустая ф-ция — точка входа в библиотеку.
При использовании Мастера создаётся несколько файлов: *.c (или *.cpp),
файл ресурсов *.res и файл проекта *.bpf. В большинстве случаев имеет значение
только файл с исходным текстом и связанный с ним заголовочный файл, который
Мастером НЕ создаётся. Заголовочный файл необходим для предоставления всей
функциональности библиотеки для других приложений.
2. НАПИСАНИЕ КОДА ДЛЛ.
Для лучшего понимания работы ДЛЛ, заполним ф-цию точки входа (simple.c):
//----------------------------- simple.c --------------------------------------
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdReason, LPVOID lpvReserved)
switch(fwdReason)
case DLL_PROCESS_ATTACH:
if (lpvReserved)
MessageBox(NULL,"Process has attached to DLL (Static Load)",
"DLLMain",MB_OK);
else
MessageBox(NULL,"Process has attached to DLL (Dynamic Load)",
"DLLMain",MB_OK);
break;
case DLL_THREAD_ATTACH:
MessageBox(NULL,"Thread has attached to DLL","DLLMain",MB_OK);
break;
case DLL_THREAD_DETACH:
MessageBox(NULL,"Thread has detached to DLL","DLLMain",MB_OK);
break;
case DLL_PROCESS_DETACH:
MessageBox(NULL,"Process has detached to DLL","DLLMain",MB_OK);
break;
>
В этом примере ДЛЛ выполняет действия, связанные с загрузкой/выгрузкой ДЛЛ. Ф-ция
точки входа передаются три параметра. Первый параметр, hinstDLL, указывает деск-
риптор ДЛЛ. Второй, fwdReason, указывает тип действий, связанных с загрузкой
или выгрузкой процесса или потока. Третий, lpvReserved, равен нулю, если ДЛЛ за-
гружается динамически, и не равна нулю в противном случае. Больше всего в дан-
ном примере нас интересует значение, передаваемое посредством fwdReason. Зная о
том, что именно происходит, можно корректно инициализировать переменные ДЛЛ при
её загрузке, и освободить занятые ресурсы при выгрузке.
Для того, чтобы ДЛЛ была полезна для других приложений, в нее следует добавить
некоторую функциональность. Добавим в файл с исходным кодом simple.c ф-ции,
указывающие версию ДЛЛ, а также выполняющие преобразования единиц длины:
//------------------------ simple.c -------------------------------------------
const double version = 1.1;
double simpleGetLibVersion() //Возвращает текущую версию ДЛЛ.
return version;
>
double feet_to_meters(double feet)
return (feet * 0.3048);
>
double meters_to_feet(double meters)
return (meters * 3.2808);
>
//-----------------------------------------------------------------------------
Обратите внимание на константу version. Когда приложение вызывает ф-цию ДЛЛ
simpleGetLibVersion(), возвращается значение, идентифицируемое этой константой.
При вызове приложением ф-ции feet_to_meters() значение, передаваемое как пара-
метр feet, преобразуется в метры и полученное значение возвращается вызывающей
ф-ции. Ф-ция meters_to_feet() выполняет обратное преобразование.
3. ЗАГОЛОВОЧНЫЙ ФАЙЛ ДЛЛ.
Сборка ДЛЛ в среде С++Билдер практически ничем не отличается от сборки ис-
полняемого файла. Для этого достаточно выбрать пункт меню Project->Build.
Если Вы собираетесь загружать ДЛЛ статически, то желательно установить опцию
Generate .lib file на вкладке Linker опций проекта. При этом отпадает необходи-
мость использования утилиты implib для получения .lib файла, необходимого для
сборки исполняемого файла при статической загрузке ДЛЛ.
5. СПОСОБЫ ЗАГРУЗКИ ДЛЛ.
Как уже упоминалось, ДЛЛ может быть загружена либо статически, либо динами-
чески. Очень важно понимать разницу между способами загрузки. Статически загру-
жаемая ДЛЛ связывается с приложением при сборке последнего путём указания соот-
ветствующей библиотеки (lib) как части проекта; вызов ф-ций из ДЛЛ при этом ни-
чем не отличается от обычного вызова. В этом случае ДЛЛ загружается в
память при запуске приложения. Динамически всязываемая ДЛЛ может загружаться и
выгружаться при необходимости; в этом случае приложение предьявляет меньше тре-
бований к ресурсам, а обращение к ф-циям ДЛЛ несколько усложнено.
Ещё одним отличием между статической и динамической загрузкой является то, что
при статическом связывании программа не может начать работу без ДЛЛ, в то время
как при динамическом связывании наличие ДЛЛ для запуска приложения не обяза-
тельно. Однако если при этом приложение попытается вызвать ф-цию из отсутствую-
щей ДЛЛ или воспользуется расположенным в ней ресурсом, произойдёт ошибка.
6. СТАТИЧЕСКОЕ СВЯЗЫВАНИЕ.
Для понимания процесса создадим приложение, использующее ранее написанную ДЛЛ
simple.dll. ДЛя этого создается демо проект AppStatic.bpr, в который включается
ранее полученный lib — файл (если Вы не пользуетесь Менеджером проектов (да и
при его использовании тоже моежно) это делается командой меню Project->Add to
Project. Shift+F11). В данном примере форма содержит Кнопки и Поля ввода (Edit).
При нажатии на кнопку Get DLL Version из ДЛЛ вызывается ф-ция simpleGetLibVersion()
и заполняет соответствующее поле ввода полученным значением. Нажатие на кнопку
Convert To Meters приведёт к пересчету значения из соответствующего поля ввода в
метры. Нажав на Convert To Feet Вы преобразуете сответствующее число из метров в
футы.
//--------------------- AppStaticForm.cpp -------------------------------------
void __fastcall TForm1::ButtonConvertToMetersClick(TObject *Sender)
double meters = feet_to_meters(EditFeet->Text.ToDouble());
EditMeters->Text = AnsiString(meters);
>
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonConvertToFeetClick(TObject *Sender)
double feet = meters_to_feet(EditMeters->Text.ToDouble());
EditFeet->Text = AnsiString(feet);
>
//---------------------------------------------------------------------------
Вот и всё, что касается статического связывания. Ещё раз обращаю внимание -
при отсутствии ДЛЛ прога работать не будет.
7. ДИНАМИЧЕСКАЯ ЗАГРУЗКА.
Для загрузки ДЛЛ в процессе выполнения приложения необходимо:
- Загрузить ДЛЛ и получить указатель на нее;
- Получить указатедь на ф-цию, которуб хотите вызвать;
- Вызвать ф-цию;
- Освободить ДЛЛ;
Для динамической загрузки ДЛЛ можно использовать одну из двух ф-ций АПИ -
LoadLibrary() или LoadLibraryEx(). Для того, чтобы понять, как происходит дина-
мическое подключение ДЛЛ, рассмотрим проект AppDynamic.bpr, в котором происходит
динамическая загрузка всё тойже simple.dll.
Первое, что нужно сделать — обьявить в программе переменную для получения
дескриптора (по сути — указателя) экземпляра ДЛЛ. В С++Билдер обьявление деск-
риптора можно разместить в классе главной формы:
//--------------- AppDynamicForm.h --------------------------------------------
private: // User declarations
HINSTANCE dllhandle;
//-----------------------------------------------------------------------------
Загрузка ДЛЛ:
//--------------- AppDynamicForm.cpp ------------------------------------------
void __fastcall TForm1::ButtonLoadLibraryClick(TObject *Sender)
dllhandle = LoadLibrary("simple.dll"); // keep track of the handle
EditDLLHandle->Text = AnsiString((int)dllhandle);
if (dllhandle)
ButtonUnloadLibrary->Enabled = true;
ButtonProcAddress->Enabled = true;
>
else
ShowMessage("Unable to load the DLL");
>
>
//-----------------------------------------------------------------------------
Ф-ция LoadLibrary() пытается загрузить ДЛЛ, идентифицируемую именем ее файла.
Здесь можно использовать также полный путь к файлу.
/* ОБРАТИТЕ ВНИМАНИЕ. Если указано только имя файла, прграмма будет пытаться
загрузить его из ТЕКУЩКГО каталога. Поэтому будте внимательны, используя подоб-
ные вызовы — например операция выбора файла с использованием стандартного диало-
га выбора (открыть/сохранить файл) приводит к установке текущим каталога, в ко-
тором находится указанный в диалоге файл.
*/
Загрузив ДЛЛ, необходимо получить указатель на ф-цию, которую предстоит выз-
вать. Для импорта ф-ции из ДЛЛ необходимо:
- Создать новое определение typdef с использованием прототипа экспортируемой
ф-ции.
- Привемти результат квызова ф-ции GetProcAddress() к прототипу экспортируе-
мой ф-ции.
Необходимо обьявить переменную для получения адреса требующейся ф-ции. Однако
перед ее обьявлением требуется определить тип используемой ф-ции с помощью
typedef:
//------------ AppDynamicForm.h -----------------------------------------------
typedef double (*SIMPLEGETLIBVERSION)();
SIMPLEGETLIBVERSION simpleGetLibVersion;
typedef double (*METERS_TO_FEET)(double);
METERS_TO_FEET meters_to_feet;
typedef double (*FEET_TO_METERS)(double);
FEET_TO_METERS feet_to_meters;
//-----------------------------------------------------------------------------
Обычно этот код размещают в хеадере, который затем включают в код программы.
В рассматриваемом коде необходимо привести результаты вызова GetProcAddress
к типу указателей на ф-ции simpleGetLibVersion, meters_to_feet и feet_to_meters.
//------------ AppDynamicForm.cpp ---------------------------------------------
void __fastcall TForm1::ButtonProcAddressClick(TObject *Sender)
if (dllhandle)
simpleGetLibVersion =
(SIMPLEGETLIBVERSION)GetProcAddress(dllhandle, "_simpleGetLibVersion");
if (simpleGetLibVersion) ButtonGetVersion->Enabled = true;
meters_to_feet =
(METERS_TO_FEET)GetProcAddress(dllhandle, "_meters_to_feet");
if (meters_to_feet) ButtonConvertToMeters->Enabled = true;
feet_to_meters =
(FEET_TO_METERS)GetProcAddress(dllhandle, "_feet_to_meters");
if (feet_to_meters) ButtonConvertToFeet->Enabled = true;
>
>
//-----------------------------------------------------------------------------
/* Начальные подчеркивания в именах ф-ций, передаваемых ф-ции GetProcAddress
требуются потому, что Билдер добавляет их автоматически к именам ф-ций,
экспортируемых из ДЛЛ.
Для бОльшей совместимости можно отключить данное свойство Билдера, сбросив
флаг Generate Underscores вкладки Advanced Compiler опций проекта.
*/
/* ВНИМАНИЕ. Всегда проверяйте успешность вызова GetProcAddress(). Если она
возвратила NULL, значит вызов ф-ции был неудачен. Попытка использования нуле-
вого указателя на ф-цию приведёт к нарушению доступа к памяти (Acsess Violation)
*/
После получения достоверного указателя, его можно использовать как обычную
ф-цию:
//----------- AppDynamicForm.cpp ----------------------------------------------
void __fastcall TForm1::ButtonGetVersionClick(TObject *Sender)
void __fastcall TForm1::ButtonConvertToMetersClick(TObject *Sender)
double meters = feet_to_meters(EditFeet->Text.ToDouble());
EditMeters->Text = AnsiString(meters);
>
//-----------------------------------------------------------------------------
void __fastcall TForm1::ButtonConvertToFeetClick(TObject *Sender)
double feet = meters_to_feet(EditMeters->Text.ToDouble());
EditFeet->Text = AnsiString(feet);
>
//-----------------------------------------------------------------------------
Как видите, эта часть кода такая же, как и при использовании статической за-
грузки.
По окончании работы с ДЛЛ ее следует освободить посредством ф-ции АПИ
FreeLibrary(), которой в качестве параметра передаётся дескриптор ДЛЛ:
//----------- AppDynamicForm.cpp ----------------------------------------------
void __fastcall TForm1::ButtonUnloadLibraryClick(TObject *Sender)
if (dllhandle)
FreeLibrary(dllhandle);
ButtonUnloadLibrary->Enabled = false;
ButtonProcAddress->Enabled = false;
ButtonGetVersion->Enabled = false;
ButtonConvertToMeters->Enabled = false;
ButtonConvertToFeet->Enabled = false;
EditDLLHandle->Text = "";
>
>
//-----------------------------------------------------------------------------
PS это статическое подключение, где-то было и про динамическое, но найти чет не могу, если найду — выложу.
2Gedeon
Я статическое подключение уже сделал и искал что-нибудь про динамическое. Все таки Спасибо!
2xim
Большое Спасибо.
2olegenty
Тоже Спасибо, но вот что я нашел:
This site is defaced.
NeverEverNoSanity WebWorm generation 11.
Непонятная ситуация.
Есть программа exe, во время работы она может
динамически подгружать dll (до конца работы программы)
Работает все нормально.
Если dll так и не вызывалась — завершение программы проходит
без ошибок.
Если dll вызывалась — зависит от Build:
1. Если Build -> Linker -> стоит галочка в Use Dynamic RTL — программа
завершается без ошибок.
2. Если галочку снять — при завершении программы (закрытии главной
формы по нажатию на [х]), выскакивает непонятный
AccessViolation.
Обработчик (OnClose) отсутствует.
Добавте еще
Project->Options. ->Linker->Use Debug Librares
К сожалению, в этом окошке ничего не появляется,
ошибка вылетает только после закрытия главного
окна программы.
В .cgl файле вижу только вот это:
QUOTE |
Error 00045. 0x310000 (Thread 0x0454): Bad parameter: A bad memory block (0x144E960) has been passed to the function. |
В exe. При закрытии формы (завершении программы)
(см на 3 темы ниже тему "Выгрузка dll" )
Но это ни на что не влияет, делаю я эту выгрузку
или нет, даже если и не делаю,
ошибка вылетает все равно.
И что непонятно, ведь если оставить галочку
Linker -> Use Dynamic Library, никакой ошибки не вылетает.
Пробовал на другом компе (отладочном), без установленного
С++Builder 6 — все то-же самое:
Скопировал программу, она затребовала еще естественно
borlndmm.dll и сс3260mt.dll (c галочкой в Use Dynamic Library)
скопировал их в папку с программой — все работает без ошибок,
теперь
убил эти 2 dll, скопировал и запустил программу (без галочки в Use Dynamic Library), то есть по идее всё включилось в это exe — работает
с той-же самой ошибкой.
Что подозреваю — в своих динамически загружаемых dll
создаю формы:
void myFunc(char* sTbl)
char tmp[100];
for(int i=0; i
Эту форма при закрытии должна удаляться:
CODE |
void __fastcall TFDll::FormClose(TObject *Sender, TCloseAction &Action) Action = caFree; > |
Может тут что не так ?
(Пробовал и без Action = caFree, то есть
в myFunc делал: delete myForm;
да и просто не удалял — не помогает.)
Почитал, попробовал.
и Application->Handle присваивал
и сам Application — увы, не помогло.
Без галочки в Use Dynamic Library все работает,
с галочкой в в Use Dynamic Library — при завершении — ошибка.
Если вы в dll сбрасываете Borland'овские формы или функции, то могу поделиться опытом использования. Схема отработана давным давно и ни разу не заглючила независимо от галочек.
// в пакете
AnsiString Computer_Name;
PACKAGE void __fastcall sShow_Okno (const int pPersonalAccountID)
TF_HACalk *frm = new TF_HACalk(Application);
try frm->Visible = false;
if (frm->Prepare(pPersonalAccountID,NULL)) frm->ShowModal();
> // try
catch (Exception &xcp)
2. Если галочку снять — при завершении программы (закрытии главной
формы по нажатию на [х]), выскакивает непонятный
AccessViolation.
Обработчик (OnClose) отсутствует.
Попробовал, переделал под Bpl с динамической загрузкой
(LoadPackage)
Теперь программа отвечает:
"Application is not licensed to use this feature"
после загрузки пакета при попытке вызова функции из
пакета.
А как описывать вызываемые функции и их типы ?
(и в BPL и в EXE ?)
При статической загрузке (меньше всего головной боли)
в exe:
extern PACKAGE AnsiString Value1;
extern PACKAGE void __fastcall Fun1 (. );
в пакете
PACKAGE AnsiString Value1;
PACKAGE void __fastcall Fun1 (. )
Вызов из exe или других пакетов
Value1 = "aaa"; Fun1();
При динамической загрузке
так же как и при работе с dll
поиск адреса по имени и косвенный вызов
int funadr = (int)GetProcAddress((HMODULE)lbm->instance, funname.c_str());
if (bpl) ((void __fastcall (*)(void))funadr)();
if(dll) ((void __stdcall (*)(void))funadr)();
Кусок кода сдесь
Нужна только динамическая загрузка.
Как я понял, в этом случае используется
extern "C" void __declspec(dllexport) PackageSay(char *WhatToSay);
и в пакете и в exe, а не PACKAGE ?
Смотрите пример там есть все, что я хотел сказать.
Без Package
Описание в пакете:
extern "C" __declspec(dllexport) void CTB_Correct (void);
void CTB_Correct (void)
Проверьте параметр пакета DesignTime / RunTime
Я использую сторонние компоненты в форме, создаваемой DLL
(EhLib, RxLib, FIBPlus, FastReport)
может это в них что-то встроено ?
Кстати, если ставлю галочку в Build With Runtime Packages -
то работает, без этой галочки — увы.
(да и работает так-же криво как и dll — дает ошибку при завершении
приложения)
FastReport и FIBplus у меня законные, купленные
RxLib + EhLib вроде как бесплатные, других сторонних
компонентов в этих формах не использовал.
I just installed C++ Builder 10 (Seattle) trial but now facing a strange error when trying to compile any (new or existing) VCL Forms application.
It's a clean installation, no settings were modified etc. I'm using Windows 10. How to solve this?
Are you perhaps building a 64bit application? There have been some reports of 64bit compiler to not working properly (generating different compilation results every time even if code has not been changed) in Delphi 10 Seattle. I assume there is a possibility that 64bit C++ compiler might also be affected by this.
Cannot submit report. QC returns databases errors upon submiting. Just great! Everything in chaos at Embarcadero.
Обновить драйверы
Обновите драйверы вашего устройства, чтобы увидеть, решит ли это проблему.
Запустить SFC
Самый безопасный способ восстановить отсутствующий или поврежденный файл borlndmm.dll, вызванный вашей операционной системой Windows, - запустить встроенную проверку системных файлов, которая заменяет отсутствующие или поврежденные системные файлы.
Для этого щелкните правой кнопкой мыши кнопку «Пуск» на компьютере Windows 10, чтобы открыть меню WinX, и щелкните ссылку «Командная строка (администратор)».
В окне CMD скопируйте следующую команду и нажмите Enter:
Сканирование может занять 10 минут, и если оно успешно завершено, вы должны перезагрузить компьютер. Запуск sfc / scannow в безопасном режиме или при запуске может дать лучшие результаты.
3 Answers 3
This is bug RSP 11768, which I suspect will be fixed in Update 1. See also this forum thread.
There are a number of solutions in that bug report:
- Add borlndmm.dll to the delay-loaded list; the method in question is never called, so the fact it isn't found doesn't cause a runtime error
- Using impdef, create a new import library for the memory manager (borlndmm.dll / memmgr.def, and remove two exports ( __dbk_fcall_wrapper and dbkFCallWrapperAddr ; see the bug for details)
- Replace memmgr.lib with the version from XE8
I think I found a solution.
- Go to Project/Options.
- Click on "C++ Compiler" and find "Use 'classic' Borland Compiler"
- Disable it
In existing projects built in previous versions of C++ Builder this may cause the following linker errors:
Unresolved external '___seh_personality_v0' Unresolved external '__Unwind_SjLj_Register' Unresolved external '___cxa_begin_catch'
Unresolved external '___cxa_rethrow' Unresolved external '___cxa_end_catch' Unresolved external '__Unwind_SjLj_Unregister'
Unresolved external '__Unwind_Resume' Unresolved external '___cpp_terminate'
To remove those errors go to
- Project/Options.
- C++ (Shared Options) / Library Path
- Remove ' $(BDS)\lib\win32\release\ '
This happened to me when I installed an older version of RAD Studio after a newer version was already installed. In my case I installed XE2 after XE10 was already installed.
In my Windows PATH the directories of the newer version (XE10)
e.g.: C:\Program Files (x86)\Embarcadero\Studio\17.0\bin
were listed after the directories of the older version (XE2)
e.g.: C:\Program Files (x86)\Embarcadero\RAD Studio\9.0\bin
therefore an old version of borlndmm.dll was found instead of the actual one.
So I just moved the newer PATH records in front of the newer ones, restarted RAD Studio and everything was fine. I mean. as it was before.
Могу ли я удалить или удалить borlndmm.dll?
Программные программы хранят файлы DLL в одной или нескольких папках во время установки. Эти файлы содержат код, который объясняет работу программ.
Если вы планируете удалить borlndmm.dll, лучше оставить его в покое. Причина этой логики заключается в том, что некоторые программы совместно используют эти файлы, поэтому удаление определенного файла DLL может непреднамеренно вызвать проблемы. Это означает, что удаление borlndmm.dll может привести к прекращению работы одной или нескольких других программ или только в ограниченной степени.
Некоторые программы также могут устанавливать файлы DLL в несколько папок вне папки Program Files (где установлено большинство программ). Поиск этих DLL-файлов может быть очень трудным, а удаление их может быть опасным.
Как уже упоминалось выше, если вы не уверены, что borlndmm.dll используется другой программой, мы рекомендуем оставить ее в покое. Однако, если вам нужно удалить файл, мы рекомендуем сначала сделать копию. Если после этого у вас возникнут проблемы с другой программой, требующей использования недавно удаленного DLL-файла, вы можете восстановить файл из резервной копии.
- Не удалось запустить приложение, так как файл borlndmm.dll не найден. Переустановка приложения может решить проблему.
- borlndmm.dll не найден
- borlndmm.dll отсутствует
- Обязательная DLL-библиотека borlndmm.dll не найдена
- Приложение или borlndmm.dll не является образом Windows
- borlndmm.dll отсутствует или поврежден
- Не удается найти borlndmm.dll
- Не удается запустить Borland Delphi Professional. Отсутствует необходимый компонент: borlndmm.dll. Пожалуйста, установите Borland Delphi Professional снова.
Читайте также: