DLL формирует как MDI CHILD - PullRequest
3 голосов
/ 04 ноября 2011

У меня есть большое MDI-приложение, разработанное с Delphi 5, и мне нужно добавить больше новых функций, а новые формы находятся в DLL с Delphi XE.

У меня есть очень хороший пример Раймонд Александер (Raymond Alexander), который прекрасно работает на Delphi 5, но, пытаясь следовать его примеру в моем проекте, DLL с Delphi XE не работает должным образом, и выдает ошибку со стороны, когда я передаю в качестве параметра объект "ПРИЛОЖЕНИЕ ", и DLL-файл не получен правильно.

function Modulo_PPtos_Configuracion(No_Orden : Integer; PathDB : WideString ;        PathDBConfig : WideString ; App : TApplication; Scr : TScreen) : Integer ; StdCall;
begin 
  if not Assigned(DmDatos) then
   Abrir_BasesDeDatos(No_Orden, PathDB, PathDBConfig);

 if not (assigned(frm_Configuracion)) then
  begin
{$IFDEF MDI}
  **Application := App;
SHOWMESSAGE(APPlication.MainForm.Name);
   frm_Configuracion := Tfrm_Configuracion.Create(Application.MainForm);**
{$ENDIF}

{$IFNDEF MDI}
   frm_Configuracion := Tfrm_Configuracion.Create(nil);
{$ENDIF}  
end;

Как вы заметите, при выполнении отладки отображается сообщение и место его сбоя, поскольку исходному не удалось отладить следующую строку кода.

Пожалуйста, извините за мой английский.

Ответы [ 2 ]

6 голосов
/ 04 ноября 2011

Этот подход не может работать. У вас есть два разных экземпляра VCL в вашем приложении, один из exe и один из DLL. Это один VCL слишком много.

Вы можете легко понять это, подумав, что это за объекты. Объекты - это и данные, и код. Когда вы передаете объект из exe в DLL, вы передаете данные, но не код. Объекты Delphi не являются жизнеспособными типами межязыковых взаимодействий. Когда вы передаете свой экземпляр TA5 приложения D5 в свою библиотеку XE, код XE интерпретирует его так, как если бы это было приложение XE TApplication. Но это не так. Та же проблема относится к вашему MDI родителю и детям. Первая - это форма D5, вторая - форма XE, поэтому их взаимодействие не может быть успешным.

Пакеты решают эту проблему путем совместного использования одного экземпляра VCL, но, разумеется, из этого следует, что все пакеты создаются с использованием одной и той же версии Delphi. Если вы хотите использовать VCL, это жесткое ограничение.

Итак, если вы хотите, чтобы некоторые из ваших форм создавались с помощью XE, вам нужно портировать все приложение.

0 голосов
/ 06 ноября 2011

ЕДИНСТВЕННАЯ альтернатива весьма превосходному ответу Дейва - использовать sharemem, но я думаю, что вы все равно столкнетесь с проблемой версии VCL.

...