如何解决来自DLL的Application.handle
| 德尔福 如何从DLL学习处理导致此DLL的附录? 这是必须的:了解Handle附录后,我希望在Dll中使用该Handle来创建对话框,因为创建为TOpendialog.Create(nil)的对话框有时会出现在基本表单的主窗口下。因此,在DLL中,我将执行以下操作:application.handle:=GetExeHandle; // GetExeHandle - How to learn?
Opendialog1:=TOpendialog.Create(application);
...
这样对吗?
解决方法
DLL仅在主机应用程序从DLL调用函数时显示对话框。包括父窗口句柄作为函数的输入参数之一,以便EXE可以告诉您使用哪个句柄。不要试图自己发现手柄。作为库开发人员,您无法猜测主机应用程序在做什么。
如果不想在每个函数调用中都包含该句柄,则添加一个初始化函数,DLL的用户需要在其他函数之前调用它。在初始化中传递句柄,然后将其存储在DLL中的变量中,以便其他函数在需要时可以使用该值。
, 除非您使用运行时程序包(无论您是否使用正确的程序包),否则您将痛苦不堪。
您的库不仅具有ѭ1的副本,而且还具有线程同步队列和事件(以及所有其他内容)的副本。
您尝试执行的操作似乎可以正常运行,但是它可能(并且会随时中断)导致任何复杂的对话框,无论VCL或WinAPI是否执行自己的消息泵送,这都会绕过应用程序的空闲和同步处理,导致重新进入问题以及随机的停顿或死锁。
您可以尝试通过在初始化时将应用程序的句柄,事件等复制到DLL的全局变量中来处理很多情况(我尝试这样做),但是(不仅如此)如果您使用任何方法像DLL中的
TApplication
或TThread
,有时会损坏。
如果在应用程序和库中使用正确的BPL运行时包,则可以避免这些问题,因为它们将与使用它们的应用程序共享相同的名称空间和全局名称。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。