2011-11-04 69 views
3

我有一个用Delphi 5开发的大型MDI应用程序,我需要添加更多新功能,并且新窗体与Delphi XE一起在DLL中。DLL格式作为MDI CHILD

我有一个很好的example由雷蒙德亚历山大,其中伟大的德尔福5,但在试图按照他的例子在我的项目中,德尔福XE的DLL不能正常工作,并给了我一部分的错误当我作为参数传递对象“应用程序”和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; 

因为这样做调试的时候,你会发现显示一条消息,并在它失败了,因为原来没有调试的代码下面一行。

请原谅我的英文。

回答

6

此方法无法正常工作。你的应用程序中有两个不同的VCL实例,一个来自exe,一个来自DLL。这是一个VCL太多。

您可以通过考虑对象是什么来最容易地理解这一点。对象既是数据又是代码。当你将一个对象从exe传递给DLL时,你传递的是数据,而不是代码。 Delphi对象不是可行的跨语言互操作类型。当您将D5 TApplication实例传递给您的XE DLL时,XE代码将它解释为XE TApplication。但事实并非如此。同样的问题适用于您的MDI父母和子女。前者是D5形式,后者是XE形式,所以他们的互动无法成功。

软件包通过共享VCL的单个实例解决了这个问题,但是当然这也是所有软件包都使用相同版本的Delphi构建的必然结果。如果你想使用VCL,那是一个很难的约束。

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

+0

非常感谢您的回答,现在我学到的东西我什么也不知道,现在我有另一种方法来开发未来的应用程序。 –

+0

好听。如果这回答你的问题,那么请记住按照接受的答案打勾。你应该对你的[上一个问题](http://stackoverflow.com/questions/7960853/passing-parameters-from-delphi-5-to-delphi-dll-xe)做同样的事情,假设其中一个答案确实回答问题。 –

0

Dave的唯一替代方案就是使用sharemem,但我认为你仍然会遇到VCL版本问题。