Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Устранение ошибок при работе с классами в библиотеках пакетов Delphi 2010

Delphi , Файловая система , DLL и PlugIns

При разработке модульных приложений в Delphi 2010 с использованием BPL (Delphi Package Library) разработчики могут столкнуться с различными проблемами. В частности, одна из распространённых ошибок связана с созданием объектов классов внутри BPL, что приводит к сообщению об ошибке "Resource not found". В данной статье мы рассмотрим, как можно решить данную проблему, опираясь на реальный пример из практики.

Пример кода, вызывающего ошибку

Рассмотрим типичный случай, когда при попытке создать экземпляр класса внутри BPL возникает ошибка. Пользователь столкнулся с проблемой, используя следующий код:

procedure TControllerMain.Btn1OnClick(Sender: TObject);
type
  TInitProcedure = function: TModuleBaseClass; stdcall;
  TModuleBaseClass = class of TModuleBase;
var
  h: HMODULE;
  proc: TInitProcedure;
  vClass: TModuleBaseClass;
begin
  h := LoadPackage('test.bpl');
  @proc := GetProcAddress(h, 'InitializePlugin');
  vClass := proc();
  vClass.Create(nil); // ошибка здесь
  UnloadPackage(h);
end;

Код DLL:

type
  TVLCVideo = class(TModuleBase)
  private
    // ...
  public
    // ...
  end;
function InitializePlugin: TModuleBaseClass; stdcall;
implementation
function InitializePlugin: TModuleBaseClass;
begin
  Result := TVLCVideo;
end;
exports
  InitializePlugin;
end.

Класс TModuleBase является наследником TCustomPanel. Однако, несмотря на то, что явных операций с ресурсами (файлами RES) не производилось, ошибка все равно возникает.

Комментарий к проблеме

Комментарий от другого пользователя указывает на то, что подобная ошибка может возникать во время потоковой передачи DFM, но только в том случае, если TModuleBase наследуется от TForm, TFrame или TDataModule, а не от TCustomPanel, как в данном случае.

Возможное решение

Проблема заключается в том, что разработчик хочет использовать компоненты в DLL, не создавая при этом ActiveX-компонент. Возникает вопрос: возможно ли возвращать из InitializePlugin() уже созданный объект вместо типа класса? И что показывает стек вызовов при возникновении ошибки?

Подтвержденное решение

Разработчик нашел решение, используя интерфейсы вместо наследования от TCustomPanel. Он удалил класс-предок TModuleBase, заменив его на интерфейс, и все другие плагины также должны использовать этот интерфейс.

PIModuleBase = ^IModulBase;
IModulBase = interface
  // ...
end;

Для примера, в обработчике нажатия кнопки создается менеджер модулей:

procedure TControllerMain.Btn1OnClick(Sender: TObject);
type
  TInitProcedure = function: PIModuleBase; stdcall;
var
  h: HMODULE;
  proc: TInitProcedure;
  vClass: PIModuleBase;
begin
  h := LoadPackage('test.bpl');
  @proc := GetProcAddress(h, 'InitializePlugin');
  vClass := proc();
  vClass^.setParent(form1);
  vClass^.setPosition(0, 0, 100, 100);
  vClass^.play(PChar('url of media'));
  // UnloadPackage(h);
end;

Класс TVLCVideo теперь реализует интерфейс IModulBase:

type
  TVLCVideo = class(TCustomPanel, IModulBase)
  private
    // ...
  public
    // ...
  end;

Функция InitializePlugin возвращает интерфейс:

function InitializePlugin: PIModuleBase; stdcall;
var
  v: TVLCVideo;
begin
  v := TVLCVideo.Create(nil);
  Result := IModuleBase(v);
end;

Важно: файл интерфейса не должен импортироваться непосредственно в файл модуля или основное приложение. Необходимо создать новый проект BPL только для интерфейса и общих библиотек, и добавить его в раздел требуемых компонентов (requires section) модульных пакетов, как это делается с VCL и RTL.

Также необходимо построить основное приложение с использованием пакета интерфейса.

Заключение

При работе с BPL в Delphi 2010 важно помнить о особенностях использования компонентов и объектов, а также о необходимости корректного управления жизненным циклом объектов и взаимодействием между модулями. Использование интерфейсов является одним из эффективных способов решения подобных проблем.

Создано по материалам из источника по ссылке.

В статье рассматривается проблема устранения ошибок при работе с классами в библиотеках пакетов (BPL) в среде разработки Delphi 2010, связанная с созданием объектов внутри этих пакетов и предложено решение с использованием интерфейсов в


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DLL и PlugIns ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 10:46:14/0.0036258697509766/0