繁体   English   中英

delphi中的delphi终止化代码

[英]delphi finalizalization code in a DLL

我正在将一些函数移动到共享DLL(我希望将一些函数称为Windows挂钩)。

实际的函数当前是一个unit ,它碰巧有一些initialization和一些finalization代码。

我最初在考虑从一个unit直接转换到一个library 让我感动的initialization中的主要代码beginend. 但后来我意识到我无法移动finalization代码。 我应该创建并注册一个特殊的DLL入口点。

我的问题是。 我可以让unit包含所有功能以及initializationfinalization代码,并创建一个uses该单元的library吗? 它会被称为finalization吗?

当DLL首次加载到进程时,DLL中单元的初始化部分中的代码将运行。 从进程卸载DLL时,将触发终结部分。

Eugene是正确的,你可以使用DLLProc进行更细粒度的控制,但这通常只需要每线程资源,例如线程本地存储。

我想指出,在DLLMain期间可以做什么有严重的限制,这最终是这些初始化/完成部分在库内部时发生的。 MSDN文档基本上说你可以做一些事情,但是没有可接受的行为列表。 它最接近的是说你可以在kernel32中调用函数。 否则,所有赌注都已关闭!

网上有很多文章描述了这个问题,但除了我上面链接的DLLMain的MSDN主题之外,我建议阅读微软创建DLL最佳实践

MSDN提供的有用建议是,库可以强制其用户在使用DLL之前调用初始化函数。 完成DLL后,将调用相应的终结函数。 comctl32.dll的使用采用了这个习惯用法,参见InitCommonControlsEx

在我自己的代码中,我更喜欢另一种方法。 我所有单元的初始化部分都注册了初始化和终结方法。 然后,在第一次调用我的库中的任何导出函数时,初始化方法按照它们的注册顺序运行。 这对我来说不是一个问题,因为我已经控制了我的库的所有进入/退出点。

我意识到这比你要求的要多,但你可能会发现避免一些相当难以调试的问题会很有帮助。

如果一个程序是一个程序,那么将调用一个单元的初始化。

最终确定相同。

所以,是的,你可以保持单位不变并导出所需的功能。

这也发生在我身上。 我发现我有一个单元,初始化部分创建一个线程或做一些东西,当dll注册。

我删除了这个初始化部分,它工作正常。

由于.exe应用程序需要初始化,但dll应用程序不需要初始化,因此系统实用程序中有一个变量标志,名为ModuleIsLib,只需执行以下操作:

initialization

if not ModuleIsLib then
 begin
// initialization stuff for .exe file
 end;

这也可以用于最终确定部分。

希望它帮助..!

我建议您通过为每种情况调用专用过程/函数来实现DLLMain并处理不同的情况(进程附加,线程附加等)。 然后,如果需要从DLL切换到单元,则可以从初始化和最终化调用所需的过程/函数。 原因是当DLL与线程连接/分离时,您可能需要一些细粒度控制(当您设置系统范围的钩子时会发生这种情况)。

暂无
暂无

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

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