来自DLL的Application.handle

时间:2011-06-13 04:00:04

标签: delphi

的Delphi。 如何从DLL学习处理导致此DLL的附录?

这是必要的:知道Handle附录,我希望Dll在创建对话时使用此Handle,因为创建为TOpendialog.Create(nil)的对话有时会出现在基本表单的主窗口下。所以,在DLL中我会做:

application.handle:=GetExeHandle; // GetExeHandle - How to learn?
Opendialog1:=TOpendialog.Create(application);
...

所以这是正确的吗?

2 个答案:

答案 0 :(得分:10)

您的DLL显示对话框的唯一时间是主机应用程序从您的DLL调用函数。包含父窗口句柄作为函数的输入参数之一,以便EXE可以告诉您使用哪个句柄。不要试图自己发现手柄。作为库开发人员,您无法猜测主机应用程序正在做什么。

如果您不想在每个函数调用中包含句柄,则在任何其他函数之前添加DLL用户需要调用的初始化函数。在初始化中传递句柄,然后将其存储在DLL中的变量中,以便其他函数可以在需要时使用该值。

答案 1 :(得分:4)

除非你使用运行时包(而你没有,或者没有使用正确的包),否则你将陷入痛苦的世界。

您的图书馆不仅拥有(T)Application自己的副本,还拥有线程同步队列和事件(以及其他所有内容)。

你想要做的事情看起来似乎有效,但它可能(并且它会)随时中断,因为任何复杂的对话,无论VCL还是WinAPI,它都会自己的消息泵送,这将绕过应用程序的空闲和同步处理,导致重入问题和随机停顿或死锁。

可能尝试通过在初始化(我尝试做)时将应用程序的句柄,事件等复制到DLL的全局变量来处理很多情况,但是(不仅仅是) )如果您在DLL中使用TApplicationTThread之类的内容, 有时会中断。

如果在应用程序和库中使用正确的BPL运行时包,则可以避免这些问题,因为它们将与使用它们的应用程序共享相同的命名空间和全局变量。