C++ 动态链接库最佳实践-如何避免死锁? 出身背景

C++ 动态链接库最佳实践-如何避免死锁? 出身背景,c++,winapi,dllmain,loaderlock,C++,Winapi,Dllmain,Loaderlock,我已经阅读并理解了我能做什么和不能做什么 现在,假设我有一个包含许多项目的VisualStudio2013解决方案。每个项目生成不同的二进制文件/lib文件 假设我有一个实用程序项目,生成一个lib文件,供所有项目使用 现在,这个实用程序项目可能会定义一些调用的通用函数,例如,基于上面链接的函数是:永远不要从DllMain中执行以下任务 问题 我如何实现一个通用函数,知道它不能使用某些API,因为它是在DllMain函数的范围内调用的 是否可以访问windows loader lock并通过它禁

我已经阅读并理解了我能做什么和不能做什么

现在,假设我有一个包含许多项目的VisualStudio2013解决方案。每个项目生成不同的二进制文件/lib文件

假设我有一个实用程序项目,生成一个lib文件,供所有项目使用

现在,这个实用程序项目可能会定义一些调用的通用函数,例如,基于上面链接的函数是:永远不要从DllMain中执行以下任务

问题 我如何实现一个通用函数,知道它不能使用某些API,因为它是在DllMain函数的范围内调用的

是否可以访问windows loader lock并通过它禁用某些调用,或者在函数被锁定时更改其算法

实例 项目效用

项目A

项目B

虽然在项目B中对函数GetUserName的调用非常好,但在项目A中是禁止的

我希望使mu解决方案变得智能,以避免此类情况

理论方法
当然,if IsLoaderLocked不是真正的代码。这只是我想在调用危险API之前评估的一个条件的示例。

我感觉你把事情搞砸了。首先,“实用程序”项目生成lib文件。静态库没有类似于DllMain的东西。此外,DLL中甚至不需要DllMain。这是一件非常特别的事情。请详细解释项目的结构及其组件之间的关系。@MateuszGrzejek我添加了一个示例。可以在DllMain中调用LoadLibrary。只要在DLL初始化的顺序中有一个很好理解的依赖项,就没有问题。LoaderLock的问题是它是隐式持有的,所以如果您也使用自己的锁,这可能会导致死锁。例如,一个典型的错误是在DllMain中创建一个线程并等待它,而该线程调用一些API,这些API也隐式调用LoadLibrary。@valdo上面的示例只是一个示例:。是否可以在DllMain中调用LoadLibrary不是真正的问题。最终,在项目公用事业中发生的一些操作是不允许whiting DllMain的。我正试图防弹我的代码,以防可能出现的死锁。我真的不明白为什么这个问题被标记为太广泛。对于这个一般性问题,必须有一个最佳实践方法。
wstring GetUserName() // just an example!
{
   // do something including LoadLibrary call
}
BOOL WINAPI DllMain(
  _In_  HINSTANCE hinstDLL,
  _In_  DWORD fdwReason,
  _In_  LPVOID lpvReserved
)
{
   // calls Utility - GetUserName()
}
int _tmain(int argc, _TCHAR* argv[])
{
   // calls Utility - GetUserName()
}
wstring GetUserName() // just an example!
{
   if( IsLoaderLocked() )
      // do something excluding LoadLibrary call
   else
      // do something including LoadLibrary call
}