首页 > 编程语言 >继续更新完善:C++ 结构体代码转MASM32代码

继续更新完善:C++ 结构体代码转MASM32代码

时间:2023-10-31 11:01:43浏览次数:46  
标签:struct 代码 MIB MODULE C++ OWNER 结构 TCP6TABLE MASM32


一、需求分析

在用MASM32编程更新完善SysInfo的网络连接信息,用到了MIB_TCP6TABLE_OWNER_MODULE结构体:

typedef struct _MIB_TCP6TABLE_OWNER_MODULE {
  DWORD                    dwNumEntries;
  MIB_TCP6ROW_OWNER_MODULE table[ANY_SIZE];
} MIB_TCP6TABLE_OWNER_MODULE, *PMIB_TCP6TABLE_OWNER_MODULE;

MASM32内置的inc文件没有包含 这个结构体的定义,需要自己DIY。

结构体成员数量少还行,如果成员数量多的话,手工转换繁琐易出错,于是在之前写的

HTML+JavaScript构建C++类代码一键转换MASM32代码平台

的基础上增加了C++ 结构体代码转MASM32代码的功能。

二、判断是否为c++结构体定义代码

这个跟判断是c++类定义代码是相似的。判断c++类定义代码我们是检测class关键字,那么判断c++结构体定义代码我们是检测struct关键字,再检测是否存在{和}这两个字符:

function isCppStruct(c)
{
	//taMASM32.value += 'isCppStruct : c.search(/\bstruct\b/i =' + c.search(/\bstruct\b/i) + '\n';
	if (c.search(/\bstruct\b/i))
	{
		if ( -1 != c.indexOf('{') )
		{
			if ( -1 != c.lastIndexOf('}'))
			{
				return true;
			}//if
		}//if
	}//if
	return false;
}//isCppStruct(c)

三、获取结构体名称

在微软Windows 里中,C++类的类名一般位于定义代码的开头,class关键字的后面,如:

[Dynamic, Provider("CIMWin32"), UUID("{8502C4CC-5FBB-11D2-AAC1-006008C78BC7}"), AMENDMENT]
class Win32_UserAccount : Win32_Account
{
uint32 AccountType;
string Caption;
string Description;
boolean Disabled;
string Domain;
string FullName;
datetime InstallDate;
boolean LocalAccount;
boolean Lockout;
string Name;
boolean PasswordChangeable;
boolean PasswordExpires;
boolean PasswordRequired;
string SID;
uint8 SIDType;
string Status;
};

类名就是 Win32_UserAccount。

与C++类定义不同的是,C++结构体定义中,结构体名称既可能位于定义体首部的struct关键字后面,也可能位于结体体的末尾,如:

typedef struct _MIB_TCP6TABLE_OWNER_MODULE {
  DWORD                    dwNumEntries;
  MIB_TCP6ROW_OWNER_MODULE table[ANY_SIZE];
} MIB_TCP6TABLE_OWNER_MODULE, *PMIB_TCP6TABLE_OWNER_MODULE;

结构体名称是位于}符号的MIB_TCP6TABLE_OWNER_MODULE。

所以要获取C++结构体定义中的结构体名称,我们要分清主次,优先检查结构体定义末尾}后是否有结构体名称,有则从此获取结构体名称,没有的话,再从结构体定义首部struct关键字后获取结构体名称。

//功能:获取为c++ struct的名称
//输入:c=code
//输出:struct的名称(可能为'')
//记录:20230822创建
//     20230824增加变量t,避免}后无结构名时获取struct关键字后面的结构名不对的问题
function getStructName(c)
{
	//var r = c.substring(/\bstruct\b/i + 6).ltrim();
	//return r.substring(0, r.indexOf(' '));
	var r = c.search(/\bstruct\b/i);
	if (-1==r)
	{
		return '';
	}

	//获取}后的结构体名称
	var t = c.lastIndexOf('}');
	if ( (-1!=t) && (t<c.length) )
	{
		t = c.substring(t+1).trim();
		//alert(t);
		var i = t.indexOf(',');
		if (-1==i)
		{
			i = t.indexOf(';');
		}

		if (i > 0 && (i+1) < c.length )
		{
			return t.substring(0,i);
		}
	}

	//获取struct关键字后面的结构名
	r = c.substring(r + 6).ltrim();
	return r.substring(0, r.indexOf(' '));
}//getStructName(c)

四、获取c++结构体成员信息

获取c++结构体定义代码中的结构体成员信息与之前获取c++类定义代码中的类成员信息的思路是一样的,这里我们要考虑到成员可能是数组的情况,比如:

typedef struct _MIB_TCP6TABLE_OWNER_MODULE {
  DWORD                    dwNumEntries;
  MIB_TCP6ROW_OWNER_MODULE table[ANY_SIZE];
} MIB_TCP6TABLE_OWNER_MODULE, *PMIB_TCP6TABLE_OWNER_MODULE;

中的table成员就是一个数组,因此我们对原先的代码进行改进,检查成员名称中是否包含'['字符,如果包含,那么就要把'['及其后面的字符串去掉:

//功能:抽取c++ class中的成员名称和类型到数组
//输入:c=code
//输出:二维数组,每行第1个元素为C++类的成员类型,第2个元素为C++类的成员名称
//记录:20230812创建
//           20230825增加对数组类成员的检测
function extractMember(c)
{
	var r = c.substring(c.search(/\bclass\b/i) + 5);
	r = r.substring(r.indexOf('{')+1, r.lastIndexOf('}'));
	r = r.replace(/;/g,'');
	var a = r.split('\n');
	a.shift();//删除首个空行

	r = [];

	//i < a.length-1,跳过末个空行
	for (var i = 0; i < a.length-1; i++)
	{
		r[i] =[];
		r[i] = a[i].trim().split(' ');

		//是数组?20230825增加
		var j = r[i][1].indexOf('[');
		if (-1 != j)
		{
			r[i][1] = r[i][1].substring(0,j);
		}
	}

	return r;
}//extractMember(c)

五、转换效果

继续更新完善:C++ 结构体代码转MASM32代码_JavaScript

 

标签:struct,代码,MIB,MODULE,C++,OWNER,结构,TCP6TABLE,MASM32
From: https://blog.51cto.com/endurer/8102530

相关文章

  • Opencascad开发(C++)-数据类型转换-Shape、Verterx和gp_pnt的转化
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录1、前言2、TopoDS_Shape与TopoDS_Vertex的转换2.1TopoDS_Shape到TopoDS_Vertex2.2TopoDS_Vertex到TopoDS_Shape3、TopoDS_Vertex与gp_Pnt3.1TopoDS_Vertex到gp_Pnt3.2gp_Pnt到TopoDS_Vertex1、前言在Open......
  • Opencascad(C++)-建模-创建有界直线段
    文章目录1、前言2、用gp_Lin创建一条直线2.1gp_Lin类成员函数2.2创建一条直线2.3运行结果3、创建一条有界的直线段3.1功能说明3.2函数说明3.2创建直线段的代码3.3测试效果1、前言在Opencascad开发时,经常会遇到创建直线的情况,采用gp_Line创建的直线段是无界的,如果想创建......
  • 代码战场:用Python射击游戏开启程序员的创造之旅
    目录前言代码演示总结前言大家好,我是辣条哥!昨天在家点开好久没打开的游戏菜单,突然看到好久没有玩过的某F,玩了几把发现时代是真的变了!于是今天辣条有感而发写了这么一个简陋的射击类小游戏在这个项目中,我们将使用Python编写一个射击类游戏。这个游戏不仅具有高难度,还可以进行......
  • tdc++.so.6: version `GLIBCXX_3.4.29' not found
     001、python程序报错如下: 002、问题分析a、调用的是python程序b、libstdc++.so.6是c++标准库执行python程序时,需要调用c++标准库,libstdc++.so.6(lib=glib,6表示第6版),版本不匹配报错,无法找到:GLIBCXX_3.4.29。 003、确认调用的哪里的python程序(base)[b20223040......
  • 2023QDEZ男人八题线上同步赛 赛时代码和思路
    2023QDEZ男人八题线上同步赛赛时代码和思路比赛链接;赛时答疑;洛谷博客\(\texttt{A-std}\);\(\texttt{B-std}\);\(\texttt{C-std}\);\(\texttt{D-std}\);\(\texttt{E-std}\);\(\texttt{F-std}\);\(\texttt{G-std}\);\(\texttt{H-std}\);\(\texttt{Ex-std}\)我:\(50+50+20+5......
  • VSCode如何把代码转换成一行
    或者mac直接ctrl+j,可以把选中的代码转成一行。https://www.fengnayun.com/news/content/314947.html......
  • c++ ftp上传下载
    #include<afxinet.h>intmain(){BOOLdRes,pRes;HINTERNEThInternet;HINTERNEThConnect;hInternet=InternetOpen("A3GSSample",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,INTERNET_FLAG_NO_CACHE_WRITE);if(NULL==hInternet){printf("Inter......
  • R语言自然语言处理NLP:情感分析上市公司文本信息知识发现可视化|附代码数据
    全文链接:http://tecdat.cn/?p=31702原文出处:拓端数据部落公众号情感分析,就是根据一段文本,分析其表达情感的技术。比较简单的情感分析,能够辨别文本内容是积极的还是消极的(褒义/贬义);比较复杂的情感分析,能够知道这些文字是否流露出恐惧、生气、狂喜等细致入微的情感。此外,情感的二......
  • R语言非参数方法:使用核方法和K-NN(k近邻算法)分类预测心脏病数据|附代码数据
    原文链接: http://tecdat.cn/?p=22181 原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于非参数方法的研究报告,包括一些图形和统计输出。本文考虑一下基于核方法进行分类预测。注意,在这里,我们不使用标准逻辑回归,它是参数模型。非参数方法用于函数估计的非参数方法大......
  • R语言贝叶斯Metropolis-Hastings Gibbs 吉布斯采样器估计变点指数分布分析泊松过程车
    原文链接:http://tecdat.cn/?p=26578 原文出处:拓端数据部落公众号最近我们被客户要求撰写关于吉布斯采样器的研究报告,包括一些图形和统计输出。指数分布是泊松过程中事件之间时间的概率分布,因此它用于预测到下一个事件的等待时间,例如,您需要在公共汽车站等待的时间,直到下一班车......