Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2010, 07:33   #1
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию О загрузке runtime package

Пишу программу с использованием runtime package.
Возникла такая проблема: что бы всё работало корректно необходимо складывать все bpl-пакеты в папку с exe-файлом, что не очень удобно.
Есть ли способ так написать программу, что бы основной exe-файл и все пакеты имеющие зависимости загружали .bpl-файлы из папки, заданной, например, в ini-файле (или жестко прописанной в коде)?

Поясню:
есть папка с приложением в которой находится основной файл app.exe и папка modules, содержащая все необходимые пакеты.

Примерно таким образом выглядит папка с portable-версией фотошопа - один файл на неск. кб и рядом папка размером 160 мб.

Последний раз редактировалось Greek9000; 11.08.2010 в 07:38.
Greek9000 вне форума Ответить с цитированием
Старый 11.08.2010, 08:11   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
portable-версией фотошопа
Там принцип совсем другой.
А чего бы тебе не компилировать BPL внутрь экзешника?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.08.2010, 08:33   #3
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А чего бы тебе не компилировать BPL внутрь экзешника?
Я пишу здоровенное приложение, в котором без плагинов не обойтись.
Уже перепробовал кучу вариантов. В предыдущей реализации были DLL-ки с компилированными в них пакетами. У них 2 больших недостатка:
1 - большой объём (хотя с этим как-то можно смириться)
2 - размещение формы, хранящейся в DLL-ке на панели - целая эпопея с грустным финалом (потому что у приложения и dll-ки разные адресные пространства).

Так что компилировать пакет внутрь экзешника - это не выход.

Цитата:
Сообщение от Stilet Посмотреть сообщение
... Там принцип совсем другой.
Если знаешь принцип реализованный в фотошопе (тем более портабельном) - поделись, плз. К слову, детальное описание этого принципа будет лучшим ответом на поставленный вопрос (особенно, если с учётом специфики Дельфей).
Greek9000 вне форума Ответить с цитированием
Старый 11.08.2010, 08:48   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Так что компилировать пакет внутрь экзешника - это не выход.
Понимаю.
Цитата:
Если знаешь принцип реализованный в фотошопе (тем более портабельном) - поделись, плз.
Там не все просто. Пакеры - вещь оч. хитрая. Я вот так вот сразу сказать не могу, просто смысл сам представляю, но механизма не знаю.
И кстати насколько я понимаю спецификации пакров так просто разработчики тебе не выложат, тут нужно оч. много копать.
Я бы на твоем месте не заботился об этом, и ложил BPL ки либо рядом с программой, либо в папку System32. либо же если не ошибаюсь можно прописать переменную окружения, в которой указать путь к этим BPL, но я не помню как она называется (По-моему PATH), и тогда операционка должна сама подхватывать из этой переменной пути, где искать загружаемые библиотеки.
А писать свой Portable - это круто.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.08.2010, 08:50   #5
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Уважаемый Stilet подтолкнул меня ещё раз взглянуть "незамыленным" взглядом на структуру файлов фотошопа, в результате чего стал очевидным факт, который я упустил ранее.

Поэтому сам отвечаю на свой вопрос.

Исходя из того, что мы имеем основной файл app.exe и рядом с ним папку modules, реализовать поставленную задачу можно так:
В папке modules, кроме bpl-пакетов лежит главный exe-файл (пусть будет core.exe), который и содержит главное окно. Он же использует динамические пакеты.
А программа app.exe служит для для запуска core.exe. Так же он может пригодиться при автоматическом обновлении программы.

Проблема решена. Ура, товарищи!
Stilet - спасибо.
Greek9000 вне форума Ответить с цитированием
Старый 11.08.2010, 09:23   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А программа app.exe служит для для запуска core.exe. Так же он может пригодиться при автоматическом обновлении программы.
Можно конечно и так
Но я бы все-тки насчет переменной окружения порыл тему...
Если тебе твои библы понадобятся для раных программ то получается что с каждой из них ты будешь делать копии этих библиотек, в то время как можно их сложить в одну папку, и все твои программы с ними работающие будут туда "обращаться".
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.08.2010, 09:48   #7
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Можно конечно и так
Если тебе твои библы понадобятся для раных программ то получается что с каждой из них ты будешь делать копии этих библиотек, в то время как можно их сложить в одну папку, и все твои программы с ними работающие будут туда "обращаться".
В этом, конечно, есть рациональное зерно, но у меня вот какое опасение: есть стандартный пакет (из JEDI VCL) в котором мне пришлось внести кое-какие изменения. Следовательно я не могу разместить его в WINDOWS\SYSTEM32, т.к. есть вероятность, что у пользователя уже будет этот пакет, котоым пользуются другие программы. Так же нельзя гарантировать что "мои" пакеты не будут заменены "чужими". Поэтому было решено использовать текущую папку.

А вот если есть возможность задать переменную окружения, которя скажет виндовской функции LoadLibrary что искать библиотеки для загрузки надо ещё и в "моей" папке - это было бы вообще замечательно.
(Правда я не представляю с какой стороны подступиться с этим вопросом к Гуглу, но это уже мелочи )
Greek9000 вне форума Ответить с цитированием
Старый 11.08.2010, 11:02   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
если есть возможность задать переменную окружения
Я ж говорю - дописать каталог с твоими библами в переменку %PATH%. Обычно этого хватало.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.08.2010, 11:46   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Там не все просто. Пакеры - вещь оч. хитрая. Я вот так вот сразу сказать не могу, просто смысл сам представляю, но механизма не знаю.
Пакет - это обычная DLL. Соответственно и грузится он согласно правилам загрузки DLL.

Откуда следует, что если вы статически прилинкованы к пакету - то сделать вы сможете немного (к примеру - установить текущий каталог). Но если вы используете ручную загрузку, то вы можете использовать LoadLibraryEx с флагом LOAD_WITH_ALTERED_SEARCH_PATH, либо же полностью указывая путь.

Кроме того, в варианте статической линковки есть способ с перенаправлением DLL: вы можете создать папку myexe.exe.local и закинуть туда все DLL.

Ну и высший пилотаж - это манифест и side-by-side.

Цитата:
Сообщение от Stilet Посмотреть сообщение
И кстати насколько я понимаю спецификации пакров так просто разработчики тебе не выложат, тут нужно оч. много копать.
Ога, целых две функции - LoadPackage и UnloadPackage

P.S.
Цитата:
Сообщение от Stilet Посмотреть сообщение
Я ж говорю - дописать каталог с твоими библами в переменку %PATH%
Поубивал бы всех козлов, которые в неё пишут. Не для этого она предназначена.

Сам Delphi тут не безгрешен - суёт туда. Так я теперь не могу все версии Delphi нормально поставить на одну машину - потому что в PATH закончилось место. Приходится извращаться, сворачивать пути, выкидывать системные.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 11.08.2010, 12:11   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Ога, целых две функции - LoadPackage и UnloadPackage
Это тебе крупно повезет если Библиотека не содержит СОМ сервер.
Цитата:
Поубивал бы всех козлов, которые в неё пишут. Не для этого она предназначена.
И тем не менее этот аттавизм еще жив.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Runtime runtime = Runtime.getRuntime(); Pti44ka Общие вопросы по Java, Java SE, Kotlin 1 22.11.2009 10:45
без запроса Package? koleko Общие вопросы Delphi 2 18.02.2009 22:59
RunTime Error713 (VB) vio Помощь студентам 2 12.12.2008 20:45
Unit 'MyLib' implicitly imported into package 'MyPackage'. как исправить? SkAndrew Компоненты Delphi 0 06.04.2008 00:28
Runtime programming JoanM Общие вопросы Delphi 4 09.01.2008 11:00