delphi - DLL 形式为 MDI 子项

标签 delphi delphi-xe

我有一个用Delphi 5开发的大型MDI应用程序,我需要添加更多新功能,新的表单在Delphi XE的DLL中。

我有一个很好的example由 Raymond Alexander 编写,它在 Delphi 5 上运行得很好,但是在我的项目中尝试遵循他的示例时,Delphi XE 的 DLL 无法正常工作,并且当我将对象“APPLICATION”作为参数传递时,会出现错误"并且 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;

您会注意到,在进行调试时会显示一条消息,以及失败的位置,因为原始代码无法调试以下代码行。

请原谅我的英语。

最佳答案

这种方法行不通。您的应用程序中有两个不同的 VCL 实例,一种来自 exe,另一种来自 DLL。一个 VCL 太多了。

通过思考对象是什么,您可以最容易地理解这一点。对象既是数据又是代码。当您将对象从 exe 传递到 DLL 时,您传递的是数据,但不是代码。 Delphi 对象不是可行的跨语言互操作类型。当您将 D5 TApplication 实例传递给 XE DLL 时,XE 代码会将其解释为 XE TApplication。但事实并非如此。同样的问题也适用于您的 MDI 父级和子级。前者是D5形态,后者是XE形态,交互无法成功。

包通过共享 VCL 的单个实例来解决这个问题,但当然,所有包都是用相同版本的 Delphi 构建的。如果你想使用VCL,那就是一个硬约束。

因此,如果您希望使用 XE 构建某些表单,则需要移植整个应用程序。

关于delphi - DLL 形式为 MDI 子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8004980/

相关文章:

delphi - TListView 组件中的复选框不滚动

delphi - 如何在类中正确实现 Set 作为属性?

delphi - 根据所有行的数据在 cxGrid 中设置样式

Delphi - 在主窗体创建上停止应用程序

Delphi XE - 读取 HTML 对象的样式属性

delphi-从祖先接口(interface)或类实现接口(interface)方法和抽象方法的快捷方式

delphi - 为什么 AnsiSameText 不是 ANSI?

oracle - 带有ADO中ftBCD数据类型参数的oracle中的Number列出现“未指定的错误”(Oracle Provider for OleDB)

windows - 如何防止双击“打开文件”对话框注册对其下方表单的单击?

delphi - 缺少 .bpl 文件