[英]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 的全局变量来处理很多情况(我尝试这样做),但(不仅)如果您使用TApplication
或TThread
的东西DLL,它有时会破裂。
如果您在应用程序和库中使用正确的 BPL 运行时包,则可以避免这些问题,因为它们将与使用它们的应用程序共享相同的命名空间和全局变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.