DisableThreadLibraryCalls函数

版权声明:本文为博主原创文章,允许转载,转载请注明出处。 https://blog.csdn.net/KnightOnHourse/article/details/79973065

DisableThreadLibraryCalls函数用于使指定DLL的DLL_THREAD_ATTACHDLL_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;  
    }  

阅读更多

没有更多推荐了,返回首页