Как зарегистрировать файл bpl
Чтобы понять код ошибки Rt170.bpl, важно иметь хорошее понимание файлов .bpl.
BPL - это аббревиатура от Borland Package Library. BPL - формат файла разработчика, используемый Borland. Он содержит библиотеки динамических ссылок, которые используются для создания программ Borland. Файлы BPL чаще всего используются для программ Borland Delphi.
Delphi конкурирует с Visual Basic как предложение объектно-ориентированного подхода к визуальному программированию при разработке приложений.
В вашей системе много программ / приложений, которые используют формат файла rtl70.bpl для успешной работы на ПК с Windows.
- rtl70.bpl не отвечает
- Ошибка выполнения: rtl70.bpl
- Symantec User Session столкнулся с проблемой и должен быть закрыт. Приносим свои извинения за неудобства. Название приложения: rtl70.bpl
Этот код ошибки подвергает вас зависанию системы, сбоям, внезапным отключениям системы, синему экрану ошибок смерти, а также снижает производительность вашего ПК.
Решения
Причины ошибок
Возможные причины появления кода ошибки rtl70.bpl:
- DLL-файл был поврежден из-за вирусной инфекции или шпионского ПО.
- DLL файл был перезаписан несовместимой версией
- Плохая установка программы
- Слишком много недействительных и устаревших записей реестра, хранящихся в оперативной памяти
- Связанные записи реестра повреждены
Дополнительная информация и ручной ремонт
Вот некоторые из лучших, но простых решений для устранения ошибки rtl70.bpl на вашем ПК:
1. Перезагрузите компьютер
Иногда эту ошибку можно устранить, просто перезапустив систему. Попробуйте перезагрузить систему и запустить программу с поддержкой .bpl. Если программа запустится после перезагрузки ПК, то замечательно! Но учтите, что это временное решение. Ошибка может появиться снова в ближайшее время.
Итак, желательно рассмотреть долгосрочное решение для исправления кода ошибки на самое долгое время.
2. Удалите, а затем переустановите программу, вызвавшую ошибку
Если ошибка возникла после того, как в вашей системе была установлена определенная программа, рекомендуется удалить ее, а затем переустановить. Просто перейдите в панель управления, выберите опцию «Добавить / удалить программу» и удалите недавно установленную программу, которая может вызывать код ошибки rtl70.bpl.
Теперь переустановите и запустите его в своей системе. Если ошибка устранена, это означает, что причиной была неправильная установка. Если нет, то это означает, что причина ошибки связана с реестром.
Есть два способа сделать это.
Первый - щелкнуть меню «Пуск», ввести редактор реестра и нажать «Выполнить». Это откроет редактор реестра, Теперь нажмите на компьютер вариант, затем нажмите файл и импортируйте. Это помогает восстановить реестр, но возможно, что проблема может сохраняться.
Код ошибки может появиться снова. Кроме того, если реестр поврежден из-за вирусной инфекции, это решение может не работать, и вы все равно можете столкнуться с ошибкой в своей системе. Затем вам также придется загрузить антивирус, который может еще больше снизить скорость вашего ПК.
Однако лучший способ восстановить реестр и избавиться от кода ошибки на долгое время - это загрузить Restoro. Это новый, удобный, многофункциональный инструмент восстановления, который работает как очиститель реестра и оптимизатор системы.
Он очищает реестр, сканируя и удаляя все ненужные и устаревшие файлы, сохраненные в ОЗУ, такие как ненужные файлы, историю Интернета, недействительные записи реестра и многое другое. Он также восстанавливает поврежденные файлы DLL и реестр, тем самым устраняя ошибку rtl70.bpl.
Restoro прост в использовании, безопасен, эффективен и совместим со всеми версиями Windows.
Чтобы начать и устранить код ошибки rtl70.bpl всего за несколько секунд в вашей системе нажмите сюда и скачайте Restoro.
она регистрирует пакет при подключении его к Builder'у (Delphi).
Но я в своей програме подключаю пакеты динамически, ф-цией LoadPackage и надо использовать компоненты которые в этом пакете, то надо зарегистрировать эти компоненты, вызвав ф-цию Register пакета.
[SIZE="3"]Так вот вопрос: как вызвать ф-цию Register пакета BPL. [/SIZE]
[SIZE="3"]Зачем мне это нужно:[/SIZE]
1. Есть програма (моя), в неё надо встроить дизайнер, который читал / писал / редактировал бы dfm и создавал на основи их формы.
2. Для чтения dfm нужно зарегестрировать все компоненты, которые на ней могут быть.
3. Если в форме которая записана в dfm есть компонент, который не зарегестрирован в програме, то форма не загрузится.
4. Для того, чтобы грузить любые формы с програмой поставляется расширеный набор пакетов - стандартные Builder (VCLXX.bpl, RTLXX.bpl . ) и пакеты сторонних разработчиков.
Так вот, если все пакеты компелировать с програмой, то всё чики-пуки. Но тогда для добавления нового компонента надо заново компилировать прогу.
Я хочу подругому, в некую папку "BPLs" кидаю пакеты, и подгружаю их в момент запуска програмы.
Но как вызвать функцию регистрирующюю компоненты?
[SIZE="2"]+ Как узнать все Namespace в пакете?[/SIZE]
[SIZE="2"]Я знаю как узнать все ContainsUnit в пакете, может это одно и тоже?[/SIZE]
.
[SIZE="3"]Так вот вопрос: как вызвать ф-цию Register пакета BPL. [/SIZE]
Гы, я знаю. Но GetProcAddress(". ") что?
_Register не находит.
ВСЕ, КАК вызвать функцию регистрации, зная её имя, я знаю.
Но КАК её вызвать если их несколько, и я не знаю их по имени?
[SIZE="2"]Тоесь КАК найти все функции регистрации в пакете?[/SIZE]
Получается примерно так:
1. Так я нахожу все подключённые к програме пакеты и их ContainsUnit.
void __fastcall InfoProc1(const AnsiString Name, TNameType NameType, Byte Flags, void * Param)
if(NameType == ntContainsUnit)MOMO1->Lines->Add(Name);
else if(NameType == ntRequiresPackage)MOMO2->Lines->Add(Name);
else /*if(NameType == ntDcpBpiName)*/MOMO3->Lines->Add(Name);
>
void * Param = NULL;
int Flag;
try GetPackageInfo((int)ListBox1->Items->Objects, Param, Flag, InfoProc1);
>
catch(. )<>
void (__stdcall * Register1)();
Register1 =
(void (__stdcall *)())
GetProcAddress(lModule, Edit3->Text.c_str());
Вот, тут-то и загвоздка. Я не знаю имени функции, знаю только, что у неё такой формат:
@НЕКОЕ_NameSpace@Register$qqrv
[SIZE="2"]Так вот, я не догоняю как мне найти именно namespace'ы пакета?[/SIZE]
ContainsUnit похожы, но GetProcAddress чувствительна к регистру, а ContainsUnit отлицаются от namespace именно регистром (в общем случае). Например для: dclstd60.bpl, фунцкия регистрации Dde компонентов называется так: @Ddereg@Register$qqrv, а ContainsUnit с этими компонентами - DdeReg.
Но КАК её вызвать если их несколько, и я не знаю их по имени?
.
По сути то о чем ты спрашиваешь (ИМХО) - тебе необходимо узнать имя функции, которую экспортирует данный модуль? Или сформулируй задачу более конкретно - не понятно с чем собственно ты борешься. Тот же tdump вполне способен показать необходимое имя функции, в принципе никто не запретит это выполнить в своей программе (в смысле получить имена ф-ций которые экспортятся) - т.е. если задача требует - то можно пытаться производить анализ .
Вот, тут-то и загвоздка. Я не знаю имени функции, знаю только, что у неё такой формат:
@НЕКОЕ_NameSpace@Register$qqrv
Да, название будет именно такое. Читай РЕ-заголовок, для каждого пакета (т.е. dll). И см. имена всех экспортируемых из пакета(dll) ф-ий, ищи ту которая оканчивается на - Register$qqrv.
Не подскажеш как читать PE-заголовок?:confused: Если не сложно.
Лучше функцию, какую-нибуть, можно на паскале.
[QUOTE=kot_]
По сути то о чем ты спрашиваешь (ИМХО) - тебе необходимо узнать имя функции, которую экспортирует данный модуль? Или сформулируй задачу более конкретно - не понятно с чем собственно ты борешься.[/QUOTE]
Я сверху вполне конкретно изложил задачу.
Просто, если не сложно, объясните начинающиму, как получить список экспортированых функций? Я имею введу функцию, потому как внешние проги или батники меня не устраивают.
Но как вызвать функцию регистрирующюю компоненты?
Задача похожа на донкихотовскую. Реализовать собственный OTA? Спасибо, не надо.
Лучше функцию, какую-нибуть, можно на паскале.
Пока не знаю:) Там куча структур (правильней наверно говорить РЕ-формат) надо разобраться самому. Раньше с РЕ не имел дело. Если не горит подожди (пока занят, но самому интересно. ) попробую разобраться если нет, то пусти в гугле "IMAGE_EXPORT_DIRECTORY".
Не такая сложная задача. Всего-то разобратся в схеме загрузки пакетов:D . Тем более, что Borland оставила все инструменты для этого.
Убедился в этом сам, когда работал над собственным Object Inspector'ом.
Пока не знаю:) Там куча структур (правильней наверно говорить РЕ-формат) надо разобраться самому. Раньше с РЕ не имел дело. Если не горит подожди (пока занят, но самому интересно. ) попробую разобраться если нет, то пусти в гугле "IMAGE_EXPORT_DIRECTORY".
Супер. Приятно встретить понимающего человека:) .
Впринцыпе не горит, и сам быду рытся:cool: . Но если будут наработки - пиши, буду очень признателен.
typedef struct <
PDWORD PtrLnAOF;
PDWORD PtrLnAON;
WORD wNO;
>EXPORTDATA,*PEXPORTDATA;
class TForm1 : public TForm
<
__published: // IDE-managed Components
TBitBtn *BitBtn2;
TListView *ListView1;
TOpenDialog *OpenDialog1;
void __fastcall BitBtn2Click(TObject *Sender);
private: // User declarations
void __fastcall TForm1::LoadExportFunc(WORD NumberOfSections,PIMAGE_SECTION_HEADER ISH,int Offset);
void* __fastcall TForm1::MapFile(const char* File);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
PIMAGE_DOS_HEADER IDH;
if(!OpenDialog1->Execute())return;
if((IDH = (PIMAGE_DOS_HEADER)MapFile(OpenDialog1->FileName.c_str()))==0) return;
PIMAGE_NT_HEADERS INTH = (PIMAGE_NT_HEADERS)((PBYTE)IDH+IDH->e_lfanew);
PIMAGE_SECTION_HEADER ISH = IMAGE_FIRST_SECTION(INTH);
int Offset = (int)ISH - (DWORD)IDH;
LoadExportFunc(INTH->FileHeader.NumberOfSections,ISH,Offset);
//EnumThreadWindows(0, &EnumThreadWndProc, 0);
UnmapViewOfFile((void*)IDH);
>
//---------------------------------------------------------------------------
void __fastcall TForm1::LoadExportFunc(WORD NumberOfSections,PIMAGE_SECTION_HEADER ISH,int Offset) ListView1->Items->Clear();
DWORD Rva,Difference;
PIMAGE_EXPORT_DIRECTORY ExportOffset;
int i,j;
char buffer[0x400];
PDWORD PtrLnAOF,PtrLnAON,PtrLnAON_S;
PWORD PtrLnAONO,PtrLnAONO_S;
PIMAGE_DOS_HEADER IDH = (PIMAGE_DOS_HEADER)((int)ISH - Offset);
PIMAGE_NT_HEADERS INTH = (PIMAGE_NT_HEADERS)((PBYTE)IDH+IDH->e_lfanew);
Rva = INTH->OptionalHeader.DataDirectory[0].VirtualAddress;
for(i=0;i < NumberOfSections;i++,ISH++) if(!strcmp(ISH->Name,".edata")) i = NumberOfSections;
Difference = ISH->VirtualAddress - ISH->PointerToRawData;
>
>
PIMAGE_EXPORT_DIRECTORY IED = (PIMAGE_EXPORT_DIRECTORY)((PBYTE)IDH+Rva - Difference);
PtrLnAOF = (DWORD*)((PBYTE)IDH+(DWORD)IED->AddressOfFunctions - Difference);
PtrLnAON = PtrLnAON_S = (DWORD*)((PBYTE)IDH+(DWORD)IED->AddressOfNames - Difference);
PtrLnAONO = PtrLnAONO_S = (WORD*)((PBYTE)IDH+(DWORD)IED->AddressOfNameOrdinals - Difference);
for(i = 0;i < IED->NumberOfFunctions;i++) PEXPORTDATA ExportData = new EXPORTDATA;
ExportData->PtrLnAOF = PtrLnAOF;
j=0;
while((*PtrLnAONO != i)&& (++j < IED->NumberOfNames)) PtrLnAON++;
PtrLnAONO++;
>
if(j <= IED->NumberOfNames ) ExportData->PtrLnAON = PtrLnAON;
ExportData->wNO = i+IED->Base;
>
else ExportData->PtrLnAON = 0;
ExportData->wNO = i+IED->Base;
>
TListItem *LI = ListView1->Items->Add();
sprintf(buffer,"%08x",PtrLnAOF);
LI->Caption = buffer;
sprintf(buffer,"%04x",i+IED->Base);
LI->SubItems->Add(buffer);
if(j <= IED->NumberOfNames) sprintf(buffer,"%s",((PBYTE)IDH +(DWORD)*PtrLnAON - Difference));
LI->SubItems->Add(buffer);
>
PtrLnAOF++;
PtrLnAON = PtrLnAON_S;
PtrLnAONO = PtrLnAONO_S;
>
void* __fastcall TForm1::MapFile(const char* File) HANDLE hFile,hMappedFile;
void* MappedFile;
hFile = CreateFile(File,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == INVALID_HANDLE_VALUE)return 0;
hMappedFile = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
CloseHandle(hFile);
if(!hMappedFile)return 0;
MappedFile = MapViewOfFile(hMappedFile,FILE_MAP_READ,0,0,0);
CloseHandle(hMappedFile);
if(!MappedFile) return 0;
return MappedFile;
>
В настройках проекта включаю runtime package. И вот где нужно прописывать, что-бы например пакет "vcl320.bpl" программа искала у себя в корне, а не по пути "C:\Program Files (x86)\Embarcadero\Studio\17.0\bin"?
Добавлено через 4 минуты
п.с.
Rad Studio 10 Seattle
Помощь в написании контрольных, курсовых и дипломных работ здесь
Подключение .bpl к программе
Добрый день, решил попробовать использовать пакеты, но хрен знает где про них информацию брать, тем.
Везде где искал лежат выше, а ниже как будет?
Дана квадратная матрица порядка M. Заменить нулями элементы матрицы, лежащие ниже главной диагонали.
Где скачать bsfdxe5.bpl
Дайте пожалуйста ссылку на bsfdxe5.bpl
Где лежат библиотеки четвёртой версии OpenOffice и как ими пользоваться?
Вообщем, где лежат библиотеки четвёртой версии OpenOffice, как их подключить и как с ними работать
но реально непонятно, зачем
размер программы и так вполне нормальный для современных реалий
даже если этих программ пяток bpl она должна искать по правилам, стандартным для windows DLL
но реально непонятно, зачем
размер программы и так вполне нормальный для современных реалий
даже если этих программ пяток
никак
она уже так делает
подробности о разных вариантах работы с BPL
похоже глюк какой то был, сейчас попробовал на новом проекте, сделал всё тоже самое и всё работает, .bpl находит у себя в корнеГде достать библиотеку rtl70.bpl?
Помогите, пожалуйста, дельфа не установится без rtl70.bpl. Где можно достать эту библиотеку. Спасибо
Как узнать, где в этой программе код С++, а где WinApi?
В среде Visual C++ создали оконное приложение (Файл->Новый->Проекты->Win32 Application, далее.
Библиотека Bpl. Ошибка Cannot convert при сборке .bpl
Добрый день. Есть проект для создания bpl написанный на Embracadero Rad Studio 2010, необходимо.
4 простых способа открыть BPL Files
Мы все были там. Вы дважды щелкаете по файлу, и он не открывается так, как должен. Это обычная проблема. Многие расширения файлов могут быть открыты несколькими программами, и многие программы могут открывать несколько расширений файлов. Если у вас возникли проблемы с открытием файлов BPL, вот некоторые способы их работы.
Установить необязательные продукты - File Magic (Solvusoft) | EULA | Privacy Policy | Terms | Uninstall
Использовать другую программу
Если вы не можете просмотреть файл BPL, дважды щелкнув его, попробуйте открыть его в другой программе. Некоторые из самых популярных программ для открытия файлов BPL - Delphi Library, AutoCAD R2000 Batch Plot List и Winamp Ver 3 Playlist File. Просмотрите веб-сайты разработчиков, загрузите одну или несколько из этих программ, затем попробуйте снова открыть файл BPL.
Получить ключ от типа файла
Одно расширение файла может использоваться для нескольких типов файлов. Знание типа файла, который у вас есть, может помочь вам узнать, как его открыть. Большинство файлов BPL классифицируются как Developer Files, которые могут быть открыты многочисленными пакетами программного обеспечения. Посмотрите, есть ли у вас программа, уже установленная на вашем компьютере, которая предназначена для открытия Developer Files. Надеюсь, эта программа также может работать с вашим файлом BPL.
Вы можете узнать, какой тип файла представляет ваш файл BPL, просматривая свойства файла. Щелкните правой кнопкой мыши значок файла и выберите «Свойства» или «Дополнительная информация». На компьютере с Windows тип файла будет указан в разделе «Тип файла»; на Mac, он будет под «Доброй».
Связаться с разработчиком
Никто не знает больше о расширениях файлов, чем разработчики программного обеспечения. Если вы не можете открыть файл BPL с помощью любой из обычных программ, вы можете обратиться к разработчику программного обеспечения программы и попросить их о помощи. Найдите разработчика своей программы в списке ниже:
Программного обеспечения | разработчик |
---|---|
Delphi Library | Borland Software Corporation |
AutoCAD R2000 Batch Plot List | Autodesk Inc. |
Winamp Ver 3 Playlist File | Nullsoft |
Получить универсальный просмотрщик файлов
Когда никакая другая программа не откроет ваш файл BPL, универсальные файловые зрители, такие как File Magic (Download), здесь, чтобы сохранить день. Эти программы могут открывать много разных типов файлов, поэтому, если ни один из вышеприведенных советов не работает, универсальный просмотрщик файлов - это путь. Обратите внимание, что некоторые файлы не совместимы с универсальными файловыми программами и могут быть открыты только в двоичном формате.
Рекомендуем
Установить необязательные продукты - File Magic (Solvusoft) | EULA | Privacy Policy | Terms | Uninstall
Открывает все ваши файлы, как
МАГИЯ! 1
Установить необязательные продукты - File Magic (Solvusoft)
EULA | Privacy Policy | Terms | Uninstall
1 Типы файлов, которые не поддерживаются, могут быть открыты в двоичном формате.
Просмотр файлов
. when altering one's mind becomes as easy as programming a computer, what does it mean to be human.
2 декабря 2008 г.
Создаём систему плагинов, часть 3
Прежде чем переходить к реализации нашей функции _Init, пощупаем сначала эти "пакеты в виде DLL".
Откройте Delphi, закройте все свои проекты и выберите File/New/Delphi projects/Package.
Delphi создаст обычный пустой пакет. Откройте менеджер проекта (View/Project Manager) или исходник (Project/View Source) - вы увидите, что этот пакет зависит от стандартного пакета Delphi rtlXXX.bpl (вы увидите слова "requires" и "rtl"), где XXX - это номер версии Delphi (например 120 для версии 12.0, т.е. Delphi 2009).
Это пакет в стиле Delphi. Если вы скомпилируете его, то увидите маленький bpl-файл размером около 10 Кб. Фактически этот файл представляет собой обычную DLL. Вы можете открыть его в любой утилите просмотра структуре PE-файлов.
Этот модуль экспортирует две процедуры инициализации Initialize и Finalize, которые выполняют в пакете всю ту работу, которая в обычных DLL находится внутри DLLMain. А также он экспортирует несколько служебных функций, предназначенных для получения информации о пакете.
Сам пакет практически не содержит кода - поэтому он такой небольшой, а весь рабочий код расположен в стандартном пакете Delphi rtl120.bpl (или какие там цифирьки у вашей версии Delphi). Собственно и зависит он только от двух модулей: kernel32.dll и rtl120.bpl.
Пакеты такого рода используется в Delphi повсеместно. Вы получаете удобство (общий менеджер памяти, повторное использование кода и т.п.), но платите за это привязкой к конкретной версии компилятора.
Уберём зависимость от компилятора Delphi. Для этого удалите пакет rtl из списка requires (например, удалив его из менеджера проектов или вручную отредактировав исходник). Перекомпилируем проект.
Теперь наш bpl-файл занимает около 100 Кб. Если вы посмотрите на его секцию экспорта, то станет ясно, почему он подрос: в него вошёл стандартный код, ранее располагавшийся в rtl120.bpl (а именно - модуль System). Теперь секция экспорта просто пестрит функциями, связанными с модулем System. Разумеется, Initialize и Finalize остались как были. Кроме того, в секции импорта исчезла зависимость от модуля rtl120.bpl, зато появились зависимости от advapi32.dll, user32.dll и oleaut32.dll.
Вот ровно такого рода пакеты мы и будем использовать как плагины. Если не считать тонну экспортируемых функций, этот файл представляет собой обычную DLL, у которой работа, выполняемая в DLLMain, сидит в Initialize и Finalize. По сигнатуре вызова, обе эти функции - это обычные процедуры без параметров с типом вызова register.
Поэтому, функцию _Init (а заодно и потребующуюся нам в скором времени функцию _Done) можно реализовать очень просто вот так:
Как нужно загружать такие пакеты - это в следующий раз.
Читайте также: