德尔福:如何获取Application.MainForm,如果应用程序是零(在DLL中)

问题描述:

我需要的应用程序的主要形式执行ClientToParent()和不成功,因为我在一个DLL和应用程序变量为零。我感谢任何人的帮助。德尔福:如何获取Application.MainForm,如果应用程序是零(在DLL中)

+0

您是否试图访问调用进程的应用程序主窗体?或者你有一个DLL里面的表单? DLL不知道它的调用过程,它甚至不知道它的编程语言,更不用说它是什么类型的应用程序。 – 2015-02-09 23:22:44

+0

@Jerry DLL没有“调用过程”。它们被加载到一个进程中。 DLL确实知道它所在的进程。 – 2015-02-09 23:24:35

+0

@David我的观点是DLL没有关于对象结构等方面的知识.DLL甚至不知道它的宿主进程是VCL,FMX还是.NET/C# 。并不是说它不可能检测到它,但这只是DLL的本质,它们不应该知道这些类型的东西(除非开发者有这个目标)。 – 2015-02-09 23:26:13

您无法对跨模块边界的表单参考执行任何操作。即使假定它是Delphi应用程序,宿主应用程序也具有不同的VCL实例。所以你不能在DLL中使用应用程序中的TForm实例。如果你使用软件包,你可以这样做。

您也许可以列举顶级窗口并在您的过程中找到它。这可以工作,但很混乱。

更好的办法是公开功能以允许主机提供这样的服务。当主机加载你的DLL时,它将提供一个提供必要服务的接口。它可以根据需要转换坐标,并可能提供其他服务。

我会询问的一件事是,你打算打电话ClientToParent。这表明你在不同模块中的控件之间有客户/父母关系。这只有在使用软件包时才可行。我想知道您是否完全意识到跨模块使用VCL的限制。