加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi中的delphi终止化代码

发布时间:2020-12-15 04:11:19 所属栏目:大数据 来源:网络整理
导读:我正在将一些函数移动到共享DLL(我希望将一些函数称为 Windows挂钩). 实际的函数当前是一个单元,它碰巧有一些初始化和一些终结代码. 我最初在考虑从一个单元直接转换到一个库.所以我将初始化代码移到了主要的开始和结束之间.但后来我意识到我没有地方可以移
我正在将一些函数移动到共享DLL(我希望将一些函数称为 Windows挂钩).

实际的函数当前是一个单元,它碰巧有一些初始化和一些终结代码.

我最初在考虑从一个单元直接转换到一个库.所以我将初始化代码移到了主要的开始和结束之间.但后来我意识到我没有地方可以移动终结代码.我应该创建并注册一个特殊的DLL入口点.

我的问题是.我可以让单元包含所有功能以及初始化和终结代码,并创建一个使用该单元的库存根吗?最终会被调用吗?

解决方法

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

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

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

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读