用c#编写一个vb 工程源码分析工具(带源码工程下载)
最近加入一个公司,试用期间要我学习他们的旧系统,旧系统的代码是Visual Basic 6.0编写的,源码大概有10多万行,要一下子看完可不容易,并且还得出一个源码分析的文档。而最近的项目是新版本的开发,采用.Net的Visual C#开发,所以我边学c#边看代码;一是为了解决文档编写的问题,二是为了学习c#,就编写了一套专门分析vb Project的工具,其原理就是根据vb的工程文件解析所有的“变量、常量、API、过程、函数、事件”还有它们的类型“私有、全局”;由于时间关系,准备实现的“事件调用”分析并没有完成,但最后我的文档还是出来了。其中就有它的功劳。
软件的原型是参照 Aivosto 公司的"Aivosto Project Analyzer"制作的,它的功能很强大,只是它需要¥¥才能使用全部功能,否则只能导出txt文件,谁能有破解发我一份吧 :)
代码其实并不复杂,因为vb的语法很简单,都是行模式,虽然支持 & _ 连接符号,但是处理起来只需要替换掉即可。
以下是核心的算法(也算不上什么算法,只是我的分析模式)
dd
软件的原型是参照 Aivosto 公司的"Aivosto Project Analyzer"制作的,它的功能很强大,只是它需要¥¥才能使用全部功能,否则只能导出txt文件,谁能有破解发我一份吧 :)
代码其实并不复杂,因为vb的语法很简单,都是行模式,虽然支持 & _ 连接符号,但是处理起来只需要替换掉即可。
以下是核心的算法(也算不上什么算法,只是我的分析模式)
dd
/**//******************************************
* 返回文本内容
******************************************/
private string loadForm(string fileName)
{
if (fileName != "")
{
try
{
System.IO.StreamReader sr = new System.IO.StreamReader(fileName,System.Text.Encoding.Default);
return sr.ReadToEnd();
}
catch
{
return null;
}
}
else
{
return null;
}
}
分析窗体组件#region 分析窗体组件
/**//******************************************
* 处理组件数据并增加结果到listview
*****************************************/
private void parseControls(
System.Windows.Forms.ListView lv,
string fileName,string s)
{
if(s==null)return;
string[] strLines = s.Split (Environment.NewLine.ToCharArray()); //获取分隔符号
for(int i=0;i<strLines.Length;i++)
{
if(strLines[i].Trim()!=""&&strLines[i].Trim().Length>=6)
{
string strScalars = strLines[i].Trim();
if(strScalars.Substring(0,"Begin ".Length).ToUpper()=="Begin ".ToUpper())
{
//取得组件名称
string[] strSubList = strScalars.Split(" ".ToCharArray());
string strCtrlClass = strSubList[1];
string strCtrlName = strSubList[2];
if(fileName.LastIndexOf("\\")!=-1)
strSubList[0] = fileName.Substring(fileName.LastIndexOf("\\")+1);
else strSubList[0] = fileName;
ListViewItem lvi = new ListViewItem(strSubList,-1);
lv.Items.Add(lvi);
}
}
}
}
/**//**************************************
* 主循环处理内容
*************************************/
private void callMain(
System.Windows.Forms.ListView lv,
string[] listFiles)
{
lv.Items.Clear();
for (int i=0;i<listFiles.Length;i++)
{
parseControls(lv,listFiles[i],loadForm(listFiles[i]));
}
MessageBox.Show("分析完毕!");
}
#endregion
private void button1_Click(object sender, System.EventArgs e)
{
callMain(listView1,textBox1.Lines);
}
private void Form1_Resize(object sender, System.EventArgs e)
{
try
{
listView1.Height= textBox1.Top - listView1.Top;
}
catch
{
}
}
/**//********************************
* 通用函数,返回按分隔符、位的单词
*******************************/
private string CharIndex(string sSrc,string SplitChar,int CharIndex)
{
string[] tmpArray = sSrc.Split(SplitChar.ToCharArray());
return tmpArray[CharIndex];
}
/**//********************************
* 通用保存ListView到文件得过程
*******************************/
private void mSaveLvToFile_Click(object sender, System.EventArgs e)
{
if(mSaveLvToFile.GetContextMenu().SourceControl is ListView)
{
saveFileDlg.ShowDialog(this);
if(saveFileDlg.FileName!="")
{
string sTextFile = "";
ListView lv=(ListView)mSaveLvToFile.GetContextMenu().SourceControl;
for(int i=0;i<lv.Items.Count;i++)
{
string sLine = "";
for(int j=0;j<lv.Items[i].SubItems.Count;j++)
{
if(j!=(lv.Items[i].SubItems.Count-1))
{
sLine += lv.Items[i].SubItems[j].Text + ",";
}
else
{
sLine += lv.Items[i].SubItems[j].Text + "\r\n";
}
}
if(sTextFile.IndexOf(sLine)==-1)
{
sTextFile += sLine;
}
}
try
{
System.IO.StreamWriter sw = new System.IO.StreamWriter(saveFileDlg.FileName,false,System.Text.Encoding.Default);
sw.Write(sTextFile);
sw.Close();
MessageBox.Show("保存文件完成!");
}
catch
{
MessageBox.Show("保存文件错误!");
}
}
}
}
private void btnParseVar_Click(object sender, System.EventArgs e)
{
callMain2(
listViewConst,
listViewType,
listViewAPI,
listViewPubvar,
listViewPrivar,
textBox2.Lines
);
}
分析变量,声明等类型#region 分析变量,声明等类型
/**//**************************************
* 主循环处理内容2
*************************************/
private void callMain2(
System.Windows.Forms.ListView lv1,
System.Windows.Forms.ListView lv2,
System.Windows.Forms.ListView lv3,
System.Windows.Forms.ListView lv4,
System.Windows.Forms.ListView lv5,
string[] listFiles)
{
lv1.Items.Clear();
lv1.Items.Add("常量定义");
lv2.Items.Clear();
lv2.Items.Add("类型声明");
lv3.Items.Clear();
lv3.Items.Add("API 声明");
lv4.Items.Clear();
lv4.Items.Add("全局变量");
lv5.Items.Clear();
lv5.Items.Add("私有变量");
for (int i=0;i<listFiles.Length;i++)
{
parseVar(lv1,lv2,lv3,lv4,lv5,listFiles[i],loadForm(listFiles[i]));
}
MessageBox.Show("分析完毕!");
}
/**//******************************************
* 处理变量结果并增加结果到listview
*****************************************/
private void parseVar(
System.Windows.Forms.ListView lv1,
System.Windows.Forms.ListView lv2,
System.Windows.Forms.ListView lv3,
System.Windows.Forms.ListView lv4,
System.Windows.Forms.ListView lv5,
string fileName,string s)
{
//0.寻找常量定义
//1.寻找结构定义
//2.寻找API声明
//3.寻找工程全局变量
//4.寻找过程、函数、事件内局部变量
if(s==null)return;
s = replace2bank(s);
string[] strLines = s.Split (Environment.NewLine.ToCharArray()); //获取分隔符号
string[] strLines2 = s.Split (Environment.NewLine.ToCharArray()); //获取分隔符号
string[] strConstList = parseVarConst(strLines);
//lv.Items.Add("常量定义");
if(strConstList!=null)
{
for(int i=0;i<strConstList.Length;i++)
{
if(strConstList[i].Trim()==""){continue;}
string[] smaillList = strConstList[i].Split("\r".ToCharArray());
ListViewItem lvi = new ListViewItem(smaillList,-1);
if(fileName.LastIndexOf("\\")!=-1)
lvi.SubItems.Add(fileName.Substring(fileName.LastIndexOf("\\")+1));
else lvi.SubItems.Add(fileName);
lv1.Items.Add(lvi);
}
}
string[] strTypeList = parseVarType(strLines);
//lv.Items.Add("数据类型");
if(strTypeList!=null){
for(int i=0;i<strTypeList.Length;i++)
{
if(strTypeList[i].Trim()==""){continue;}
string[] smaillList = strTypeList[i].Split("\xff".ToCharArray());
ListViewItem lvi = new ListViewItem(smaillList,-1);
if(fileName.LastIndexOf("\\")!=-1)
lvi.SubItems.Add(fileName.Substring(fileName.LastIndexOf("\\")+1));
else lvi.SubItems.Add(fileName);
lv2.Items.Add(lvi);
}
}
string[] strAPIList = parseAPI(strLines);
//lv.Items.Add("API 声明");
if(strAPIList!=null)
{
for(int i=0;i<strAPIList.Length;i++)
{
if(strAPIList[i].Trim()==""){continue;}
string[] smaillList = strAPIList[i].Split("\r".ToCharArray());
ListViewItem lvi = new ListViewItem(smaillList,-1);
if(fileName.LastIndexOf("\\")!=-1)
lvi.SubItems.Add(fileName.Substring(fileName.LastIndexOf("\\")+1));
else lvi.SubItems.Add(fileName);
lv3.Items.Add(lvi);
}
}
string[] strPubvarList = parsePublicVar(strLines);
//lv.Items.Add("全局变量声明");
if(strPubvarList!=null)
{
for(int i=0;i<strPubvarList.Length;i++)
{
if(strPubvarList[i].Trim()==""){continue;}
string[] smaillList = strPubvarList[i].Split("\r".ToCharArray());
ListViewItem lvi = new ListViewItem(smaillList,-1);
if(fileName.LastIndexOf("\\")!=-1)
lvi.SubItems.Add(fileName.Substring(fileName.LastIndexOf("\\")+1));
else lvi.SubItems.Add(fileName);
lv4.Items.Add(lvi);
}
}
string[] strPrivarList = parsePrivateVar(strLines2);
//lv5.Items.Add("私有变量声明");
if(strPrivarList!=null)
{
for(int i=0;i<strPrivarList.Length;i++)
{
if(strPrivarList[i].Trim()==""){continue;}
string[] smaillList = strPrivarList[i].Split("\r".ToCharArray());
ListViewItem lvi = new ListViewItem(smaillList,-1);
if(fileName.LastIndexOf("\\")!=-1)
lvi.SubItems.Add(fileName.Substring(fileName.LastIndexOf("\\")+1));
else lvi.SubItems.Add(fileName);
lv5.Items.Add(lvi);
}
}
}
/**//*****************************************
* 处理 双空格 字符 处理vb连接符号
****************************************/
private string replace2bank(string s)
{
s = s.Trim().Replace("& _\r\n","");
s = s.Trim().Replace("_\r\n","");
while(s.IndexOf(" ")!=-1)
{
s = s.Replace(" "," ");
}
return s;
}
/**//*****************************************
* 查找事件、函数、过程内局部变量
****************************************/
private string[] parsePrivateVar(string[] sSrc)
{
string tmpStr = "";
string privateParentName = "";
int i=0;
while(i<sSrc.Length)
{
//从代码段开始
if(sSrc[i].Trim().ToUpper().IndexOf("Attribute ".ToUpper())==0)
{
break;
}
i++;
}
//预处理
while(i<sSrc.Length)
{
//访问sub
//先寻找关键字,切断关键字后得行,再按逗号分割,检查每位得时候检查当前后段注解字符
if( sSrc[i].Trim().ToUpper().IndexOf("sub ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private sub ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public sub ".ToUpper())==0)
{
if(CharIndex(sSrc[i]," ",0).Trim().ToUpper()=="sub".ToUpper())
{
privateParentName = CharIndex(sSrc[i]," ",1);
}
else
{
privateParentName = CharIndex(sSrc[i]," ",2);
}
if(privateParentName.Trim().ToUpper().IndexOf("(")!=-1)
{
privateParentName = privateParentName.Substring(0,privateParentName.Trim().ToUpper().IndexOf("("));
}
for(int n=i;n<sSrc.Length;n++,i++)
{
if(sSrc[i].Trim().ToUpper().IndexOf("end sub".ToUpper())==0)
{
break;
}
//如果检查到 变量 定义
if( sSrc[i].Trim().ToUpper().IndexOf("Dim ".ToUpper())==0)
{
string[] keyWord = sSrc[i].Trim().Substring(sSrc[i].Trim().IndexOf(" ")).Split(",".ToCharArray());
for(int j=0;j<keyWord.Length;j++)
{
string constLine = keyWord[j];
if(constLine.Trim().ToUpper().IndexOf("AS")!=-1)
{
tmpStr += constLine.Trim().Substring(0,constLine.Trim().ToUpper().IndexOf("AS"))+"\r"+constLine.Trim()+"\r局部变量";
}
else if(constLine.Trim().ToUpper().IndexOf("'")!=-1)
{
tmpStr += constLine.Trim().Substring(0,constLine.Trim().ToUpper().IndexOf("'"))+"\r"+constLine.Trim()+"\r局部变量";
}
else
{
tmpStr += constLine.Trim()+"\r"+constLine.Trim()+"\r局部变量";
}
tmpStr += " 来自事件/过程["+privateParentName+"]`";
}
}
}
}//访问function
else if(sSrc[i].Trim().ToUpper().IndexOf("function ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private function ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public function ".ToUpper())==0)
{
if(CharIndex(sSrc[i]," ",0).Trim().ToUpper()=="function".ToUpper())
{
privateParentName = CharIndex(sSrc[i]," ",1);
}
else
{
privateParentName = CharIndex(sSrc[i]," ",2);
}
if(privateParentName.Trim().ToUpper().IndexOf("(")!=-1)
{
privateParentName = privateParentName.Substring(0,privateParentName.Trim().ToUpper().IndexOf("("));
}
for(int n=i;n<sSrc.Length;n++,i++)
{
if(sSrc[i].Trim().ToUpper().IndexOf("end function".ToUpper())==0)
{
break;
}
//如果检查到 变量 定义
if( sSrc[i].Trim().ToUpper().IndexOf("Dim ".ToUpper())==0)
{
string[] keyWord = sSrc[i].Trim().Substring(sSrc[i].Trim().IndexOf(" ")).Split(",".ToCharArray());
for(int j=0;j<keyWord.Length;j++)
{
string constLine = keyWord[j];
if(constLine.Trim().ToUpper().IndexOf("AS")!=-1)
{
tmpStr += constLine.Trim().Substring(0,constLine.Trim().ToUpper().IndexOf("AS"))+"\r"+constLine.Trim()+"\r局部变量";
}
else if(constLine.Trim().ToUpper().IndexOf("'")!=-1)
{
tmpStr += constLine.Trim().Substring(0,constLine.Trim().ToUpper().IndexOf("'"))+"\r"+constLine.Trim()+"\r局部变量";
}
else
{
tmpStr += constLine.Trim()+"\r"+constLine.Trim()+"\r局部变量";
}
tmpStr += " 来自函数["+privateParentName+"]`";
}
}
}
}//去掉所有Const/api
else if( sSrc[i].Trim().ToUpper().IndexOf("const ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private const ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public const ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private Declare ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public Declare ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("Declare ".ToUpper())==0)
{
sSrc[i] = ""; //清除掉
}//去掉所有Type
else if( sSrc[i].Trim().ToUpper().IndexOf("type ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private type ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public type ".ToUpper())==0)
{
for(int j=i;j<sSrc.Length;j++,i++)
{
if(sSrc[i].Trim().ToUpper().IndexOf("end type".ToUpper())==0)
{
sSrc[i] = ""; //清除掉
break;
}
else
{
sSrc[i] = ""; //清除掉
}
}
}
i++;
}
if(tmpStr!="")
{
string[] tmpStr2 = tmpStr.PadLeft(tmpStr.Length-1).Split("`".ToCharArray());
return tmpStr2;
}
else
{
return null;
}
}
/**//*****************************************
* 查找工程全局变量
****************************************/
private string[] parsePublicVar(string[] sSrc)
{
string tmpStr = "";
int i=0;
while(i<sSrc.Length)
{
//从代码段开始
if(sSrc[i].Trim().ToUpper().IndexOf("Attribute ".ToUpper())==0)
{
break;
}
i++;
}
//预处理
while(i<sSrc.Length)
{
//去掉所有sub
if( sSrc[i].Trim().ToUpper().IndexOf("sub ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private sub ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public sub ".ToUpper())==0)
{
for(int j=i;j<sSrc.Length;j++,i++)
{
if(sSrc[i].Trim().ToUpper().IndexOf("end sub".ToUpper())==0)
{
sSrc[i] = ""; //清除掉
break;
}
else
{
sSrc[i] = ""; //清除掉
}
}
}//去掉所有function
else if( sSrc[i].Trim().ToUpper().IndexOf("function ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private function ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public function ".ToUpper())==0)
{
for(int j=i;j<sSrc.Length;j++,i++)
{
if(sSrc[i].Trim().ToUpper().IndexOf("end function".ToUpper())==0)
{
sSrc[i] = ""; //清除掉
break;
}
else
{
sSrc[i] = ""; //清除掉
}
}
}//去掉所有Const/api
else if( sSrc[i].Trim().ToUpper().IndexOf("const ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private const ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public const ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private Declare ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public Declare ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("Declare ".ToUpper())==0)
{
sSrc[i] = ""; //清除掉
}//去掉所有Type
else if( sSrc[i].Trim().ToUpper().IndexOf("type ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private type ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public type ".ToUpper())==0)
{
for(int j=i;j<sSrc.Length;j++,i++)
{
if(sSrc[i].Trim().ToUpper().IndexOf("end type".ToUpper())==0)
{
sSrc[i] = ""; //清除掉
break;
}
else
{
sSrc[i] = ""; //清除掉
}
}
}
i++;
}
//恢复起始行
i=0;
while(i<sSrc.Length)
{
//从代码段开始
if(sSrc[i].Trim().ToUpper().IndexOf("Attribute ".ToUpper())==0)
{
break;
}
i++;
}
//先寻找关键字,切断关键字后得行,再按逗号分割,检查每位得时候检查当前后段注解字符
//排除定义的事件之间得全局变量
while(i<sSrc.Length)
{
//如果检查到 变量 定义
if( sSrc[i].Trim().ToUpper().IndexOf("Private ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("Public ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("Dim ".ToUpper())==0)
{
string[] keyWord = sSrc[i].Trim().Substring(sSrc[i].Trim().IndexOf(" ")).Split(",".ToCharArray());
for(int j=0;j<keyWord.Length;j++)
{
string constLine = keyWord[j];
if(constLine.Trim().ToUpper().IndexOf("AS")!=-1)
{
tmpStr += constLine.Trim().Substring(0,constLine.Trim().ToUpper().IndexOf("AS"))+"\r"+constLine.Trim()+"\r"+getVarDomain(sSrc[i]).ToString();
}
else if(constLine.Trim().ToUpper().IndexOf("'")!=-1)
{
tmpStr += constLine.Trim().Substring(0,constLine.Trim().ToUpper().IndexOf("'"))+"\r"+constLine.Trim()+"\r"+getVarDomain(sSrc[i]).ToString();
}
else
{
tmpStr += constLine.Trim()+"\r"+constLine.Trim()+"\r"+getVarDomain(sSrc[i]).ToString();
}
tmpStr += "`";
}
}
i++;
}
if(tmpStr!="")
{
string[] tmpStr2 = tmpStr.PadLeft(tmpStr.Length-1).Split("`".ToCharArray());
return tmpStr2;
}
else
{
return null;
}
}
/**//*****************************************
* 返回API定义列表
****************************************/
private string[] parseAPI(string[] sSrc)
{
string tmpStr = "";
int i=0;
while(i<sSrc.Length)
{
//从代码段开始
if(sSrc[i].Trim().ToUpper().IndexOf("Attribute ".ToUpper())==0)
{
break;
}
i++;
}
while(i<sSrc.Length)
{
//如果检查到 API 定义
if(sSrc[i].Trim().ToUpper().IndexOf("Private Declare ".ToUpper())==0||sSrc[i].Trim().ToUpper().IndexOf("Public Declare ".ToUpper())==0)
{
string constLine = sSrc[i];
tmpStr += getAPIName(constLine).ToString()+"\r"+constLine+"\r"+getVarDomain(constLine).ToString() + "`";
}
i++;
}
if(tmpStr!="")
{
string[] tmpStr2 = tmpStr.PadLeft(tmpStr.Length-1).Split("`".ToCharArray());
return tmpStr2;
}
else
{
return null;
}
}
/**//*****************************************
* 返回API名称
****************************************/
private string getAPIName(string srcCodeLine)
{
string[] codeList =srcCodeLine.Split(" ".ToCharArray());
string result = "";
for(int i=0; i<codeList.Length;i++)
{
if(codeList[i].Trim().ToUpper()=="Function".ToUpper())
{
if(i+1<=codeList.Length)
{
result = codeList[i+1];
}
break;
}
}
return result;
}
/**//*****************************************
* 返回结构定义列表
****************************************/
private string[] parseVarType(string[] sSrc)
{
string tmpStr = "";
int i=0;
while(i<sSrc.Length)
{
//从代码段开始
if(sSrc[i].Trim().ToUpper().IndexOf("Attribute ".ToUpper())==0)
{
break;
}
i++;
}
while(i<sSrc.Length)
{
//如果检查到 Type 定义
if(sSrc[i].Trim().ToUpper().IndexOf("TYPE ")==0||sSrc[i].Trim().ToUpper().IndexOf(" TYPE ")!=-1)
{
string constLine = sSrc[i];
string s = "";
for(int j=i;j<sSrc.Length;j++,i++)
{
s += sSrc[j] + "\r\n";
if(sSrc[i].Trim().ToUpper().IndexOf("END TYPE")!=-1)
{
break;
}
}
tmpStr += getVarTypeName(constLine).ToString()+"\xff"+s+"\xff"+getVarDomain(constLine).ToString() + "`";
}
i++;
}
if(tmpStr!="")
{
string[] tmpStr2 = tmpStr.PadLeft(tmpStr.Length-1).Split("`".ToCharArray());
return tmpStr2;
}
else
{
return null;
}
}
/**//*****************************************
* 返回结构名称
****************************************/
private string getVarTypeName(string srcCodeLine)
{
string[] codeList =srcCodeLine.Split(" ".ToCharArray());
if(codeList[0].Trim().ToUpper()=="TYPE")
{
return codeList[1].Trim();
}
else
{
return codeList[2].Trim();
}
}
/**//*****************************************
* 返回常量定义列表
****************************************/
private string[] parseVarConst(string[] sSrc)
{
string tmpStr = "";
for(int i=0;i<sSrc.Length;i++)
{
//如果检查到 const 定义
if(sSrc[i].Length>=6){
if(sSrc[i].Substring(0,"CONST ".Length).ToUpper()=="CONST "||sSrc[i].ToUpper().IndexOf(" CONST ")!=-1)
{
string constLine = sSrc[i];
tmpStr += getVarName(constLine).ToString()+"\r"+constLine+"\r"+getVarDomain(constLine).ToString() + "`";
}
}
}
if (tmpStr!="")
{
string[] tmpStr2 = tmpStr.PadLeft(tmpStr.Length-1).Split("`".ToCharArray());
return tmpStr2;
}
else
{
return null;
}
}
/**//*****************************************
* 返回常量名称
****************************************/
private string getVarName(string srcCodeLine)
{
string[] codeList =srcCodeLine.Split(" ".ToCharArray());
if(codeList[0].Trim().ToUpper()=="CONST")
{
return codeList[1].Trim();
}
else
{
return codeList[2].Trim();
}
}
/**//******************************************
* 返回定义作用域说明
*****************************************/
private string getVarDomain(string srcCodeLine)
{
if(srcCodeLine.Trim().ToUpper().IndexOf("Private".ToUpper())!=-1)
{
return "局部共享";
}
else
{
return "全局共享";
}
}
#endregion
private void btnParseProc_Click(object sender, System.EventArgs e)
{
}
/**//**************************************
* 主循环处理内容3
*************************************/
private void callMain2(
System.Windows.Forms.ListView lv1,
string[] listFiles)
{
lv1.Items.Clear();
lv1.Items.Add("事件过程");
for (int i=0;i<listFiles.Length;i++)
{
parseProc(lv1,listFiles[i],loadForm(listFiles[i]));
}
MessageBox.Show("分析完毕!");
}
/**//******************************************
* 处理变量结果并增加结果到listview
*****************************************/
private void parseProc(
System.Windows.Forms.ListView lv1,
string fileName,string s)
{
//1.寻找API声明
//2.寻找过程、函数、事件
if(s==null)return;
s = replace2bank(s);
string[] strLines = s.Split (Environment.NewLine.ToCharArray()); //获取分隔符号
string[] strConstList = parseVarConst(strLines);
//lv.Items.Add("API声明");
if(strConstList!=null)
{
for(int i=0;i<strConstList.Length;i++)
{
if(strConstList[i].Trim()==""){continue;}
string[] smaillList = strConstList[i].Split("\r".ToCharArray());
ListViewItem lvi = new ListViewItem(smaillList,-1);
if(fileName.LastIndexOf("\\")!=-1)
lvi.SubItems.Add(fileName.Substring(fileName.LastIndexOf("\\")+1));
else lvi.SubItems.Add(fileName);
lv1.Items.Add(lvi);
}
}
}
* 返回文本内容
******************************************/
private string loadForm(string fileName)
{
if (fileName != "")
{
try
{
System.IO.StreamReader sr = new System.IO.StreamReader(fileName,System.Text.Encoding.Default);
return sr.ReadToEnd();
}
catch
{
return null;
}
}
else
{
return null;
}
}
分析窗体组件#region 分析窗体组件
/**//******************************************
* 处理组件数据并增加结果到listview
*****************************************/
private void parseControls(
System.Windows.Forms.ListView lv,
string fileName,string s)
{
if(s==null)return;
string[] strLines = s.Split (Environment.NewLine.ToCharArray()); //获取分隔符号
for(int i=0;i<strLines.Length;i++)
{
if(strLines[i].Trim()!=""&&strLines[i].Trim().Length>=6)
{
string strScalars = strLines[i].Trim();
if(strScalars.Substring(0,"Begin ".Length).ToUpper()=="Begin ".ToUpper())
{
//取得组件名称
string[] strSubList = strScalars.Split(" ".ToCharArray());
string strCtrlClass = strSubList[1];
string strCtrlName = strSubList[2];
if(fileName.LastIndexOf("\\")!=-1)
strSubList[0] = fileName.Substring(fileName.LastIndexOf("\\")+1);
else strSubList[0] = fileName;
ListViewItem lvi = new ListViewItem(strSubList,-1);
lv.Items.Add(lvi);
}
}
}
}
/**//**************************************
* 主循环处理内容
*************************************/
private void callMain(
System.Windows.Forms.ListView lv,
string[] listFiles)
{
lv.Items.Clear();
for (int i=0;i<listFiles.Length;i++)
{
parseControls(lv,listFiles[i],loadForm(listFiles[i]));
}
MessageBox.Show("分析完毕!");
}
#endregion
private void button1_Click(object sender, System.EventArgs e)
{
callMain(listView1,textBox1.Lines);
}
private void Form1_Resize(object sender, System.EventArgs e)
{
try
{
listView1.Height= textBox1.Top - listView1.Top;
}
catch
{
}
}
/**//********************************
* 通用函数,返回按分隔符、位的单词
*******************************/
private string CharIndex(string sSrc,string SplitChar,int CharIndex)
{
string[] tmpArray = sSrc.Split(SplitChar.ToCharArray());
return tmpArray[CharIndex];
}
/**//********************************
* 通用保存ListView到文件得过程
*******************************/
private void mSaveLvToFile_Click(object sender, System.EventArgs e)
{
if(mSaveLvToFile.GetContextMenu().SourceControl is ListView)
{
saveFileDlg.ShowDialog(this);
if(saveFileDlg.FileName!="")
{
string sTextFile = "";
ListView lv=(ListView)mSaveLvToFile.GetContextMenu().SourceControl;
for(int i=0;i<lv.Items.Count;i++)
{
string sLine = "";
for(int j=0;j<lv.Items[i].SubItems.Count;j++)
{
if(j!=(lv.Items[i].SubItems.Count-1))
{
sLine += lv.Items[i].SubItems[j].Text + ",";
}
else
{
sLine += lv.Items[i].SubItems[j].Text + "\r\n";
}
}
if(sTextFile.IndexOf(sLine)==-1)
{
sTextFile += sLine;
}
}
try
{
System.IO.StreamWriter sw = new System.IO.StreamWriter(saveFileDlg.FileName,false,System.Text.Encoding.Default);
sw.Write(sTextFile);
sw.Close();
MessageBox.Show("保存文件完成!");
}
catch
{
MessageBox.Show("保存文件错误!");
}
}
}
}
private void btnParseVar_Click(object sender, System.EventArgs e)
{
callMain2(
listViewConst,
listViewType,
listViewAPI,
listViewPubvar,
listViewPrivar,
textBox2.Lines
);
}
分析变量,声明等类型#region 分析变量,声明等类型
/**//**************************************
* 主循环处理内容2
*************************************/
private void callMain2(
System.Windows.Forms.ListView lv1,
System.Windows.Forms.ListView lv2,
System.Windows.Forms.ListView lv3,
System.Windows.Forms.ListView lv4,
System.Windows.Forms.ListView lv5,
string[] listFiles)
{
lv1.Items.Clear();
lv1.Items.Add("常量定义");
lv2.Items.Clear();
lv2.Items.Add("类型声明");
lv3.Items.Clear();
lv3.Items.Add("API 声明");
lv4.Items.Clear();
lv4.Items.Add("全局变量");
lv5.Items.Clear();
lv5.Items.Add("私有变量");
for (int i=0;i<listFiles.Length;i++)
{
parseVar(lv1,lv2,lv3,lv4,lv5,listFiles[i],loadForm(listFiles[i]));
}
MessageBox.Show("分析完毕!");
}
/**//******************************************
* 处理变量结果并增加结果到listview
*****************************************/
private void parseVar(
System.Windows.Forms.ListView lv1,
System.Windows.Forms.ListView lv2,
System.Windows.Forms.ListView lv3,
System.Windows.Forms.ListView lv4,
System.Windows.Forms.ListView lv5,
string fileName,string s)
{
//0.寻找常量定义
//1.寻找结构定义
//2.寻找API声明
//3.寻找工程全局变量
//4.寻找过程、函数、事件内局部变量
if(s==null)return;
s = replace2bank(s);
string[] strLines = s.Split (Environment.NewLine.ToCharArray()); //获取分隔符号
string[] strLines2 = s.Split (Environment.NewLine.ToCharArray()); //获取分隔符号
string[] strConstList = parseVarConst(strLines);
//lv.Items.Add("常量定义");
if(strConstList!=null)
{
for(int i=0;i<strConstList.Length;i++)
{
if(strConstList[i].Trim()==""){continue;}
string[] smaillList = strConstList[i].Split("\r".ToCharArray());
ListViewItem lvi = new ListViewItem(smaillList,-1);
if(fileName.LastIndexOf("\\")!=-1)
lvi.SubItems.Add(fileName.Substring(fileName.LastIndexOf("\\")+1));
else lvi.SubItems.Add(fileName);
lv1.Items.Add(lvi);
}
}
string[] strTypeList = parseVarType(strLines);
//lv.Items.Add("数据类型");
if(strTypeList!=null){
for(int i=0;i<strTypeList.Length;i++)
{
if(strTypeList[i].Trim()==""){continue;}
string[] smaillList = strTypeList[i].Split("\xff".ToCharArray());
ListViewItem lvi = new ListViewItem(smaillList,-1);
if(fileName.LastIndexOf("\\")!=-1)
lvi.SubItems.Add(fileName.Substring(fileName.LastIndexOf("\\")+1));
else lvi.SubItems.Add(fileName);
lv2.Items.Add(lvi);
}
}
string[] strAPIList = parseAPI(strLines);
//lv.Items.Add("API 声明");
if(strAPIList!=null)
{
for(int i=0;i<strAPIList.Length;i++)
{
if(strAPIList[i].Trim()==""){continue;}
string[] smaillList = strAPIList[i].Split("\r".ToCharArray());
ListViewItem lvi = new ListViewItem(smaillList,-1);
if(fileName.LastIndexOf("\\")!=-1)
lvi.SubItems.Add(fileName.Substring(fileName.LastIndexOf("\\")+1));
else lvi.SubItems.Add(fileName);
lv3.Items.Add(lvi);
}
}
string[] strPubvarList = parsePublicVar(strLines);
//lv.Items.Add("全局变量声明");
if(strPubvarList!=null)
{
for(int i=0;i<strPubvarList.Length;i++)
{
if(strPubvarList[i].Trim()==""){continue;}
string[] smaillList = strPubvarList[i].Split("\r".ToCharArray());
ListViewItem lvi = new ListViewItem(smaillList,-1);
if(fileName.LastIndexOf("\\")!=-1)
lvi.SubItems.Add(fileName.Substring(fileName.LastIndexOf("\\")+1));
else lvi.SubItems.Add(fileName);
lv4.Items.Add(lvi);
}
}
string[] strPrivarList = parsePrivateVar(strLines2);
//lv5.Items.Add("私有变量声明");
if(strPrivarList!=null)
{
for(int i=0;i<strPrivarList.Length;i++)
{
if(strPrivarList[i].Trim()==""){continue;}
string[] smaillList = strPrivarList[i].Split("\r".ToCharArray());
ListViewItem lvi = new ListViewItem(smaillList,-1);
if(fileName.LastIndexOf("\\")!=-1)
lvi.SubItems.Add(fileName.Substring(fileName.LastIndexOf("\\")+1));
else lvi.SubItems.Add(fileName);
lv5.Items.Add(lvi);
}
}
}
/**//*****************************************
* 处理 双空格 字符 处理vb连接符号
****************************************/
private string replace2bank(string s)
{
s = s.Trim().Replace("& _\r\n","");
s = s.Trim().Replace("_\r\n","");
while(s.IndexOf(" ")!=-1)
{
s = s.Replace(" "," ");
}
return s;
}
/**//*****************************************
* 查找事件、函数、过程内局部变量
****************************************/
private string[] parsePrivateVar(string[] sSrc)
{
string tmpStr = "";
string privateParentName = "";
int i=0;
while(i<sSrc.Length)
{
//从代码段开始
if(sSrc[i].Trim().ToUpper().IndexOf("Attribute ".ToUpper())==0)
{
break;
}
i++;
}
//预处理
while(i<sSrc.Length)
{
//访问sub
//先寻找关键字,切断关键字后得行,再按逗号分割,检查每位得时候检查当前后段注解字符
if( sSrc[i].Trim().ToUpper().IndexOf("sub ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private sub ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public sub ".ToUpper())==0)
{
if(CharIndex(sSrc[i]," ",0).Trim().ToUpper()=="sub".ToUpper())
{
privateParentName = CharIndex(sSrc[i]," ",1);
}
else
{
privateParentName = CharIndex(sSrc[i]," ",2);
}
if(privateParentName.Trim().ToUpper().IndexOf("(")!=-1)
{
privateParentName = privateParentName.Substring(0,privateParentName.Trim().ToUpper().IndexOf("("));
}
for(int n=i;n<sSrc.Length;n++,i++)
{
if(sSrc[i].Trim().ToUpper().IndexOf("end sub".ToUpper())==0)
{
break;
}
//如果检查到 变量 定义
if( sSrc[i].Trim().ToUpper().IndexOf("Dim ".ToUpper())==0)
{
string[] keyWord = sSrc[i].Trim().Substring(sSrc[i].Trim().IndexOf(" ")).Split(",".ToCharArray());
for(int j=0;j<keyWord.Length;j++)
{
string constLine = keyWord[j];
if(constLine.Trim().ToUpper().IndexOf("AS")!=-1)
{
tmpStr += constLine.Trim().Substring(0,constLine.Trim().ToUpper().IndexOf("AS"))+"\r"+constLine.Trim()+"\r局部变量";
}
else if(constLine.Trim().ToUpper().IndexOf("'")!=-1)
{
tmpStr += constLine.Trim().Substring(0,constLine.Trim().ToUpper().IndexOf("'"))+"\r"+constLine.Trim()+"\r局部变量";
}
else
{
tmpStr += constLine.Trim()+"\r"+constLine.Trim()+"\r局部变量";
}
tmpStr += " 来自事件/过程["+privateParentName+"]`";
}
}
}
}//访问function
else if(sSrc[i].Trim().ToUpper().IndexOf("function ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private function ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public function ".ToUpper())==0)
{
if(CharIndex(sSrc[i]," ",0).Trim().ToUpper()=="function".ToUpper())
{
privateParentName = CharIndex(sSrc[i]," ",1);
}
else
{
privateParentName = CharIndex(sSrc[i]," ",2);
}
if(privateParentName.Trim().ToUpper().IndexOf("(")!=-1)
{
privateParentName = privateParentName.Substring(0,privateParentName.Trim().ToUpper().IndexOf("("));
}
for(int n=i;n<sSrc.Length;n++,i++)
{
if(sSrc[i].Trim().ToUpper().IndexOf("end function".ToUpper())==0)
{
break;
}
//如果检查到 变量 定义
if( sSrc[i].Trim().ToUpper().IndexOf("Dim ".ToUpper())==0)
{
string[] keyWord = sSrc[i].Trim().Substring(sSrc[i].Trim().IndexOf(" ")).Split(",".ToCharArray());
for(int j=0;j<keyWord.Length;j++)
{
string constLine = keyWord[j];
if(constLine.Trim().ToUpper().IndexOf("AS")!=-1)
{
tmpStr += constLine.Trim().Substring(0,constLine.Trim().ToUpper().IndexOf("AS"))+"\r"+constLine.Trim()+"\r局部变量";
}
else if(constLine.Trim().ToUpper().IndexOf("'")!=-1)
{
tmpStr += constLine.Trim().Substring(0,constLine.Trim().ToUpper().IndexOf("'"))+"\r"+constLine.Trim()+"\r局部变量";
}
else
{
tmpStr += constLine.Trim()+"\r"+constLine.Trim()+"\r局部变量";
}
tmpStr += " 来自函数["+privateParentName+"]`";
}
}
}
}//去掉所有Const/api
else if( sSrc[i].Trim().ToUpper().IndexOf("const ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private const ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public const ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private Declare ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public Declare ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("Declare ".ToUpper())==0)
{
sSrc[i] = ""; //清除掉
}//去掉所有Type
else if( sSrc[i].Trim().ToUpper().IndexOf("type ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private type ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public type ".ToUpper())==0)
{
for(int j=i;j<sSrc.Length;j++,i++)
{
if(sSrc[i].Trim().ToUpper().IndexOf("end type".ToUpper())==0)
{
sSrc[i] = ""; //清除掉
break;
}
else
{
sSrc[i] = ""; //清除掉
}
}
}
i++;
}
if(tmpStr!="")
{
string[] tmpStr2 = tmpStr.PadLeft(tmpStr.Length-1).Split("`".ToCharArray());
return tmpStr2;
}
else
{
return null;
}
}
/**//*****************************************
* 查找工程全局变量
****************************************/
private string[] parsePublicVar(string[] sSrc)
{
string tmpStr = "";
int i=0;
while(i<sSrc.Length)
{
//从代码段开始
if(sSrc[i].Trim().ToUpper().IndexOf("Attribute ".ToUpper())==0)
{
break;
}
i++;
}
//预处理
while(i<sSrc.Length)
{
//去掉所有sub
if( sSrc[i].Trim().ToUpper().IndexOf("sub ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private sub ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public sub ".ToUpper())==0)
{
for(int j=i;j<sSrc.Length;j++,i++)
{
if(sSrc[i].Trim().ToUpper().IndexOf("end sub".ToUpper())==0)
{
sSrc[i] = ""; //清除掉
break;
}
else
{
sSrc[i] = ""; //清除掉
}
}
}//去掉所有function
else if( sSrc[i].Trim().ToUpper().IndexOf("function ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private function ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public function ".ToUpper())==0)
{
for(int j=i;j<sSrc.Length;j++,i++)
{
if(sSrc[i].Trim().ToUpper().IndexOf("end function".ToUpper())==0)
{
sSrc[i] = ""; //清除掉
break;
}
else
{
sSrc[i] = ""; //清除掉
}
}
}//去掉所有Const/api
else if( sSrc[i].Trim().ToUpper().IndexOf("const ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private const ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public const ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private Declare ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public Declare ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("Declare ".ToUpper())==0)
{
sSrc[i] = ""; //清除掉
}//去掉所有Type
else if( sSrc[i].Trim().ToUpper().IndexOf("type ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("private type ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("public type ".ToUpper())==0)
{
for(int j=i;j<sSrc.Length;j++,i++)
{
if(sSrc[i].Trim().ToUpper().IndexOf("end type".ToUpper())==0)
{
sSrc[i] = ""; //清除掉
break;
}
else
{
sSrc[i] = ""; //清除掉
}
}
}
i++;
}
//恢复起始行
i=0;
while(i<sSrc.Length)
{
//从代码段开始
if(sSrc[i].Trim().ToUpper().IndexOf("Attribute ".ToUpper())==0)
{
break;
}
i++;
}
//先寻找关键字,切断关键字后得行,再按逗号分割,检查每位得时候检查当前后段注解字符
//排除定义的事件之间得全局变量
while(i<sSrc.Length)
{
//如果检查到 变量 定义
if( sSrc[i].Trim().ToUpper().IndexOf("Private ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("Public ".ToUpper())==0||
sSrc[i].Trim().ToUpper().IndexOf("Dim ".ToUpper())==0)
{
string[] keyWord = sSrc[i].Trim().Substring(sSrc[i].Trim().IndexOf(" ")).Split(",".ToCharArray());
for(int j=0;j<keyWord.Length;j++)
{
string constLine = keyWord[j];
if(constLine.Trim().ToUpper().IndexOf("AS")!=-1)
{
tmpStr += constLine.Trim().Substring(0,constLine.Trim().ToUpper().IndexOf("AS"))+"\r"+constLine.Trim()+"\r"+getVarDomain(sSrc[i]).ToString();
}
else if(constLine.Trim().ToUpper().IndexOf("'")!=-1)
{
tmpStr += constLine.Trim().Substring(0,constLine.Trim().ToUpper().IndexOf("'"))+"\r"+constLine.Trim()+"\r"+getVarDomain(sSrc[i]).ToString();
}
else
{
tmpStr += constLine.Trim()+"\r"+constLine.Trim()+"\r"+getVarDomain(sSrc[i]).ToString();
}
tmpStr += "`";
}
}
i++;
}
if(tmpStr!="")
{
string[] tmpStr2 = tmpStr.PadLeft(tmpStr.Length-1).Split("`".ToCharArray());
return tmpStr2;
}
else
{
return null;
}
}
/**//*****************************************
* 返回API定义列表
****************************************/
private string[] parseAPI(string[] sSrc)
{
string tmpStr = "";
int i=0;
while(i<sSrc.Length)
{
//从代码段开始
if(sSrc[i].Trim().ToUpper().IndexOf("Attribute ".ToUpper())==0)
{
break;
}
i++;
}
while(i<sSrc.Length)
{
//如果检查到 API 定义
if(sSrc[i].Trim().ToUpper().IndexOf("Private Declare ".ToUpper())==0||sSrc[i].Trim().ToUpper().IndexOf("Public Declare ".ToUpper())==0)
{
string constLine = sSrc[i];
tmpStr += getAPIName(constLine).ToString()+"\r"+constLine+"\r"+getVarDomain(constLine).ToString() + "`";
}
i++;
}
if(tmpStr!="")
{
string[] tmpStr2 = tmpStr.PadLeft(tmpStr.Length-1).Split("`".ToCharArray());
return tmpStr2;
}
else
{
return null;
}
}
/**//*****************************************
* 返回API名称
****************************************/
private string getAPIName(string srcCodeLine)
{
string[] codeList =srcCodeLine.Split(" ".ToCharArray());
string result = "";
for(int i=0; i<codeList.Length;i++)
{
if(codeList[i].Trim().ToUpper()=="Function".ToUpper())
{
if(i+1<=codeList.Length)
{
result = codeList[i+1];
}
break;
}
}
return result;
}
/**//*****************************************
* 返回结构定义列表
****************************************/
private string[] parseVarType(string[] sSrc)
{
string tmpStr = "";
int i=0;
while(i<sSrc.Length)
{
//从代码段开始
if(sSrc[i].Trim().ToUpper().IndexOf("Attribute ".ToUpper())==0)
{
break;
}
i++;
}
while(i<sSrc.Length)
{
//如果检查到 Type 定义
if(sSrc[i].Trim().ToUpper().IndexOf("TYPE ")==0||sSrc[i].Trim().ToUpper().IndexOf(" TYPE ")!=-1)
{
string constLine = sSrc[i];
string s = "";
for(int j=i;j<sSrc.Length;j++,i++)
{
s += sSrc[j] + "\r\n";
if(sSrc[i].Trim().ToUpper().IndexOf("END TYPE")!=-1)
{
break;
}
}
tmpStr += getVarTypeName(constLine).ToString()+"\xff"+s+"\xff"+getVarDomain(constLine).ToString() + "`";
}
i++;
}
if(tmpStr!="")
{
string[] tmpStr2 = tmpStr.PadLeft(tmpStr.Length-1).Split("`".ToCharArray());
return tmpStr2;
}
else
{
return null;
}
}
/**//*****************************************
* 返回结构名称
****************************************/
private string getVarTypeName(string srcCodeLine)
{
string[] codeList =srcCodeLine.Split(" ".ToCharArray());
if(codeList[0].Trim().ToUpper()=="TYPE")
{
return codeList[1].Trim();
}
else
{
return codeList[2].Trim();
}
}
/**//*****************************************
* 返回常量定义列表
****************************************/
private string[] parseVarConst(string[] sSrc)
{
string tmpStr = "";
for(int i=0;i<sSrc.Length;i++)
{
//如果检查到 const 定义
if(sSrc[i].Length>=6){
if(sSrc[i].Substring(0,"CONST ".Length).ToUpper()=="CONST "||sSrc[i].ToUpper().IndexOf(" CONST ")!=-1)
{
string constLine = sSrc[i];
tmpStr += getVarName(constLine).ToString()+"\r"+constLine+"\r"+getVarDomain(constLine).ToString() + "`";
}
}
}
if (tmpStr!="")
{
string[] tmpStr2 = tmpStr.PadLeft(tmpStr.Length-1).Split("`".ToCharArray());
return tmpStr2;
}
else
{
return null;
}
}
/**//*****************************************
* 返回常量名称
****************************************/
private string getVarName(string srcCodeLine)
{
string[] codeList =srcCodeLine.Split(" ".ToCharArray());
if(codeList[0].Trim().ToUpper()=="CONST")
{
return codeList[1].Trim();
}
else
{
return codeList[2].Trim();
}
}
/**//******************************************
* 返回定义作用域说明
*****************************************/
private string getVarDomain(string srcCodeLine)
{
if(srcCodeLine.Trim().ToUpper().IndexOf("Private".ToUpper())!=-1)
{
return "局部共享";
}
else
{
return "全局共享";
}
}
#endregion
private void btnParseProc_Click(object sender, System.EventArgs e)
{
}
/**//**************************************
* 主循环处理内容3
*************************************/
private void callMain2(
System.Windows.Forms.ListView lv1,
string[] listFiles)
{
lv1.Items.Clear();
lv1.Items.Add("事件过程");
for (int i=0;i<listFiles.Length;i++)
{
parseProc(lv1,listFiles[i],loadForm(listFiles[i]));
}
MessageBox.Show("分析完毕!");
}
/**//******************************************
* 处理变量结果并增加结果到listview
*****************************************/
private void parseProc(
System.Windows.Forms.ListView lv1,
string fileName,string s)
{
//1.寻找API声明
//2.寻找过程、函数、事件
if(s==null)return;
s = replace2bank(s);
string[] strLines = s.Split (Environment.NewLine.ToCharArray()); //获取分隔符号
string[] strConstList = parseVarConst(strLines);
//lv.Items.Add("API声明");
if(strConstList!=null)
{
for(int i=0;i<strConstList.Length;i++)
{
if(strConstList[i].Trim()==""){continue;}
string[] smaillList = strConstList[i].Split("\r".ToCharArray());
ListViewItem lvi = new ListViewItem(smaillList,-1);
if(fileName.LastIndexOf("\\")!=-1)
lvi.SubItems.Add(fileName.Substring(fileName.LastIndexOf("\\")+1));
else lvi.SubItems.Add(fileName);
lv1.Items.Add(lvi);
}
}
}
也许你看到这大段的代码,感觉乱七八糟的,那确实;我只是为了满足自己的需要,并且没有封装整理,全在一个Form.cs中,呵呵,所以我带了源码工程;可以下载编译试试看。
也许你用的着。
下载点这里
这个是图例