【问题标题】:Usage limitations during the DllMain Attach and Detach processDllMain 附加和分离过程中的使用限制
【发布时间】:2011-08-15 14:59:59
【问题描述】:

我的一位同事在 DllMain Detach 过程中遇到了麻烦。他的错误似乎并非在所有情况下都出现,但相当频繁。

在尝试帮助他的过程中,我有点记得 DllMain 附加和分离过程中的一些使用限制,但我不确定我是否记得很好,因为这是 2 年前的技术讨论不是我在处理那些终止问题。

也就是说,我有点记得我们应该:

  • 避免使用 new 和 delete 运算符,而更喜欢 HGLOBAL 内存分配
  • 避免在此处处理线程终止。

如果我错了,你能纠正我吗,如果有的话,请解释我,或者指出一篇可以处理这些问题的技术文章。

【问题讨论】:

  • 总结:不要在 DllMain 中放置任何涉及任何 DLL 的内容,包括 Windows DLL。乍一看 Kernel32.dll 是安全的,但深入检查后,即使它的调用也不能保证是安全的。
  • HGLOBAL/HLOCAL 无关紧要。微软甚至这么说(备注下):msdn.microsoft.com/en-us/library/windows/desktop/…——“因此,GlobalAlloc 和 LocalAlloc 函数本质上是相同的。”

标签: c++ winapi dll mfc


【解决方案1】:

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 p.s.甚至一些邪恶的人对链接投反对票
【解决方案2】:

大多数问题是由于加载程序锁的冲突引起的。 DllMain 不应该长时间运行,或者如果可以避免使用锁。

背景不错here

【讨论】:

    【解决方案3】:

    查找包含主题的文档

    [1]“Dll 主入口点”

    [2]“延迟加载 DLL 的约束”

    [3]“动态链接库最佳实践”

    [4] Jefrey Richter,Windows 通过 C++,第 20 章。

    (抱歉,由于 stackoverflow 政策,我无法提供 URL 引用)

    总结

    1. 也许其他 DllMain 已经被执行,也许没有。不要调用其他 DLL 的函数

    2. 不要调用以下内容: "FreeLibrary/LoadLibrary/CreateProcess/ExitThread/GetStringType"

    3. 不要从 User32.dll、Gdi32.dll 调用函数

    4. 如果 CRT 未初始化,请不要使用其中的内存管理功能 (我的观点仅限于初始化阶段)

    5. 您应该从文档中了解您在哪个线程上下文中。

    6. 执行以下操作是合法的: 创建和初始化同步对象。打开、读取和写入文件。

    【讨论】:

    • 您是什么意思,由于 stackoverflow 政策,您不能提供 URL 参考?我想我从来没有在 SO 网站上读过这样的评论?!
    • 我因此被禁止了 3 次,很多反对的人都跟我说了。我记得他们没有提供任何参考。
    • 我在这里也找不到任何限制 (stackoverflow.com/help/answering),但在某处它是描述随着时间的推移链接往往会中断的文本。例如。在本文中:blogs.msdn.microsoft.com/oldnewthing/20040127-00/?p=40873 前两个链接已损坏。
    • 好的,我明白了。事实上,我们应该避免仅链接的答案。因为随着时间的推移,链接往往会被破坏。但是在这种情况下,您对链接的内容进行了一点总结,因此可以。解释越长越好:-)。在这种情况下,虽然简短,但对链接的内容进行了一些总结,所以对我来说没问题,我认为对站点的其他成员来说也可以。请编辑您的答案并插入链接:它们确实增加了价值。当它们被破坏时,您的摘要仍然会在这里。您也可以先倒置摘要,然后引导我们找到相关链接。
    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    相关资源
    最近更新 更多