首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能从CreateProcess函数调用DllMain?

为什么不能从CreateProcess函数调用DllMain?
EN

Stack Overflow用户
提问于 2014-11-05 09:50:36
回答 2查看 1.6K关注 0票数 2

我在几个来源中看到,CreateProcess不能从DllMain函数中调用。

CreateProcess

不要从CreateProcess函数调用DllMain。这将导致应用程序停止响应。

动态链接库最佳实践

您不应该在DllMain中执行以下任务:调用CreateProcess。创建进程可以加载另一个DLL。

问题

为什么会这样呢?它指出,它导致应用程序停止响应,但这只是一种症状。真正的原因是什么?

我问这个问题的原因是,我尝试从一个DllMain函数创建一个进程,它可以很好地工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-05 10:09:17

DllMain在加载程序锁保持时执行。正如您引用的文档所解释的那样,CreateProcess可能导致载入DLL。这会导致装载机锁上的死锁。死锁之所以发生,是因为加载程序锁已经被持有。

文件很清楚。不要从DllMain打电话给DllMain。从DllMain中完成任务的标准方法是创建一个线程来完成这项工作。尽管您不能等待该线程,因为这将导致完全相同的死锁。

票数 5
EN

Stack Overflow用户

发布于 2014-11-05 10:10:16

MSDN 他说

因此,入口点函数可以调用Kernel32.dll中不加载其他DLL的函数。..。不幸的是,Kernel32.dll中没有一个完整的安全函数列表。

然后扩展声明,解释更复杂的API (包括CreateProcess)可能涉及usafe调用:

调用需要Kernel32.dll以外的DLL的函数可能会导致难以诊断的问题。例如,调用User、Shell和COM函数可能导致访问冲突错误,因为某些函数加载其他系统组件。相反,在终止期间调用这些函数可能会导致访问冲突错误,因为相应的组件可能已经卸载或未初始化。

这就是最佳实践建议不要调用CreateProcess的原因。您无法控制CreateProcess是否会加载其他DLL。在您的控件中,是为了避免不安全的API调用,并在以后创建进程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26754014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档