繁体   English   中英

来自 DLL 的 Application.handle

[英]Application.handle from DLL

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

这是必要的:了解句柄附录,我希望在 Dll 中在创建对话时使用此句柄,因为创建为 TOpendialog.Create(nil) 的对话有时会出现在基本形式的主要 window 下。 所以,在 DLL 我会做:

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

所以它是正确的吗?

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

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

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

您的库将拥有自己的(T)Application副本,以及线程同步队列和事件(以及其他所有内容)的副本。

您尝试执行的操作似乎可行,但它可能(并且会)随时中断导致任何复杂的对话,无论 VCL 还是 WinAPI 是否执行其自己的消息泵送,这将绕过应用程序的空闲和同步处理,导致重入问题和随机停顿或死锁。

可以尝试通过在其初始化时将应用程序的句柄、事件等复制到 DLL 的全局变量来处理很多情况(我尝试这样做),但(不仅)如果您使用TApplicationTThread的东西DLL,它有时破裂。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM