动态链接库最佳实践 - 如何避免死锁?

时间:2015-04-05 14:23:10

标签: c++ winapi dllmain loaderlock

背景

我已阅读Dynamic-Link Library Best Practices并了解我在DllMain能做什么,不能做什么。

现在,我说有一个包含许多项目的visual studio 2013解决方案。每个项目都会生成不同的二进制文件/ lib文件。

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

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

问题

  1. 如何实现通用功能,"知道"它不能使用某些API,因为它的调用范围为DllMain函数?

  2. 是否可以访问Windows加载程序锁定并禁用某些调用或更改函数的算法(如果已锁定)?

  3. 实施例

    项目实用程序

    wstring GetUserName() // just an example!
    {
       // do something including LoadLibrary call
    }
    

    项目A

    BOOL WINAPI DllMain(
      _In_  HINSTANCE hinstDLL,
      _In_  DWORD fdwReason,
      _In_  LPVOID lpvReserved
    )
    {
       // calls Utility - GetUserName()
    }
    

    项目B

    int _tmain(int argc, _TCHAR* argv[])
    {
       // calls Utility - GetUserName()
    }
    

    虽然GetUserName()对函数Project B的调用完全正常,但在Project A

    中禁止使用

    我想以这样的方式使mu解决方案变得聪明,以避免这种情况。

    理论方法

    wstring GetUserName() // just an example!
    {
       if( IsLoaderLocked() )
          // do something excluding LoadLibrary call
       else
          // do something including LoadLibrary call
    }
    

    if( IsLoaderLocked() )当然不是真正的代码。只是一个例子,我想在调用之前评估一下这个问题"危险" API。

0 个答案:

没有答案