Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 作为MDI子级的DLL窗体_Delphi_Delphi Xe - Fatal编程技术网

Delphi 作为MDI子级的DLL窗体

Delphi 作为MDI子级的DLL窗体,delphi,delphi-xe,Delphi,Delphi Xe,我有一个用Delphi 5开发的大型MDI应用程序,我需要添加更多的新功能,新表单在Delphi XE的DLL中 我有一个雷蒙德·亚历山大(Raymond Alexander)的非常好的例子,它在Delphi 5上运行得非常好,但是在我的项目中,试图仿效他的例子,Delphi XE的DLL不能正常工作,并且在我将对象“APPLICATION”作为参数传递时给了我一个错误,DLL没有正确接收 function Modulo_PPtos_Configuracion(No_Orden : Intege

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

我有一个雷蒙德·亚历山大(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。那太多了

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

包通过共享一个VCL实例来解决这个问题,当然,这必然导致所有包都是使用相同版本的Delphi构建的。如果要使用VCL,这是一个硬约束


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

Dave非常优秀的答案的唯一替代方法是使用sharemem,但我认为您仍然会遇到VCL版本的问题。

非常感谢您的回答,现在我学到了一些我一无所知的东西,现在我有了另一种开发未来应用程序的方法。很高兴听到这个消息。如果这回答了您的问题,请记住勾选它作为已接受的答案。假设其中一个答案确实回答了这个问题,你也应该这样做。