DisableThreadLibraryCalls函数用于使指定DLL的DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知无效,这可减少某些应用程序的工作集空间。原型如下:
BOOL WINAPI DisableThreadLibraryCalls(
__in HMODULE hModule//Dll的句柄
);
参数hModule是指定DLL模块的句柄,可以使用LoadLibrary()、LoadLibraryEx()或GetModuleHandle()函数获得该句柄。当然在DLL中,我们不能调用GetModuleHandle(NULL)来获取DLL模块的句柄,因为这样获得的是当前使用该DLL的可执行程序映像的基地址,而不是DLL映像的。
函数调用成功时返回非零值。当指定的DLL模块拥有活动的静态线程局部存储或者hModule参数无效时,函数调用失败。
对于一个拥有很多DLL的多线程应用程序而已,如果这些DLL频繁地创建和销毁线程,而且这些DLL不需要线程创建和销毁通知,则在DLL中使用DisableThreadLibraryCalls函数将能够起到优化应用程序的作用,远程过程调用RPC服务器就是这样的例子。在这类应用程序中,如果不使用该函数,DLL初始化例程将驻留在内存中以响应DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知。因此,使这两个通知无效,则DLL初始化代码就不会因为线程的创建和销毁而驻留在物理内存中了,这就减少了应用程序工作代码集的大小。一般实现这个优化就是在DLL的DLL_PROCESS_ATTACH代码响应中添加DisableThreadLibraryCalls函数。
有一点需要注意的是,对于静态链接到C运行时库(CRT)的DLL我们不应该使用该函数,因为CRT需要DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知才能正确地运行。
下面是代码示例:(摘自金山卫士开源作品之ARP防火墙)
HINSTANCE g_hModule = NULL;
//
BOOL WINAPI DllMain(
__in HANDLE hInstance,
__in DWORD dwReason,
__in_opt LPVOID lpReserved
)
{
UNREFERENCED_PARAMETER(lpReserved);
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls((HMODULE)hInstance);
g_hModule = (HINSTANCE)hInstance;
break;
case DLL_PROCESS_DETACH:
break;
default:
break;
}
return TRUE;
}
今天的文章DisableThreadLibraryCalls函数分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/24125.html