我在几个来源中看到,CreateProcess不能从DllMain函数中调用。
CreateProcess
不要从CreateProcess函数调用DllMain。这将导致应用程序停止响应。
动态链接库最佳实践
您不应该在DllMain中执行以下任务:调用CreateProcess。创建进程可以加载另一个DLL。
问题
为什么会这样呢?它指出,它导致应用程序停止响应,但这只是一种症状。真正的原因是什么?
我问这个问题的原因是,我尝试从一个DllMain函数创建一个进程,它可以很好地工作。
发布于 2014-11-05 10:09:17
DllMain在加载程序锁保持时执行。正如您引用的文档所解释的那样,CreateProcess可能导致载入DLL。这会导致装载机锁上的死锁。死锁之所以发生,是因为加载程序锁已经被持有。
文件很清楚。不要从DllMain打电话给DllMain。从DllMain中完成任务的标准方法是创建一个线程来完成这项工作。尽管您不能等待该线程,因为这将导致完全相同的死锁。
发布于 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调用,并在以后创建进程。
https://stackoverflow.com/questions/26754014
复制相似问题