gpt4 book ai didi

delphi - DLL 形式为 MDI 子项

转载 作者:行者123 更新时间:2023-12-03 15:48:50 26 4
gpt4 key购买 nike

我有一个用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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com