背景
我已阅读Dynamic-Link Library Best Practices并了解在DllMain中我能做什么和不能做什么。
现在,假设我有一个包含许多项目的 Visual Studio 2013 解决方案。每个项目生成不同的二进制文件/lib 文件。
假设我有一些实用程序项目,生成一个所有项目都使用的 lib 文件。
现在,这个实用程序项目可能会定义一些调用的通用函数,例如,基于上面链接的LoadLibrary 函数是这样的:永远不要从 DllMain 中执行以下任务
问题
我如何实现一个通用函数,“知道”它不能使用某些 API,因为它是在
DllMain
函数范围内被调用的?是否可以访问 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 之前评估的条件示例。