gpt4 book ai didi

Delphi DLL 中的最终化代码

转载 作者:行者123 更新时间:2023-12-03 15:05:50 25 4
gpt4 key购买 nike

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

实际函数当前位于一个单元中,并且它恰好有一些初始化和一些最终化代码。

我最初考虑从单元直接转换为。因此,我将初始化代码移到了主beginend.之间。但后来我意识到我没有地方可以移动最终化代码。我应该创建并注册一个特殊的 DLL 入口点。

我的问题是。我可以将 unit 保留为所有函数以及 initializationfinalization 代码,而只创建一个 library stub 吗? 使用单位?会调用finalization吗?

最佳答案

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

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

我想指出,DLLMain期间可以做的事情存在严重限制。这最终是这些初始化/终结部分在库内部产生的地方。 MSDN 文档基本上说您可以做一些事情,但没有可接受的行为列表。最接近的说法是可以调用 kernel32 中的函数。否则,一切皆废!

网络上有很多文章描述了这个问题,但除了我上面链接的 DLLMain 的 MSDN 主题之外,我建议阅读 Microsoft 的 Best Practices for Creating DLLs .

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

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

我意识到这超出了您的要求,但您可能会发现它有助于避免一些相当难以调试的问题。

关于Delphi DLL 中的最终化代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4661015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com