1

背景

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

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

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

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

问题

  1. 我如何实现一个通用函数,“知道”它不能使用某些 API,因为它是在DllMain函数范围内被调用的?

  2. 是否可以访问 Windows 加载程序锁定,并在锁定时禁用某些调用或更改函数的算法?

例子

项目实用程序

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 之前评估的条件示例。

4

0 回答 0