我有一个用Delphi 5开发的大型MDI应用程序,我需要添加更多新功能,并且新的表单在Delphi XE的DLL中。
Raymond Alexander有一个非常好的example,它在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;
正如您将注意到,在进行调试时会显示一条消息,并显示消息失败的原因,因为原始代码无法调试以下代码行。
请原谅我的英语。
答案 0 :(得分:6)
这种方法无法奏效。您的应用程序中有两个不同的VCL实例,一个来自exe,另一个来自DLL。这是VCL太多了。
通过思考什么是对象,你可以很容易地理解这一点。对象既是数据又是代码。将对象从exe传递给DLL时,您传递的是数据,而不是代码。 Delphi对象不是可行的跨语言互操作类型。当您将D5 TApplication实例传递给XE DLL时,XE代码会将其解释为XE TApplication。但事实并非如此。同样的问题适用于您的MDI父母和孩子。前者是D5形式,后者是XE形式,因此它们的相互作用不能成功。
包通过共享VCL的单个实例来解决这个问题,但当然这有一个必然结果,所有包都使用相同版本的Delphi构建。如果你想使用VCL,这是一个硬约束。
因此,如果您想要使用XE构建一些表单,则需要移植整个应用程序。
答案 1 :(得分:0)
Dave非常出色的答案的唯一替代方法是使用sharemem,但我认为你仍会遇到VCL版本的问题。