Flash ActionScript (21)一个简单实用的loading代码
2012-03-16 14:52
337 查看
DisableThreadLibraryCalls函数用于使指定DLL的
DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知无效,这可减少某些应用程序的工作集空间。原型如下:
BOOL WINAPI DisableThreadLibraryCalls(
__inHMODULE hModule
);
参数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;
}
DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知无效,这可减少某些应用程序的工作集空间。原型如下:
BOOL WINAPI DisableThreadLibraryCalls(
__inHMODULE hModule
);
参数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;
}
相关文章推荐
- Flash ActionScript3代码制作文字渐变+描边
- 转 一个简单实用的 生成验证码的 代码
- 一个简单的载入图片等待状态的Loading代码
- Flash ActionScript JSON 的一个源代码
- Flash ActionScript 3--在线视频播放器简单实现
- 释Flash ActionScript代码优化原则
- 一个简单实用的css loading图标
- 基础学习笔记之opencv(21):一个简单有趣的皮肤检测代码
- 用flash actionscript 编写代码实现连连看游戏
- 一个简单实用的模拟选项夹的代码
- 一个简单的JS小日历代码
- flash actionscript 3.0 动画教程:函数之形式参数和实际参数
- jquery中模拟tabs效果易会代码(简单实用)
- 示例 - 17行代码实现一个简单高效的多线程蜘蛛程序
- 代码:编写一个简单的字符设备驱动
- 【ORACLE】一个简单实用的对数据进行行列转换并统计的SQL语句
- WF4.0入门系列2——用代码创建一个简单的工作流
- 导入Flex/Flash项目后的一个简单错误:无法创建 HTML 包装器
- 一个VC写的完整、简单的Sniffer代码
- 一个非常简单的Oracle存储过程,及其在C#.net中的执行的代码