分享
 
 
 

C#反编译微软MSDN2003的帮助文档,并将反编译结果保存到一个SQLSERVER数据库中

王朝mssql·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

namespace MSDNOUT

{

/// <summary>

/// 反编译微软MSDN2003文档并保存到数据库的程序主窗体

/// </summary>

public class dlgMSDNOut : System.Windows.Forms.Form

{

/******************************************************************************************

声明:本程序只是研究性的程序,没有损害微软对MSDN的版权的意图,并承认

微软对 MSDN , Microsoft Help 2.0 SDK , HXS文件格式,MSDE 等版权所有权

本程序能反编译微软MSDN2003的帮助文档,并将反编译结果保存到一个SQLSERVER数据库中

本文件为一个独立的C#代码文件,不需要依赖任何其他文件,使用VS.NET建立一个

C#的默认名称空间为MSDNOUT的Windows应用程序后将该文件内容覆盖掉系统自动生成

的Form1.cs文件内容即可编译通过并执行,本程序在微软.NET框架1.1简体中文版的

Windows2000Server环境下测试通过, MDAC版本2.7,数据库服务器为MSDE,版本8.00.760(SP3)

本程序假定你将MSDN2003安装在 C:\Program Files\MSDN\2003FEB\2052

还假定安装了 Microsoft Help 2.0 SDK , 并假定安装在目录

"C:\Program Files\Microsoft Help 2.0 SDK" , 该SDK安装文件可在微软网站下载

本程序长时间频繁的读写临时文件,因此可以使用一个虚拟硬盘工具在

物理内存中虚拟一个磁盘,这样可以大大加快程序的运行速度

可在 http://down1.tech.sina.com.cn/cgi-bin/download/download.cgi?s_id=3761&num=1

下载一个虚拟硬盘工具

程序使用的数据库为MSSQLSERVER,在此使用了MSDE,由于MSDE的单个数据库

大小限制在2GB内,而MSDN文件总共超过了2GB,因此程序运行时还根据需要

切换数据库,本程序使用的数据库文件保存在 f:\db 下面

使用前请执行以下SQL语句来初始化数据库

CREATE DATABASE MSDN1 ON (NAME = 'MSDN1', FILENAME = 'f:\db\MSDN1.mdf' )";

CREATE TABLE [MSDNFileList] (

[MFileID] [int] NOT NULL ,

[MFileName] [varchar] (200) COLLATE Chinese_PRC_CI_AS NOT NULL ,

[MDBName] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,

[MFileLength] [int] NULL ,

CONSTRAINT [PK_MSDNFileList] PRIMARY KEY CLUSTERED

(

[MFileName]

) ON [PRIMARY]

) ON [PRIMARY]

GO

CREATE TABLE [MSDNFile] (

[MFileID] [int] NOT NULL ,

[MFileContent] [image] NULL ,

CONSTRAINT [PK_MSDNFile] PRIMARY KEY CLUSTERED

(

[MFileID]

) ON [PRIMARY]

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

*****************************************************************************************/

/// <summary>

/// 取消操作标记

/// </summary>

private bool bolCancel = false ;

/// <summary>

/// 暂停操作标记

/// </summary>

private bool bolPause= false ;

/// <summary>

/// 主数据库连接字符串

/// </summary>

private System.Data.SqlClient.SqlConnection MainConn = null;

/// <summary>

/// 文档数据库连接字符串

/// </summary>

private System.Data.SqlClient.SqlConnection DataConn = null;

/// <summary>

/// 插入文档列表的命令对象

/// </summary>

private System.Data.SqlClient.SqlCommand InsertNameCmd = null;

/// <summary>

/// 查询文档内容的命令对象

/// </summary>

private System.Data.SqlClient.SqlCommand InsertCmd = null;

/// <summary>

/// 保存文档数据的数据库名称

/// </summary>

private string CurrentDBName = "MSDN1" ;

/// <summary>

/// 进行数据处理的线程对象

/// </summary>

private System.Threading.Thread myThread = null;

/// <summary>

/// 初始化数据库连接

/// </summary>

private void InitDB()

{

if( MainConn != null)

{

MainConn.Dispose();

DataConn.Dispose();

InsertNameCmd.Dispose();

}

// 打开数据库连接

MainConn = new System.Data.SqlClient.SqlConnection();

DataConn = new System.Data.SqlClient.SqlConnection();

MainConn.ConnectionString = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=MSDN1;Data Source=(local)";

DataConn.ConnectionString = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=" + CurrentDBName + ";Data Source=(local)";

MainConn.Open();

DataConn.Open();

InsertNameCmd = MainConn.CreateCommand();

InsertNameCmd.CommandText = "INSERT INTO MSDNFileList(MFileID, MFileName, MDBName, MFileLength) VALUES (@MFileID, @MFileName, @MDBName, @MFileLength) ";

InsertNameCmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@MFileID", System.Data.SqlDbType.Int, 4, "MFileID"));

InsertNameCmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@MFileName", System.Data.SqlDbType.VarChar, 200, "MFileName"));

InsertNameCmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@MDBName", System.Data.SqlDbType.VarChar, 10, "MDBName"));

InsertNameCmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@MFileLength", System.Data.SqlDbType.Int, 4, "MFileLength"));

InitInsertCmd();

}

/// <summary>

/// 初始化插入数据内容的命令对象

/// </summary>

private void InitInsertCmd()

{

if( InsertCmd != null)

InsertCmd.Dispose();

InsertCmd = DataConn.CreateCommand();

InsertCmd.CommandText = "INSERT INTO MSDNFile(MFileID, MFileContent) VALUES (@MFileID, @MFileContent)";

InsertCmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@MFileID", System.Data.SqlDbType.Int, 4, "MFileID"));

InsertCmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@MFileContent", System.Data.SqlDbType.VarBinary, 2147483647, "MFileContent"));

}

/// <summary>

/// 反编译MSDN文档的主程序

/// </summary>

private void MsdnOut()

{

try

{

// 检查MSDN安装目录

string strMSDNDir =@"C:\Program Files\MSDN\2003FEB\2052";

if( System.IO.Directory.Exists( strMSDNDir) == false)

return ;

// 检查反编译器程序

string strExeFile = @"C:\Program Files\Microsoft Help 2.0 SDK\hxcomp.exe";

if( System.IO.File.Exists( strExeFile ) == false)

return ;

// 准备临时文件目录

string strOutDir = this.txtOutPath.Text ;

if( strOutDir == null || strOutDir.Trim().Length == 0)

return ;

strOutDir = strOutDir.Trim();

if( System.IO.Directory.Exists( strOutDir ) == false)

System.IO.Directory.CreateDirectory( strOutDir );

string strTempPath = System.IO.Path.Combine( strOutDir , "temp");

if( System.IO.Directory.Exists( strTempPath ) == false)

System.IO.Directory.CreateDirectory( strTempPath );

bolCancel = false;

bolPause = false;

InitDB();

using(System.Data.SqlClient.SqlCommand myCmd = MainConn.CreateCommand())

{

myCmd.CommandText = "Delete From MSDNFile";

myCmd.ExecuteNonQuery();

myCmd.CommandText = "Delete From MSDNFileList";

myCmd.ExecuteNonQuery();

}

int DBCount = 1 ;

long FileSizeCount = 0 ;

long TotalFileSize = 0 ;

int FileCount = 0 ;

string[] strFileNames = System.IO.Directory.GetFiles( strMSDNDir , "*.hxs");

this.InvokeSetLabelText( this.lblDB , "当前数据库:" + CurrentDBName );

InvokeSetProgress( this.MainProgress , strFileNames.Length , 0 );

long HXSFileSize = 0 ;

// 计算所有要处理的文件的长度

foreach( string strFileName in strFileNames)

{

System.IO.FileInfo myInfo = new System.IO.FileInfo( strFileName );

HXSFileSize += myInfo.Length ;

}

long HXFileSizeCount = 0 ;

// 计算单个数据库所能保存的数据大小,在此设置为1000MB

int DBMaxSize = 1000 * 1024 * 1024 ;

// 分别处理单个HXS文档

for(int HXSFileCount = 0 ; HXSFileCount < strFileNames.Length ; HXSFileCount ++ )

{

if( bolCancel )

break;

string strFileName = ( string ) strFileNames[ HXSFileCount ];

System.IO.FileInfo myInfo = new System.IO.FileInfo( strFileName );

HXFileSizeCount += myInfo.Length ;

InvokeSetProgress( this.MainProgress , (int)(HXSFileSize >> 5) , (int)( HXFileSizeCount >> 5 ) );

string strModleName = System.IO.Path.GetFileNameWithoutExtension( strFileName ) + "\\" ;

InvokeSetLabelText( lblFile , "正在处理第 " + HXSFileCount + " 个文件 " + System.IO.Path.GetFileName( strFileName ) + " " + myInfo.Length + " 字节 ..." );

InvokeSetLabelText( lblState ,"正在反编译..." );

string strOutSubDir = System.IO.Path.Combine( strOutDir ,"temp");

if( System.IO.Directory.Exists( strOutSubDir) == false)

System.IO.Directory.CreateDirectory( strOutSubDir );

int BasePathLength = ( strOutSubDir.EndsWith("\\") ? strOutSubDir.Length : strOutSubDir.Length + 1 ) ;

// 执行命令行程序来反编译HXS文档

string strCmd = " -d " + strOutSubDir + " -u \"" + strFileName + "\" -i -e -w -q";

System.Diagnostics.ProcessStartInfo myPInfo = new System.Diagnostics.ProcessStartInfo( strExeFile , strCmd );

myPInfo.CreateNoWindow = true;

myPInfo.UseShellExecute = false;

System.Diagnostics.Process myProcess = System.Diagnostics.Process.Start( myPInfo );

myProcess.WaitForExit();

if( bolCancel )

break;

// 找到所有反编译所得的文件

System.Collections.ArrayList myNames = GetFileNames( strOutSubDir );

InvokeSetLabelText(lblState , "正在导入到数据库,共 " + myNames.Count + " 个文件 ..." );

for( int iCount = 0 ; iCount < myNames.Count ; iCount ++ )

{

try

{

if( bolPause ) myThread.Suspend();

bolPause = false;

InvokeSetProgress( this.myProgress , myNames.Count , iCount );

if( bolCancel )

break;

// 读取临时文件数据

string strTempFileName = (string)myNames[iCount];

System.IO.FileInfo myTempInfo = new System.IO.FileInfo( strTempFileName );

byte[] bytData = new byte[ (int)myTempInfo.Length ];

System.IO.FileStream myFile = new System.IO.FileStream( strTempFileName , System.IO.FileMode.Open );

myFile.Read( bytData , 0 , bytData.Length );

myFile.Close();

InsertNameCmd.Parameters[0].Value = FileCount;

InsertNameCmd.Parameters[1].Value = strModleName + strTempFileName.Substring( BasePathLength );

InsertNameCmd.Parameters[2].Value = CurrentDBName ;

InsertNameCmd.Parameters[3].Value = bytData.Length ;

InsertCmd.Parameters[0].Value = FileCount ;

InsertCmd.Parameters[1].Value = bytData ;

if( bolCancel )

break;

InsertNameCmd.ExecuteNonQuery();

InsertCmd.ExecuteNonQuery();

FileSizeCount += bytData.Length ;

TotalFileSize += bytData.Length ;

FileCount ++ ;

// 更换数据库

if( FileSizeCount > DBMaxSize )

{

DBCount ++ ;

CurrentDBName = "MSDN" + DBCount.ToString();

InvokeSetLabelText( lblState , "更换数据库为 " + CurrentDBName );

InsertCmd.Dispose();

using( System.Data.SqlClient.SqlCommand myCmd = MainConn.CreateCommand())

{

myCmd.CommandText ="CREATE DATABASE " + CurrentDBName + " ON (NAME = '" + CurrentDBName + "', FILENAME = 'f:\\db\\" + CurrentDBName + ".mdf' )";

myCmd.ExecuteNonQuery();

}

InsertCmd.Dispose();

DataConn.ChangeDatabase( CurrentDBName );

using( System.Data.SqlClient.SqlCommand myCmd = DataConn.CreateCommand())

{

myCmd.CommandText = @"

CREATE TABLE [MSDNFile] (

[MFileID] [int] NOT NULL ,

[MFileContent] [image] NULL ,

CONSTRAINT [PK_MSDNFile] PRIMARY KEY CLUSTERED

(

[MFileID]

) ON [PRIMARY]

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

";

myCmd.ExecuteNonQuery();

}//using

InvokeSetLabelText(lblDB , "当前数据库:" + CurrentDBName );

InitInsertCmd();

FileSizeCount = 0 ;

}//if

}//try

catch(Exception ext)

{

System.Windows.Forms.MessageBox.Show( ext.ToString());

InitDB();

FileCount ++ ;

}

}//for

InvokeSetProgress( this.myProgress , myNames.Count , 0 );

InvokeSetLabelText( lblState , "正在删除临时文件..." );

System.IO.Directory.Delete( strOutSubDir , true );

InvokeSetLabelText( lblState , "操作完毕");

}//for

string strDir2 = System.IO.Path.Combine( strOutDir ,"temp");

if( System.IO.Directory.Exists( strDir2 ))

System.IO.Directory.Delete( strDir2 , true );

InsertNameCmd.Dispose();

InsertCmd.Dispose();

InvokeSetProgress( this.MainProgress ,1 , 0 );

}//try

catch(Exception ext)

{

System.Windows.Forms.MessageBox.Show( ext.ToString());

}

this.BeginInvoke( new System.EventHandler( this.EndProcess) , new object[]{null,null});

MainConn.Close();

MainConn.Dispose();

DataConn.Close();

DataConn.Dispose();

}//public void MsdnOut()

/// <summary>

/// 获得指定目录及下层目录下所有的文件的绝对路径文件名

/// </summary>

/// <param name="strRootDir">根目录</param>

/// <returns>保存文件名的列表对象</returns>

public System.Collections.ArrayList GetFileNames( string strRootDir)

{

System.Collections.ArrayList myList = new System.Collections.ArrayList();

string[] strNames = System.IO.Directory.GetFiles( strRootDir , "*.*");

if( strNames != null && strNames.Length > 0 )

{

myList.AddRange( strNames );

}

strNames = System.IO.Directory.GetDirectories( strRootDir , "*.*");

if( strNames != null && strNames.Length > 0 )

{

foreach( string strDir in strNames )

{

myList.AddRange( GetFileNames ( strDir ));

}

}

return myList ;

}//public GetFileNames()

#region 处理用户界面的代码群 **************************************************************

public delegate void SetLabelTextHandler( System.Windows.Forms.Label lbl , string Text );

public delegate void SetProgressBarHandler( System.Windows.Forms.ProgressBar pb , int vMaxValue , int vValue);

private void InvokeSetProgress( System.Windows.Forms.ProgressBar pb , int vMaxValue , int vValue)

{

this.Invoke( new SetProgressBarHandler( this.SetProgressBar ) , new object[]{ pb , vMaxValue , vValue });

}

private void InvokeSetLabelText( System.Windows.Forms.Label lbl , string Text )

{

this.Invoke( new SetLabelTextHandler( this.SetLabelText ) , new object[]{ lbl , Text });

}

private void SetLabelText( System.Windows.Forms.Label lbl , string Text )

{

lbl.Text = Text ;

lbl.Refresh();

}

private void SetProgressBar ( System.Windows.Forms.ProgressBar pb , int vMaxValue , int vValue)

{

if( pb.Maximum != vMaxValue )

pb.Maximum = vMaxValue ;

if( vValue >= 0 && vValue <= vMaxValue )

pb.Value = vValue ;

}

private void EndProcess( object sender , System.EventArgs e )

{

txtOutPath.Enabled= true;

cmdStart.Enabled= true;

cmdStop.Enabled= false;

cmdPose.Enabled= false;

}

private void cmdStart_Click(object sender, System.EventArgs e)

{

cmdStart.Enabled= false;

txtOutPath.Enabled= false;

cmdStop.Enabled= true;

cmdPose.Enabled= true;

System.Threading.ThreadStart st = new System.Threading.ThreadStart( this.MsdnOut );

myThread = new System.Threading.Thread(st);

myThread.Start();

}

private void cmdStop_Click(object sender, System.EventArgs e)

{

bolCancel = true;

}

private void cmdPose_Click(object sender, System.EventArgs e)

{

bolPause = true;

System.Windows.Forms.MessageBox.Show("正在暂停");

bolPause = false;

myThread.Resume();

}

#endregion

#region 系统自动生成的代码 ****************************************************************

private System.Windows.Forms.Label label1;

private System.Windows.Forms.TextBox txtOutPath;

private System.Windows.Forms.Label lblFile;

private System.Windows.Forms.Button cmdStart;

private System.Windows.Forms.Button cmdStop;

private System.Windows.Forms.Label lblDB;

private System.Windows.Forms.Label lblState;

private System.Windows.Forms.ProgressBar myProgress;

private System.Windows.Forms.ProgressBar MainProgress;

private System.Windows.Forms.Button cmdPose;

/// <summary>

/// 必需的设计器变量。

/// </summary>

private System.ComponentModel.Container components = null;

public dlgMSDNOut()

{

//

// Windows 窗体设计器支持所必需的

//

InitializeComponent();

//

// TODO: 在 InitializeComponent 调用后添加任何构造函数代码

//

}

/// <summary>

/// 清理所有正在使用的资源。

/// </summary>

protected override void Dispose( bool disposing )

{

if( disposing )

{

if(components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

/// <summary>

/// 应用程序的主入口点。

/// </summary>

[STAThread]

static void Main(string[] args)

{

System.Windows.Forms.Application.Run( new dlgMSDNOut());

}//main

#endregion

#region Windows 窗体设计器生成的代码 ******************************************************

/// <summary>

/// 设计器支持所需的方法 - 不要使用代码编辑器修改

/// 此方法的内容。

/// </summary>

private void InitializeComponent()

{

this.label1 = new System.Windows.Forms.Label();

this.txtOutPath = new System.Windows.Forms.TextBox();

this.lblFile = new System.Windows.Forms.Label();

this.cmdStart = new System.Windows.Forms.Button();

this.cmdStop = new System.Windows.Forms.Button();

this.lblDB = new System.Windows.Forms.Label();

this.lblState = new System.Windows.Forms.Label();

this.myProgress = new System.Windows.Forms.ProgressBar();

this.MainProgress = new System.Windows.Forms.ProgressBar();

this.cmdPose = new System.Windows.Forms.Button();

this.SuspendLayout();

//

// label1

//

this.label1.AutoSize = true;

this.label1.Location = new System.Drawing.Point(16, 16);

this.label1.Name = "label1";

this.label1.Size = new System.Drawing.Size(72, 17);

this.label1.TabIndex = 0;

this.label1.Text = "临时文件夹:";

//

// txtOutPath

//

this.txtOutPath.Location = new System.Drawing.Point(96, 16);

this.txtOutPath.Name = "txtOutPath";

this.txtOutPath.Size = new System.Drawing.Size(352, 21);

this.txtOutPath.TabIndex = 1;

this.txtOutPath.Text = "c:\\msdnout";

//

// lblFile

//

this.lblFile.AutoSize = true;

this.lblFile.Location = new System.Drawing.Point(16, 168);

this.lblFile.Name = "lblFile";

this.lblFile.Size = new System.Drawing.Size(91, 17);

this.lblFile.TabIndex = 2;

this.lblFile.Text = "当前处理的文件";

//

// cmdStart

//

this.cmdStart.Location = new System.Drawing.Point(16, 48);

this.cmdStart.Name = "cmdStart";

this.cmdStart.TabIndex = 3;

this.cmdStart.Text = "开始";

this.cmdStart.Click += new System.EventHandler(this.cmdStart_Click);

//

// cmdStop

//

this.cmdStop.Location = new System.Drawing.Point(96, 48);

this.cmdStop.Name = "cmdStop";

this.cmdStop.TabIndex = 4;

this.cmdStop.Text = "结束";

this.cmdStop.Click += new System.EventHandler(this.cmdStop_Click);

//

// lblDB

//

this.lblDB.AutoSize = true;

this.lblDB.Location = new System.Drawing.Point(16, 88);

this.lblDB.Name = "lblDB";

this.lblDB.Size = new System.Drawing.Size(66, 17);

this.lblDB.TabIndex = 5;

this.lblDB.Text = "当前数据库";

//

// lblState

//

this.lblState.AutoSize = true;

this.lblState.Location = new System.Drawing.Point(16, 112);

this.lblState.Name = "lblState";

this.lblState.Size = new System.Drawing.Size(29, 17);

this.lblState.TabIndex = 6;

this.lblState.Text = "状态";

//

// myProgress

//

this.myProgress.Location = new System.Drawing.Point(16, 136);

this.myProgress.Name = "myProgress";

this.myProgress.Size = new System.Drawing.Size(432, 23);

this.myProgress.TabIndex = 7;

//

// MainProgress

//

this.MainProgress.Location = new System.Drawing.Point(16, 192);

this.MainProgress.Name = "MainProgress";

this.MainProgress.Size = new System.Drawing.Size(432, 23);

this.MainProgress.TabIndex = 8;

//

// cmdPose

//

this.cmdPose.Enabled = false;

this.cmdPose.Location = new System.Drawing.Point(176, 48);

this.cmdPose.Name = "cmdPose";

this.cmdPose.TabIndex = 9;

this.cmdPose.Text = "暂停";

this.cmdPose.Click += new System.EventHandler(this.cmdPose_Click);

//

// dlgMSDNOut

//

this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);

this.ClientSize = new System.Drawing.Size(466, 223);

this.Controls.Add(this.cmdPose);

this.Controls.Add(this.MainProgress);

this.Controls.Add(this.myProgress);

this.Controls.Add(this.lblState);

this.Controls.Add(this.lblDB);

this.Controls.Add(this.lblFile);

this.Controls.Add(this.txtOutPath);

this.Controls.Add(this.label1);

this.Controls.Add(this.cmdStop);

this.Controls.Add(this.cmdStart);

this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;

this.MaximizeBox = false;

this.Name = "dlgMSDNOut";

this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;

this.Text = "导出MSDN";

this.ResumeLayout(false);

}

#endregion

}//public class dlgMSDNOut

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有