DisableThreadLibraryCalls函数

DisableThreadLibraryCalls函数DisableThreadLibraryCalls函数用于使指定DLL的DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知无效,这可减少某些应用程序的工作集空间。原型如下:BOOLWINAPIDisableThreadLibraryCalls(__inHMODULEhModule//Dll的句柄);参数hModule是指定DLL模块的句柄,可以使用Lo…

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;  
    }  

今天的文章DisableThreadLibraryCalls函数分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/24125.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注