Как я уже сказал в моих комментариях к этому вопросу, если вы полагаетесь на статические зависимости и, следовательно, загружаетесь в Windows, то вы застряли на использовании стандартных способов поиска DLL в Windows. И если вы не хотите постоянно изменять путь окон, вы можете попробовать запустить приложение из файла bat / cmd и изменить путь непосредственно перед запуском приложения. AFAIK, который должен ограничивать изменение пути к экземпляру (длительности) cmd, начал выполнять файл bat / cmd.
Однако можно добиться большей гибкости, если вы сможете перейти на использование динамических зависимостей (удалить ваши bpls из необходимого списка?). Как и в случае с LoadLibrary, bpls, скомпилированные для использования пакетов времени выполнения, также могут загружаться динамически. Это то, на что полагаются большинство систем плагинов на основе Delphi bpl.
(Un). Загрузка bpls динамически выполняется с использованием (Un) LoadPackage. LoadPackage загружает пакет, указанный параметром Name (используя SafeLoadLibrary), проверяет наличие дубликатов модулей и вызывает блоки инициализации всех модулей, содержащихся в пакете.
Чтобы убедиться, что все процедуры Register в динамически загруженном bpl вызываются, вам нужно перечислить единицы измерения с помощью вызова GetPackageInfo, обеспечивающего функцию обратного вызова.
Кстати: примеры кода - это выдержки из системы плагинов, разработанной во время семинара динамических приложений Марком Миллером (разработчик / архитектор CodeRush) во время конференции 2001 года. Раньше код был онлайн, но я больше не могу его там найти ...
var
localModuleHandle: HModule;
begin
try
localModuleHandle := LoadPackage(packageName);
//GetPackageInfo accesses the given package's info table and enumerates
// all the contained units and required packages
Flags := ufAllUnits;
GetPackageInfo(localModuleHandle, Pointer(localModuleHandle), Flags, PackageIsLoadingProc);
except
on e: Exception do
Application.MessageBox(PChar(e.Message), PChar(sError), MB_OK + MB_ICONWARNING);
end;
end;
procedure PackageIsLoadingProc(const Name: string; NameType: TNameType;
Flags: Byte; Param: Pointer);
type
TRegisterProc = procedure;
var
RegisterProc: TRegisterProc;
localName: String;
begin
// Flags:
// ufMainUnit = $01;
// ufPackageUnit = $02;
// ufWeakUnit = $04;
// ufOrgWeakUnit = $08;
// ufImplicitUnit = $10;
// ufWeakPackageUnit = ufPackageUnit or ufWeakUnit;
if NameType = ntContainsUnit then
begin
localName := LowerCase(Name);
if Length(localName) > 0 then
localName[1] := UpCase(localName[1]);
@RegisterProc := GetProcAddress(HModule(Param),
PChar('@' + localName + '@Register$qqrv'));
if @RegisterProc <> nil then
RegisterProc;
end;
end;