首页
社区
课程
招聘
[原创]关于WinAPIEx项目通用算法库设计方案:整合C++ STL vector容器
发表于: 2007-7-13 01:18 11401

[原创]关于WinAPIEx项目通用算法库设计方案:整合C++ STL vector容器

2007-7-13 01:18
11401
作者序: WinAPIEx历时了1个多月的开发,利用业余时间来把这5年来职业软件研发工作上一些常用的稳定的功能进行接口化,终于在今天2007-07-14日发布了第一个正式版,也算是为本人从事软件研发的一个交代。在此感谢对本项目支持的众多热心网友,也感谢DCG组织朋友的支持和建议,也感谢提供源码的网友nevergone。现在正式版出来了,并不意味着我会停止开发,本人会融合更多实用和强大的接口,WinAPIEx项目将长期进行。

WinAPIEX下阶段功能: 通用算法整合 [动态数组 队列 链表 二叉平衡搜索树],这些算法一切基于STL标准算法容器库 和 BOOST容器库 来进行封装 ,这些通用算法可以支持千百万级别的数据查询 排序 搜索 。目的就是想弥补 VB DELPHI WIN32ASM 的通用算法库的不足

    鉴于Windows的WIN32 API使用的复杂性和无法完整特殊需求的功能性,想自己开发一套Windows实用通用的接口库[方式: 封装 或 全写]。小软件的开发无非就是大量API的调用,特殊软件除外。

项目: Windwos实用通用接口库[WinAPIEx]
项目组织人: 猪头三
项目参与者: 80x86汇编小站休闲群 DCG组织
项目性质: 免费/收费
源码性质: 开源/闭源/授权
开发语言: C/C++
开发工具: VC++ 2005
提交性质: 如其他语言请提交lib文件给我进行整合
范围: 磁盘操作类 文件操作类 进程操作类
面向用户: 个体程序员  散户程序员
面向工程: 小型Windows桌面小软件
调用支持: VC DELPHI __STDCALL

贡献源码者:
猪头三 nevergone

下载地址:
2007-07-14-V0004 Release发行版
http://www.x86asm.com/download/winapiex/WinAPIExV0004Release.rar

关于WinAPIEx项目通用算法库设计方案:整合C++ STL vector容器

该算法库的设计难点在于 如何维护和确定用户使用的每个算法容器。这个问题我思考几天,灵感来源于Windows操作系统的HANDLE表。
因此在维护每个用户使用的算法容器,也采用了HANDLE表的原理。用户每使用一个算法容器,就必须为这个算法容器建立一个HANDLE。
然后必须由一个全局的HANDLE表来维护多个算法容器。

下面实现步骤:

1> 建立一个全局HANDLE表
我采用了C++ STL 高效率的MAP容器
声明: std::map<ULONG, STRUCT_CONTAINER_OBJECT> g_ContainerObjectList ;
那么map容器的第一个参数就是算法容器的HANDLE, 第二个参数是算法容器类型

2> 声明一个算法容器类型识别结构

// 目前我们先简单的使用STL的动态数组vector

typedef struct _CONTAINER_OBJECT 
{
	std::vector<ULONGLONG> *pvector_UnsignPoint ; 	// 无符号动态数组
	
	std::vector<LONGLONG> *pvector_signPoint ;		// 有符号动态数组

}STRUCT_CONTAINER_OBJECT, *PSTRUCT_CONTAINER_OBJECT ;


3> 为每个算法容器创建一个HANDLE
说明: 为了保证唯一 和 简单性,采用了随机数方式
ULONG
Container_CreateGUI(VOID)
{
	srand((unsigned)time(NULL)) ;

	return rand() ;

}// End Container_CreateGUI()


4> 为了防止算法容器HANDLE的重复性,必须有个校验功能
BOOL
Container_CheckGUI(ULONG ulong_param_GUI)
{
	// 在全局HANDLE表中查找是否有相同的HANDLE
	if (g_ContainerObjectList.find(ulong_param_GUI) !=
		g_ContainerObjectList.end())
	{
		return TRUE ;	// 有重复的HANDLE
	}

	return FALSE ;	// 无重复的HANDLE

}// End Container_CheckGUI()


5> 有了上面的基本模块,下面可以做一个导出接口了,供用户使用C++ STL的vector动态数组
ULONG
E_vector_Unsign_Create(VOID)
{
	STRUCT_CONTAINER_OBJECT struct_VectorOBjcet ;

	ULONG ulong_Object = 0 ;

	SecureZeroMemory(&struct_VectorOBjcet, sizeof(STRUCT_CONTAINER_OBJECT)) ;
	
	// 为用户建立C++ STL的vector动态数组
	std::vector<ULONGLONG> *pvector_Object = new std::vector<ULONGLONG> ;
	
	// 保存VECTOR容器指针
	struct_VectorOBjcet.pvector_UnsignPoint = pvector_Object ;

	// 校验容器HANDLE是否重复,如果重复则继续创建
	do 
	{
		ulong_Object = Container_CreateGUI() ;

	} while(Container_CheckGUI(ulong_Object));

	// 插入全局HANDLE表
	if (g_ContainerObjectList.insert(std::make_pair(ulong_Object,
									struct_VectorOBjcet)).second)
	{

	}
	else
		return -1 ;	// 插入失败

	return ulong_Object ;	// 返回用户的算法容器HANDLE

}// End vector_Unsign_Create()


好,下面我们验证一下思路:

int main()
{
	for (ULONG ulong_Count = 0 ;
			ulong_Count < 20 ;
			ulong_Count++)
		{
			E_vector_Unsign_Create() ;	// 创建20个算法容器
		}

		// 打印20个算法容器的信息
		std::map<ULONG, STRUCT_CONTAINER_OBJECT>::iterator map_Next ;
		for (map_Next = g_ContainerObjectList.begin() ;
			map_Next != g_ContainerObjectList.end() ;
			map_Next++)
		{
			printf("vector Handle: %d  vector Point: %p \n",
				  map_Next->first,
				  ((STRUCT_CONTAINER_OBJECT)map_Next->second).pvector_UnsignPoint) ;
				  
			// 释放用户算法容器
			delete ((STRUCT_CONTAINER_OBJECT)map_Next->second).pvector_UnsignPoint ; 
		}
}

运行效果:

vector Handle: 12081  vector Point: 00CB2970
vector Handle: 12084  vector Point: 00CB2A18
vector Handle: 12087  vector Point: 00CB2AC0
vector Handle: 12091  vector Point: 00CB2B68
vector Handle: 12094  vector Point: 00CB2C10
vector Handle: 12097  vector Point: 00CB2CB8
vector Handle: 12100  vector Point: 00CB2D60
vector Handle: 12104  vector Point: 00CB2E08
vector Handle: 12107  vector Point: 00CB2EB0
vector Handle: 12110  vector Point: 00CB2F58
vector Handle: 12114  vector Point: 00CB3000
vector Handle: 12117  vector Point: 00CB30A8
vector Handle: 12120  vector Point: 00CB3150
vector Handle: 12123  vector Point: 00CB31F8
vector Handle: 12127  vector Point: 00CB32A0
vector Handle: 12130  vector Point: 00CB3348
vector Handle: 12133  vector Point: 00CB33F0
vector Handle: 12136  vector Point: 00CB6C10
vector Handle: 12140  vector Point: 00CB6CB8
vector Handle: 12143  vector Point: 00CB6D60
                                                       

[DISK][整合]
E_Disk_IsDynamicDisk                                [作者: 猪头三 性质: 闭源 修改时间: 2007-06-18 功能: 判断物理磁盘是否是动态磁盘]
E_Disk_ReadData                                                [作者 :猪头三 性质: 授权 修改时间: 2007-06-18 功能: 读取物理磁盘数据]                               
E_Disk_WriteData                                        [作者 :猪头三 性质: 授权 修改时间: 2007-06-18 功能: 写入物理磁盘数据]                               
E_Disk_GetDiskGeometry                                [作者: 猪头三 性质: 授权 修改时间: 2007-06-18 功能: 获取物理磁盘基本信息参数]                                               
E_Disk_GetPartitionType                                [作者: 猪头三 性质: 授权 修改时间: 2007-06-18 功能: 获取指定分区类型]
E_Disk_GetDiskNumberByFilePath                [作者: 猪头三 性质: 授权 修改时间: 2007-06-19 功能: 获取指定分区所在的磁盘]
E_Disk_GetPartitionInfoByFilePath        [作者: 猪头三 性质: 授权 修改时间: 2007-06-19 功能: 获取指定分区基本信息]
E_Disk_GetPartitionSpace                        [作者: 猪头三 性质: 授权 修改时间: 2007-06-19 功能: 获取指定分区实际空闲容量和实际总容量]
E_Disk_GetDiskNumber                                [作者: 猪头三 性质: 授权 修改时间: 2007-06-21 功能: 获取物理磁盘数量]
E_Disk_FormatPartition                                [作者: 猪头三 性质: 授权 修改时间: 2007-06-22 功能: 格式化指定分区]

[PROCESS][整合]
E_Pro_RaiseDebugPrivilege                        [作者: nevergone 性质: 授权 修改时间: 2007-06-24 功能: 提升进程访问权限[DEBUG权限]]
E_Pro_KillProcessByPid                                [作者: nevergone 性质: 授权 修改时间: 2007-06-24 功能: 通过进程ID结束进程[函数内已提权]]
E_Pro_KillProcessByName                                [作者: nevergone 性质: 授权 修改时间: 2007-06-24 功能: 通过进程名结束进程[函数内已提权]]
E_Pro_InjectDll                                                [作者: 猪头三 性质:授权 修改时间: 2007-06-26 功能: 远程注入DLL]
E_Pro_FreeInjectDll                                        [作者: 猪头三 性质:授权 修改时间: 2007-06-30 功能: 远程释放注入DLL[也可以释放远进程目标DLL[已提权 WIN32 API极限]]

[FILE][整合]
E_File_SHCopyAllFile                                [作者: 猪头三 性质: 受权 修改时间: 2007-07-07 功能: 多文件复制到目标文件夹]
E_File_SHDeleteAllFile                                [作者: 猪头三 性质: 受权 修改时间: 2007-07-10 功能: 删除指定目录下的所有文件包括子目录]
E_File_DeleteDestroyFile                        [作者: 猪头三 性质: 闭源 修改时间: 2007-07-13 功能: 删除文件并粉碎数据]
E_File_SHCreateBigFile                                [作者: 猪头三 性质: 授权 修改时间: 2007-07-14 功能: 创建特大型空文件]

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
2
沙发~~~~~~`
支持猪兄!~~`````````
2007-7-13 02:01
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
3
你把源开在这边,给你加个精
2007-7-13 08:36
0
雪    币: 250
活跃值: (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
了不起的猪头三创造,全面开发,就这一个.
2007-7-13 10:56
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
哈哈
可惜我自己贡献的接口太小了.
2007-7-13 17:59
0
雪    币: 168
活跃值: (233)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
呵呵,你也来了?
没事,等你有时间了,写个更加牛的。 最重要的是创新~~~
给用户用得方便~~~
2007-7-13 18:10
0
雪    币: 207
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
猪三啊,你这个发开了那么久,现在才发上来啊,呵呵,
2007-7-13 18:15
0
雪    币: 168
活跃值: (233)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
8
工作忙呀~~~没有办法~~~ 在群里,我叫你贡献几个接口,你又说不会~~~
2007-7-13 18:34
0
雪    币: 157
活跃值: (416)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
不错哦.继续呀.最好开源
2007-7-14 16:02
0
雪    币: 372
活跃值: (31)
能力值: ( LV12,RANK:410 )
在线值:
发帖
回帖
粉丝
10
强,支持一下 ̄ ̄
2007-7-14 16:57
0
雪    币: 623
活跃值: (10)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
11
强大的好东西
2007-7-15 00:12
0
雪    币: 215
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
哈哈,好东西,支持下~~~
2007-7-15 07:31
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
13
坚持不懈,不断总结!
强烈支持!
2007-7-18 12:02
0
雪    币: 168
活跃值: (233)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
14
关于WinAPIEx项目通用算法库设计方案:整合C++ STL vector容器

该算法库的设计难点在于 如何维护和确定用户使用的每个算法容器。这个问题我思考几天,灵感来源于Windows操作系统的HANDLE表。
因此在维护每个用户使用的算法容器,也采用了HANDLE表的原理。用户每使用一个算法容器,就必须为这个算法容器建立一个HANDLE。
然后必须由一个全局的HANDLE表来维护多个算法容器。

下面实现步骤:

1> 建立一个全局HANDLE表
我采用了C++ STL 高效率的MAP容器
声明: std::map<ULONG, STRUCT_CONTAINER_OBJECT> g_ContainerObjectList ;
那么map容器的第一个参数就是算法容器的HANDLE, 第二个参数是算法容器类型

2> 声明一个算法容器类型识别结构

// 目前我们先简单的使用STL的动态数组vector

typedef struct _CONTAINER_OBJECT 
{
	std::vector<ULONGLONG> *pvector_UnsignPoint ; 	// 无符号动态数组
	
	std::vector<LONGLONG> *pvector_signPoint ;		// 有符号动态数组

}STRUCT_CONTAINER_OBJECT, *PSTRUCT_CONTAINER_OBJECT ;


3> 为每个算法容器创建一个HANDLE
说明: 为了保证唯一 和 简单性,采用了随机数方式
ULONG
Container_CreateGUI(VOID)
{
	srand((unsigned)time(NULL)) ;

	return rand() ;

}// End Container_CreateGUI()


4> 为了防止算法容器HANDLE的重复性,必须有个校验功能
BOOL
Container_CheckGUI(ULONG ulong_param_GUI)
{
	// 在全局HANDLE表中查找是否有相同的HANDLE
	if (g_ContainerObjectList.find(ulong_param_GUI) !=
		g_ContainerObjectList.end())
	{
		return TRUE ;	// 有重复的HANDLE
	}

	return FALSE ;	// 无重复的HANDLE

}// End Container_CheckGUI()


5> 有了上面的基本模块,下面可以做一个导出接口了,供用户使用C++ STL的vector动态数组
ULONG
E_vector_Unsign_Create(VOID)
{
	STRUCT_CONTAINER_OBJECT struct_VectorOBjcet ;

	ULONG ulong_Object = 0 ;

	SecureZeroMemory(&struct_VectorOBjcet, sizeof(STRUCT_CONTAINER_OBJECT)) ;
	
	// 为用户建立C++ STL的vector动态数组
	std::vector<ULONGLONG> *pvector_Object = new std::vector<ULONGLONG> ;
	
	// 保存VECTOR容器指针
	struct_VectorOBjcet.pvector_UnsignPoint = pvector_Object ;

	// 校验容器HANDLE是否重复,如果重复则继续创建
	do 
	{
		ulong_Object = Container_CreateGUI() ;

	} while(Container_CheckGUI(ulong_Object));

	// 插入全局HANDLE表
	if (g_ContainerObjectList.insert(std::make_pair(ulong_Object,
									struct_VectorOBjcet)).second)
	{

	}
	else
		return -1 ;	// 插入失败

	return ulong_Object ;	// 返回用户的算法容器HANDLE

}// End vector_Unsign_Create()


好,下面我们验证一下思路:

int main()
{
	for (ULONG ulong_Count = 0 ;
			ulong_Count < 20 ;
			ulong_Count++)
		{
			E_vector_Unsign_Create() ;	// 创建20个算法容器
		}

		// 打印20个算法容器的信息
		std::map<ULONG, STRUCT_CONTAINER_OBJECT>::iterator map_Next ;
		for (map_Next = g_ContainerObjectList.begin() ;
			map_Next != g_ContainerObjectList.end() ;
			map_Next++)
		{
			printf("vector Handle: %d  vector Point: %p \n",
				  map_Next->first,
				  ((STRUCT_CONTAINER_OBJECT)map_Next->second).pvector_UnsignPoint) ;
				  
			// 释放用户算法容器
			delete ((STRUCT_CONTAINER_OBJECT)map_Next->second).pvector_UnsignPoint ; 
		}
}

运行效果:

vector Handle: 12081  vector Point: 00CB2970
vector Handle: 12084  vector Point: 00CB2A18
vector Handle: 12087  vector Point: 00CB2AC0
vector Handle: 12091  vector Point: 00CB2B68
vector Handle: 12094  vector Point: 00CB2C10
vector Handle: 12097  vector Point: 00CB2CB8
vector Handle: 12100  vector Point: 00CB2D60
vector Handle: 12104  vector Point: 00CB2E08
vector Handle: 12107  vector Point: 00CB2EB0
vector Handle: 12110  vector Point: 00CB2F58
vector Handle: 12114  vector Point: 00CB3000
vector Handle: 12117  vector Point: 00CB30A8
vector Handle: 12120  vector Point: 00CB3150
vector Handle: 12123  vector Point: 00CB31F8
vector Handle: 12127  vector Point: 00CB32A0
vector Handle: 12130  vector Point: 00CB3348
vector Handle: 12133  vector Point: 00CB33F0
vector Handle: 12136  vector Point: 00CB6C10
vector Handle: 12140  vector Point: 00CB6CB8
vector Handle: 12143  vector Point: 00CB6D60
2007-7-25 22:25
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不错,就我目前的水平,只能拿来主义,源码看不懂。好样的,支持,加油。
2007-12-18 18:59
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
16
顶顶猪头三。
2007-12-18 23:23
0
游客
登录 | 注册 方可回帖
返回
//