C#软件加序列号激活

C#软件加序列号激活
C#软件加序列号激活

C#软件加序列号激活、试用期限

道高一尺,魔高一丈。

程序员想尽各种办法给软件加密,用户就想尽各种办法对软件破解。

现在做软件试用限制,那么就讨论下软件的试用限制。总体来说,限制的方法有这么几种:

1.时间限制。

2.次数限制。

以时间限制为例,主要是用户从安装之日起,限制用户使用天数。n天之后,就无法使用。这种限制主要是安装的时候,将当前日期写入注册表(或者硬盘上某文件)。当然,写入的是加密过的乱码字符。运行软件时,首先读取注册表(或者文件),如找不到注册表(或者文件),则提示软件未注册。当正常读取后进行解密,得到注册日期,与当前日期进行比较,如果当前日期减去注册日期> n(允许试用天数),那么提示软件试用到期,直接退出软件。否则提示可试用天数,继续试用软件。根据以上思路,那么用户可以很容易破解软件。比如更改系统日期、或者删除注册表,重新安装软件等。

针对用户的破解,对软件限制进行修改。如果试用软件必须联网,或者需要服务器端(比如聊天软件等客户端软件),当前时间要从去服务器的时间,防止用户更改客户机系统时间。或者服务器上对客户机进行记录,如记录主板id,安装时间,等等。。。

以上为客户机可联网的做法,当客户机无法上网,切不存在服务器,或者服务器就在本机时。以上做法将无法使用。

那么对于单机运行的软件,如果需要数据库,我们可以将注册时间等信息写入数据库。或者,我们可以采用一明一暗的做法,注册表是明,在硬盘的某角落,存放隐藏文件。软件需读取两处,对两处进行比较,一致则通过,不一致就退出程序。当然,安装的时候对该文件不替换。我想用户是不愿意为了使用你的软件而格式化整个硬盘的。

其实还有做法,就是每次运行软件,先将当前日期与注册表对比,看是否过期。如未过期,就对注册表进行一次更改,更改为当前日期,那么用户即使更改系统日期,他的试用期限也在逐渐缩小。为了防止用户重装,还是采用一明一暗的做法。

基本上就这些方法吧.. 贴上测试代码:

加密解密类:

using System;

using System.Data;

using System.Configuration;

using System.Linq;

using System.Xml.Linq;

using System.IO;

using System.Text;

using System.Security.Cryptography;

namespace Add_To_Regedit

{

public class Encryption

{

public static string EncryPW(string Pass, string Key)

{

return DesEncrypt(Pass, Key);

}

public static string DisEncryPW(string strPass, string Key)

{

return DesDecrypt(strPass, Key);

}

/////////////////////////////////////////////////////////////////////

///

/// DES加密

///

///

///

public static string DesEncrypt(string encryptString, string key)

{

byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));

byte[] keyIV = keyBytes;

byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString); DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStream();

CryptoStream cStream = new CryptoStream(mStream, provider.CreateEncryptor(keyBytes, keyIV), CryptoStreamMode.Write);

cStream.Write(inputByteArray, 0, inputByteArray.Length);

cStream.FlushFinalBlock();

return Convert.ToBase64String(mStream.ToArray());

}

///

/// DES解密

///

///

///

public static string DesDecrypt(string decryptString, string key)

{

byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));

byte[] keyIV = keyBytes;

byte[] inputByteArray = Convert.FromBase64String(decryptString); DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStream();

CryptoStream cStream = new CryptoStream(mStream,

provider.CreateDecryptor(keyBytes, keyIV), CryptoStreamMode.Write);

cStream.Write(inputByteArray, 0, inputByteArray.Length);

cStream.FlushFinalBlock();

return Encoding.UTF8.GetString(mStream.ToArray());

}

//////////////////////////////////////////////////////

}

}

读写注册表类:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Management;

using System.Security.Cryptography;

using Microsoft.Win32;

namespace Test_Form_Time

{

class TimeClass

{

public static int InitRegedit()

{

/*检查注册表*/

string SericalNumber = ReadSetting("", "SerialNumber", "-1"); // 读取注册表,检查是否注册-1为未注册

if (SericalNumber == "-1")

{

return 1;

}

/* 比较CPUid */

string CpuId = GetSoftEndDateAllCpuId(1, SericalNumber); //从注册表读取CPUid string CpuIdThis = GetCpuId(); //获取本机CPUId

if (CpuId != CpuIdThis)

{

return 2;

}

/* 比较时间*/

string NowDate = TimeClass.GetNowDate();

string EndDate = TimeClass.GetSoftEndDateAllCpuId(0, SericalNumber);

if (Convert.ToInt32(EndDate) - Convert.ToInt32(NowDate) < 0)

{

return 3;

}

return 0;

}

/*CPUid*/

public static string GetCpuId()

{

ManagementClass mc = new ManagementClass("Win32_Processor"); ManagementObjectCollection moc = mc.GetInstances();

string strCpuID = null;

foreach (ManagementObject mo in moc)

{

strCpuID = mo.Properties["ProcessorId"].Value.ToString();

break;

}

return strCpuID;

}

/*当前时间*/

public static string GetNowDate()

{

string NowDate = DateTime.Now.ToString("yyyyMMdd"); //.Year + DateTime.Now.Month + DateTime.Now.Day).ToString();

// DateTime date = Convert.ToDateTime(NowDate, "yyyy/MM/dd");

return NowDate;

}

/* 生成序列号*/

public static string CreatSerialNumber()

{

string SerialNumber = GetCpuId() + "-" + "20110915";

return SerialNumber;

}

/*

* i=1 得到CUP 的id

* i=0 得到上次或者开始时间

*/

public static string GetSoftEndDateAllCpuId(int i, string SerialNumber)

{

if (i == 1)

{

string cupId = SerialNumber.Substring(0, https://www.360docs.net/doc/825060181.html,stIndexOf("-"));

// .LastIndexOf("-"));

return cupId;

}

if (i == 0)

{

string dateTime = SerialNumber.Substring(https://www.360docs.net/doc/825060181.html,stIndexOf("-") + 1);

// dateTime = dateTime.Insert(4, "/").Insert(7, "/");

// DateTime date = Convert.ToDateTime(dateTime);

return dateTime;

}

else

return string.Empty;

}

}

/*写入注册表*/

public static void WriteSetting(string Section, string Key, string Setting) // name = key value=setting Section= path

{

string text1 = Section;

RegistryKey key1 =

Registry.CurrentUser.CreateSubKey("Software\\MyTest_ChildPlat\\ChildPlat");

// .LocalMachine.CreateSubKey("Software\\mytest");

if (key1 == null)

{

return;

}

try

{

key1.SetValue(Key, Setting);

}

catch (Exception exception1)

{

return;

}

finally

{

key1.Close();

}

}

/*读取注册表*/

public static string ReadSetting(string Section, string Key, string Default)

{

if (Default == null)

{

Default = "-1";

}

string text2 = Section;

RegistryKey key1 =

Registry.CurrentUser.OpenSubKey("Software\\MyTest_ChildPlat\\ChildPlat");

if (key1 != null)

{

object obj1 = key1.GetValue(Key, Default);

key1.Close();

if (obj1 != null)

if (!(obj1 is string))

{

return "-1";

}

string obj2 = obj1.ToString();

obj2 = Encryption.DisEncryPW(obj2, "ejiang11");

return obj2;

}

return "-1";

}

return Default;

}

}

}

调用方式如下:

int res = TimeClass.InitRegedit();

if (res == 0)

{

Application.Run(new Form1());

}

else if(res == 1)

{

MessageBox.Show("软件尚未注册,请注册软件!");

}

else if (res == 2)

{

MessageBox.Show("注册机器与本机不一致,请联系管理员!");

}

else if (res == 3)

{

MessageBox.Show("软件试用已到期!");

}

else

{

MessageBox.Show("软件运行出错,请重新启动!");

}

道高一尺,魔高一丈。

程序员想尽各种办法给软件加密,用户就想尽各种办法对软件破解。

现在做软件试用限制,那么就讨论下软件的试用限制。总体来说,限制的方法有这么几种:

1.时间限制。

2.次数限制。

以时间限制为例,主要是用户从安装之日起,限制用户使用天数。n天之后,就无法使用。这种限制主要是安装的时候,将当前日期写入注册表(或者硬盘上某文件)。当然,写入的

是加密过的乱码字符。运行软件时,首先读取注册表(或者文件),如找不到注册表(或者文件),则提示软件未注册。当正常读取后进行解密,得到注册日期,与当前日期进行比较,如果当前日期减去注册日期> n(允许试用天数),那么提示软件试用到期,直接退出软件。否则提示可试用天数,继续试用软件。根据以上思路,那么用户可以很容易破解软件。比如更改系统日期、或者删除注册表,重新安装软件等。

针对用户的破解,对软件限制进行修改。如果试用软件必须联网,或者需要服务器端(比如聊天软件等客户端软件),当前时间要从去服务器的时间,防止用户更改客户机系统时间。或者服务器上对客户机进行记录,如记录主板id,安装时间,等等。。。

以上为客户机可联网的做法,当客户机无法上网,切不存在服务器,或者服务器就在本机时。以上做法将无法使用。

那么对于单机运行的软件,如果需要数据库,我们可以将注册时间等信息写入数据库。或者,我们可以采用一明一暗的做法,注册表是明,在硬盘的某角落,存放隐藏文件。软件需读取两处,对两处进行比较,一致则通过,不一致就退出程序。当然,安装的时候对该文件不替换。我想用户是不愿意为了使用你的软件而格式化整个硬盘的。

其实还有做法,就是每次运行软件,先将当前日期与注册表对比,看是否过期。如未过期,就对注册表进行一次更改,更改为当前日期,那么用户即使更改系统日期,他的试用期限也在逐渐缩小。为了防止用户重装,还是采用一明一暗的做法。

基本上就这些方法吧.. 贴上测试代码:

加密解密类:

using System;

using System.Data;

using System.Configuration;

using System.Linq;

using System.Xml.Linq;

using System.IO;

using System.Text;

using System.Security.Cryptography;

namespace Add_To_Regedit

{

public class Encryption

{

public static string EncryPW(string Pass, string Key)

{

return DesEncrypt(Pass, Key);

}

public static string DisEncryPW(string strPass, string Key)

{

return DesDecrypt(strPass, Key);

}

/////////////////////////////////////////////////////////////////////

///

/// DES加密

///

///

///

public static string DesEncrypt(string encryptString, string key)

{

byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));

byte[] keyIV = keyBytes;

byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString); DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStream();

CryptoStream cStream = new CryptoStream(mStream, provider.CreateEncryptor(keyBytes, keyIV), CryptoStreamMode.Write);

cStream.Write(inputByteArray, 0, inputByteArray.Length);

cStream.FlushFinalBlock();

return Convert.ToBase64String(mStream.ToArray());

}

///

/// DES解密

///

///

///

public static string DesDecrypt(string decryptString, string key)

{

byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));

byte[] keyIV = keyBytes;

byte[] inputByteArray = Convert.FromBase64String(decryptString); DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStream();

CryptoStream cStream = new CryptoStream(mStream,

provider.CreateDecryptor(keyBytes, keyIV), CryptoStreamMode.Write);

cStream.Write(inputByteArray, 0, inputByteArray.Length);

cStream.FlushFinalBlock();

return Encoding.UTF8.GetString(mStream.ToArray());

}

//////////////////////////////////////////////////////

}

}

读写注册表类:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Management;

using System.Security.Cryptography;

using Microsoft.Win32;

namespace Test_Form_Time

{

class TimeClass

{

public static int InitRegedit()

{

/*检查注册表*/

string SericalNumber = ReadSetting("", "SerialNumber", "-1"); // 读取注册表,检查是否注册-1为未注册

if (SericalNumber == "-1")

{

return 1;

}

/* 比较CPUid */

string CpuId = GetSoftEndDateAllCpuId(1, SericalNumber); //从注册表读取CPUid string CpuIdThis = GetCpuId(); //获取本机CPUId

if (CpuId != CpuIdThis)

{

return 2;

}

/* 比较时间*/

string NowDate = TimeClass.GetNowDate();

string EndDate = TimeClass.GetSoftEndDateAllCpuId(0, SericalNumber);

if (Convert.ToInt32(EndDate) - Convert.ToInt32(NowDate) < 0)

{

return 3;

}

return 0;

}

/*CPUid*/

public static string GetCpuId()

{

ManagementClass mc = new ManagementClass("Win32_Processor"); ManagementObjectCollection moc = mc.GetInstances();

string strCpuID = null;

foreach (ManagementObject mo in moc)

{

strCpuID = mo.Properties["ProcessorId"].Value.ToString();

break;

}

return strCpuID;

}

/*当前时间*/

public static string GetNowDate()

{

string NowDate = DateTime.Now.ToString("yyyyMMdd"); //.Year + DateTime.Now.Month + DateTime.Now.Day).ToString();

// DateTime date = Convert.ToDateTime(NowDate, "yyyy/MM/dd");

return NowDate;

}

/* 生成序列号*/

public static string CreatSerialNumber()

{

string SerialNumber = GetCpuId() + "-" + "20110915";

return SerialNumber;

}

/*

* i=1 得到CUP 的id

* i=0 得到上次或者开始时间

*/

public static string GetSoftEndDateAllCpuId(int i, string SerialNumber)

{

if (i == 1)

{

string cupId = SerialNumber.Substring(0, https://www.360docs.net/doc/825060181.html,stIndexOf("-"));

// .LastIndexOf("-"));

return cupId;

}

if (i == 0)

{

string dateTime = SerialNumber.Substring(https://www.360docs.net/doc/825060181.html,stIndexOf("-") + 1);

// dateTime = dateTime.Insert(4, "/").Insert(7, "/");

// DateTime date = Convert.ToDateTime(dateTime);

return dateTime;

}

else

{

return string.Empty;

}

}

/*写入注册表*/

public static void WriteSetting(string Section, string Key, string Setting) // name = key value=setting Section= path

{

string text1 = Section;

RegistryKey key1 =

Registry.CurrentUser.CreateSubKey("Software\\MyTest_ChildPlat\\ChildPlat"); // .LocalMachine.CreateSubKey("Software\\mytest");

if (key1 == null)

{

return;

}

try

{

key1.SetValue(Key, Setting);

}

catch (Exception exception1)

{

return;

}

finally

{

key1.Close();

}

}

/*读取注册表*/

public static string ReadSetting(string Section, string Key, string Default) {

if (Default == null)

{

Default = "-1";

}

string text2 = Section;

RegistryKey key1 =

Registry.CurrentUser.OpenSubKey("Software\\MyTest_ChildPlat\\ChildPlat"); if (key1 != null)

{

object obj1 = key1.GetValue(Key, Default);

key1.Close();

if (obj1 != null)

{

if (!(obj1 is string))

{

return "-1";

}

string obj2 = obj1.ToString();

obj2 = Encryption.DisEncryPW(obj2, "ejiang11");

return obj2;

}

return "-1";

}

return Default;

}

}

}

调用方式如下:

int res = TimeClass.InitRegedit();

if (res == 0)

{

Application.Run(new Form1());

}

else if(res == 1)

{

MessageBox.Show("软件尚未注册,请注册软件!");

}

else if (res == 2)

{

MessageBox.Show("注册机器与本机不一致,请联系管理员!"); }

else if (res == 3)

{

MessageBox.Show("软件试用已到期!");

}

else

{

MessageBox.Show("软件运行出错,请重新启动!");

}

机器码获取生成注册码

机器码获取生成注册码 通过获取硬盘的物理序列号和网卡MAC地址,为您的程序提供了获取唯一的机器码,你可以根据此码,生成自己产品注册码,有效防止软件的盗版可以自己根据获取到的硬盘序列号和网卡MAC地址进行一定的加密算法生成,唯一的机器码. 给自己的软件制作注册码.从今天起,您开发的的任何软件如果您愿意都可以为之加密 --为您的软件制作一款注册机!当您看完这篇文章时, 您就可以理直气壮的告诉您的用户 : "喂, 想用我的软件是吧 ? 掏钱!". 呵呵, 这当然只是给自己壮胆的话, 现在连万能注册机都有了, 人家还怕啥 ? 不过只要您想想微软, 人家再牛B的加密技术都会被国人"鄙视"? 但人家不也在中国大把大把的捞钱吗?OK, 不扯了, 我们进入正题.同一般的软件注册一样, 我们这里的注册是这样进行的: 1. 首先根据用户的硬件信息生成24位的机器码 -- 相当于种子,用于生成随机数 2. 采用注册机根据特征数字生成一个24位注册码 -- 相当于伪随机数生成器, 输出长度自己定, 最后用一个格式化函数,将随机数映射到ASCII字符集合 3. 用户输入注册码注册成功 假设客户很喜欢您的软件, 也假设他没有破解, 他需要通过以下方式向您取得注册码: (1).如果他能上网, 他需要把机器码用Email发给您; (2).如果他不能上网, 他可以把机器码用手机短信的方式发给您. (3).如果他没有手机, 他可以带着机器码然后坐火车到您的办公室想您要一个注册码. --第3条只是为了让您看帖子的时候别太枯燥了, 抱歉. 现在, 您拿到了客户的机器码后, 如果您同时也收到了他汇的钱, 呵呵, 好像给软件加密就是为了要钱吧? 那么您就可以用客户的机器码生成一个唯一的注册码再用同样的方式给用户, 最后, 用户输入注册码即可! 需要强调的是客户机器的硬件信息获取方式是有很多种选择的. 这里我们选择最放心的两个硬件: CUP的序列号和硬盘的卷标号. 好了,下面您就可以一步一步制作一款软件注册机了. 步骤一: 获得CUP序列号和硬盘序列号的实现代码如下:Java代码 #region 获取cpu的序列号 public string getCpu() { string strCpu = null; ManagementClass myCpu = new ManagementClass("win32_Processor");

版本发布命名规范

1. 1.版本命名规范 软件版本号有四部分组成,第一部分为主版本号,第二部分为次版本号,第三部分为修订版 本号,第四部分为日期版本号加希腊字母版本号,希腊字母版本号共有五种,分别为base、alpha、beta 、RC 、 release 2. 2.软件版本阶段说明 Base:此版本表示该软件仅仅是一个假页面链接,通常包括所有的功能和页面布局,但是页面中的功能都没有做完整的实现,只是做为整体网站的一个基础架构。 Alpha :软件的初级版本,表示该软件在此阶段以实现软件功能为主,通常只在软件开发者内部交流,一般而言,该版本软件的Bug较多,需要继续修改,是测试版本。测试人员提交Bug经开发人员修改确认之后,发布到测试网址让测试人员测试,此时可将软件版本标注为alpha版。 Beta :该版本相对于Alpha 版已经有了很大的进步,消除了严重错误,但还需要经过多次测试来进一步消除,此版本主要的修改对象是软件的UI。 修改的的Bug 经测试人员测试确认后可发布到外网上,此时可将软件版本标注为 beta版。 RC :该版本已经相当成熟了,基本上不存在导致错误的Bug,与即将发行的正式版本相差无几。 Release:该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式的版本,是最终交付用户使用的一个版本。该版本有时也称标准版。 3. 3.版本号修改规则

(1)主版本号:当功能模块有较大的变动,比如增加模块或是整体架构发生变化。此版本号由项目决定是否修改。 (2)次版本号:相对于主版本号而言,次版本号的升级对应的只是局部的变动,但该局部的变动造成程序和以前版本不能兼容,或者对该程序以前的协作关系产生了破坏,或者是功能上有大的改进或增强。此版本号由项目决定是否修改。 (3)修订版本号:一般是Bug 的修复或是一些小的变动或是一些功能的扩充,要经常发布修订版,修复一个严重 Bug 即可发布一个修订版。此版本号由项目经理决定是否修改。 (4)日期版本号:用于记录修改项目的当前日期,每天对项目的修改都需要更改日期版本号。此版本号由开发人员决定是否修改。 (5)希腊字母版本号:此版本号用于标注当前版本的软件处于哪个开发阶段,当软件进入到另一个阶段时需要修改此版本号。此版本号由项目决定是否修改。 4.版本发布周期 (1)非紧急情况:首先由测试人员测试并提交Bug,其次开发人员会尽量在当天修复Bug并在第二天发布该版本的alpha版,然后由测试人员测试验证关闭Bug之后在第三天会发布该版本的 beta 版。 紧急情况:如果Bug比较紧急可跳过一般流程,由开发人员尽快修复Bug,测试确认之后直接发布该版本的 beta版。 5. 5 5 .版本号修改举例说明 如此时版本号为:1.0.0.0321_alpha ,此时为内部测试阶段 (1)开发人员修复了测试人员提交的bug并经测试人员测试验证关闭bug 之后,发布到外网时,此时就进入了软件的下一个阶段,版本号可改为: 1.0.0.0321_beta ,如当前日期跟上一个版本号的日期不一样,版本号可改 为:1.0.0.0322_beta。 (2)如果修复了一些重大Bug 并按照流程发布到外网时就可发布一个修订版,如1.0.1.0322_beta,日期为发布的当前日期。

软件版本管理规范标准[详]

软件版本管理规 第一章目的 本规详细规定软件项目版本管理的对象、存储目录、分支、权限、维护等容,使软件项目版本管理流程化并规化,确保在系统开发和实施过程中项目的完整性和一致性。 1.第二章适用围 所有系统开发及实施项目的软件项目都应进行版本管理。项目中所有正式文档和代码都应纳入配置库(可使用工具建立配置库,本文所述使用的是SVN)进行版本管理。 2.第三章职责 配置库管理员:负责配置库的日常维护和管理;监督开发及测试部门及时提交版本管理对象(即配置项)。 此岗位可由开发或测试人员兼任。 3.第四章容 4.1. 版本管理对象 包括但不限于: 项目总体计划 可行性研究报告 开发计划 需求说明书 需求设计原型 设计说明书 系统开发变更申请单 系统管理手册 用户操作手册 培训计划 培训记录 源程序 支持系统运行的配置文件 存储过程脚本 测试计划 测试用例 测试脚本 测试报告 上线计划

上线申请 版本维护日志 4.2. 配置库的目录结构 每个项目在配置库中应拥有唯一的项目名称。配置库目录结构与项目部的目录结构建议按下列格式创建。 配置库目录结构规划: ┠tags(发布) ┃├v1.0.0_T1_2016909 ┃├v1.0.0.33899_T1_20161009 ┃├v1.0.0_R1_20161109 ┃├v1.1.0_T1_20170109 ┃└v1.1.0_R1_20170209 ┠trunk(主版本) ┃└projectA ┃├src ┃├MY_MOOC ┃├doc ┃├tool ┃├。。。 ┖branches(分支) ├SY_ABC ├TJ_ABC ├WH_MOOC 其中,项目部的目录结构: |–projectA |–src (保存该项目的源程序) |–doc (保存项目相关文档) |–000.项目管理(保存项目过程管理相关文档) |–010.项目计划(保存项目计划相关文档) |–020.项目需求(保存项目需求相关文档) |–030.系统设计(保存项目设计相关文档) |–030.系统测试(保存项目代码测试相关文档) |–040.系统实施(保存项目部署实施相关文档) |–050.系统运维(保存项目运维文档,包括培训、用户手册等) |–060.技术资料(保存项目技术文档,包括第三方技术资料等)

软件项目版本号的命名规则及格式2016

软件项目版本号的命名规则及格式 版本控制比较普遍的3 种命名格式: 一、GNU 风格的版本号命名格式: 主版本号 . 子版本号[. 修正版本号[. 编译版本号]] Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Nu mber]] 示例: 1.2.1, 2.0, 5.0.0 build-13124 二、Windows 风格的版本号命名格式: 主版本号 . 子版本号[ 修正版本号[. 编译版本号]] Major_Version_Number.Minor_Version_Number[Revision_Number[.Build_Nu mber]] 示例: 1.21, 2.0 三、.Net Framework 风格的版本号命名格式: 主版本号.子版本号[.编译版本号[.修正版本号]] Major_Version_Number.Minor_Version_Number[.Build_Number[.Revision_Nu mber]] 版本号由二至四个部分组成:主版本号、次版本号、内部版本号和修订号。主版本号和次版本号是必选的;内部版本号和修订号是可选的,但是如果定义了修订号部分,则内部版本号就是必选的。所有定义的部分都必须是大于或等于0 的整数。 应根据下面的约定使用这些部分: Major :具有相同名称但不同主版本号的程序集不可互换。例如,这适用于对产品的大量重写,这些重写使得无法实现向后兼容性。 Minor :如果两个程序集的名称和主版本号相同,而次版本号不同,这指示显著增强,但照顾到了向后兼容性。例如,这适用于产品的修正版或完全向后兼容的新版本。 Build :内部版本号的不同表示对相同源所作的重新编译。这适合于更改处理器、平台或编译器的情况。 Revision :名称、主版本号和次版本号都相同但修订号不同的程序集应是完全可互换的。这适用于修复以前发布的程序集中的安全漏洞。 程序集的只有内部版本号或修订号不同的后续版本被认为是先前版本的修补程序(Hotfix) 更新。 版本号管理策略 一、GNU 风格的版本号管理策略:

VC++获取网卡MAC、硬盘序列号、CPU+ID、BIOS编号

VC++获取网卡MAC、硬盘序列号、CPU ID、BIOS编号 以下代码可以取得系统特征码(网卡MAC、硬盘序列号、CPU ID、BIOS编号) BYTE szSystemInfo[4096]; // 在程序执行完毕后,此处存储取得的系统特征码 UINT uSystemInfoLen = 0; // 在程序执行完毕后,此处存储取得的系统特征码的长度 // 网卡MAC 地址,注意: MAC 地址是可以在注册表中修改的 { UINT uErrorCode=0; IP_ADAPTER_INFO iai; ULONG uSize = 0; DWORD dwResult = GetAdaptersInfo( &iai, &uSize ); if( dwResult == ERROR_BUFFER_OVERFLOW ) { IP_ADAPTER_INFO* piai=( IP_ADAPTER_INFO* )HeapAlloc( GetProcessHeap( ), 0, uSize ); if( piai != NULL ) { dwResult = GetAdaptersInfo( piai, &uSize ); if( ERROR_SUCCESS == dwResult ) { IP_ADAPTER_INFO* piai2 = piai; while(piai2!=NULL &&(uSystemInfoLen+piai2->AddressLength )< 4096U) { CopyMemory(szSystemInfo+uSystemInfoLen,piai2->Address, piai2->AddressLength ); uSystemInfoLen += piai2->AddressLength; piai2 = piai2->Next; } } else { uErrorCode = 0xF0000000U + dwResult; } VERIFY( HeapFree( GetProcessHeap( ), 0, piai ) ); } else { return FALSE; } } else { uErrorCode = 0xE0000000U + dwResult; } if( uErrorCode != 0U ) { return FALSE; } }

项目软件版本号管理规范

项目软件版本号管理规范

历史修改记录 一. 目的

1.1软件版本按照一定的规则保存所有版本,避免发生版本丢失或混淆等现象, 并且可以快速准确的查找到任何版本。 1.2软件版本规范有利于公司各部门之间的对接工作,有利于公司内部资料统一 管理。 1.3本文档是为规范研发部软件版本管理而制定的。 二. 范围 2.1本文档为研发部软件开发版本提供有关版本管理规范的相关内容,包括:2.2版本标识方法及管理 2.3版本升级 2.4文档及源码的备份制度 2.5所有研发部软件工程师成员都必须遵照项目软件管理规范操作,公司内部使 用按照文档及源码存放备份制度。 三. 版本管理 3.1版本号规则 3.1.1每个归档版本都有两个版本号:内部版本号和外部版本号。版本号使用 VP规则,V(Version)是指外部版本号(研发测试版本),P(Patch)是指补丁版本号(可选)。 3.1.2版本号命名:V/B+主版本号+次版本号+修订版本号+日期版本号

3.2版本号修改规则 3.2.1主版本号:当功能模块有较大的变动,比如增加模块或是整体架构发生 变化。此版本号由项目决定是否修改。 3.2.2次版本号:相对于主版本号而言,次版本号的升级对应的只是局部的变 动,但该局部的变动造成程序和以前版本不能兼容,或者对该程序以前的协作关系产生了破坏,或者是功能上有大的改进或增强。此版本号由项目决定是否修改。 3.2.3修订版本号:一般是Bug 的修复或是一些小的变动或是一些功能的扩 充,要经常发布修订版,修复一个严重Bug 即可发布一个修订版。此版本号由项目经理决定是否修改。 3.2.4日期版本号:用于记录修改项目的当前日期,每天对项目的修改都需要 更改日期版本号。此版本号由开发人员决定是否修改。 如: V8.1.0.XXX (上一级版本号有变动时,下级要归零) 3.3版本号修改举例说明 如此时版本号为:V8.1.0.XXX ,此时为内部测试阶段 3.3.1 开发人员修复了测试人员提交的bug并经测试人员测试验证关闭bug 之后,发布到外网时,此时就进入了软件的下一个阶段,版本号可改为: V8.1.1.XXXX ,如当前日期跟上一个版本号的日期不一样,版本号可改为: V8.1.1.XXX。

软件版本管理规范标准

软件版本管理规 V1.0.0 文档版本变更记录:

目录 前言 (3) 1 围 (4) 2 术语和定义 (4) 2.1 软件 (4) 2.2 产品软件 (4) 2.3 演示软件 (4) 3 软件版本命名规则 (4) 3.1 软件版本命名组成 (4) 3.2 产品软件版本命名 (4) 3.3 演示软件版本命名 (5) 3.4 正式版本号的升级规则 (6) 3.4.1 软件版本升级规则 (6) 3.4.2 演示版本升级规则 (6) 3.5 版本的安装文件命名规则及存放路径 (6) 4 软件版本发布流程 (7) 5 管理条例 (7) 6 附录 (7)

前言 为规部门产品软件版本的管理与控制,保证产品版本的有效与质量,制定本标准。本标准由移动金融事业部拟制。 本标准于2015年6月首次发布。

软件版本管理规定 1围 本标准规定了移动银行事业部产品软件版本的控制与管理。 本标准适用于移动银行事业部产品软件版本的控制与管理。 2术语和定义 下列定义适用于本标准。 2.1软件 指与产品相关的所有软件,可以分为产品软件和演示软件。 2.2产品软件 已签订合同,有明确交付日期的产品。 2.3演示软件 处于研发阶段,并未正式投入生产的应用。 3软件版本命名规则 3.1软件版本命名组成 产品的正式软件版本命名由四部分组成。第一部分为主版本号,第二部分为次版本号,第三部分为修订版本号,第四部分为日期版本号。 产品的演示版本命名由四部分组成。第一部分为主版本号,第二部分为次版本号,第三部分为修订版本号,第四部分为日期版本号。 3.2产品软件版本命名 产品软件版本的命名规则如下所示:

软件版本命名规则

空蓝 忍耐 我很幸运!: ) 主页博客相册|个人档案|好友 查看文章 【规范】软件版本命名规范 2010-02-21 18:01 一、软件版本命名规范 1. 软件版本阶段说明 * Base 版: 此版本表示该软件仅仅是一个假页面链接,通常包括所有的功能和页面布局,但是页面中的功能都没有做完整的实现,只是做为整体网站的一个基础架构。 * Alpha 版: 此版本表示该软件在此阶段主要是以实现软件功能为主,通常只在软件开发者内部交流,一般而言,该版本软件的Bug 较多,需要继续修改。 * Beta 版: 该版本相对于α版已有了很大的改进,消除了严重的错误,但还是存在着一些缺陷,需要经过多次测试来进一步消除,此版本主要的修改对像是软件的UI 。 * RC 版: 该版本已经相当成熟了,基本上不存在导致错误的BUG ,与即将发行的正式版相差无几。 * Release 版: 该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本。该版本有时也称为标准版。一般情况下,Release 不会以单词形式出现在软件封面上,取而代之的是符号(R)。 2. 版本命名规范 软件版本号由四部分组成,第一个1为主版本号,第二个1为子版本号,第三个1为阶段版本号,第四部分为日期版本号加希腊字母版本号,希腊字母版本号共有5种,分别为:base 、alpha 、beta 、RC 、release 。例如:1.1.1.051021_beta 。 # 版本号定修改规则: * 主版本号(1):当功能模块有较大的变动,比如增加多个模块或者整体架构发生变化。此版本号由项目决定是否修改。 * 子版本号(1):当功能有一定的增加或变化,比如增加了对权限控制、增加自定义视图等功能。此版本号由项目决定是否修改。 * 阶段版本号(1):一般是 Bug 修复或是一些小的变动,要经常发布修订版,时间间隔不限,修复一个严重的bug 即可发布一个修订版。此版本号由项目经理决定是否修改。 * 日期版本号(051021):用于记录修改项目的当前日期,每天对项目的修改都需要更改日期版本号。此版本号由开发人员决定是否修改。 * 希腊字母版本号(beta):此版本号用于标注当前版本的软件处于哪个开发阶段,当软件进入到另一个阶段时需要修改此版本号。此版本号由项目决定是否修改。 # 文件命名规范 文件名称由四部分组成:第一部分为项目名称,第二部分为文件的描述,第三部分为当前软件的版本号,第四部分为文件阶段标识加文件后缀,例如:项目外 包平台测试报告1.1.1.051021_beta_b.xls ,此文件为项目外包平台的测试报告文档,版本号为:1.1.1.051021_beta 。 3. 版本的协同作业 如果是同一版本同一阶段的文件修改过两次以上,则在阶段标识后面加以数字标识,每次修改数字加1,项目外包平台测试报告 1.1.1.051021_beta_b1.xls 当有多人同时提交同一份文件时,可以在阶段标识的后面加入人名或缩写来区别,例如:项目外包平台测试报告 1.1.1.051021_beta_b_LiuQi.xls 。当此文件再次提交时也可以在人名或人名缩写的后面加入序号来区别,例如:项目外包平台测试 报告 1.1.1.051021_beta_b_LiuQi 2.xls 关于软件版本划分的一些知识 | | | | 激活我的百度空间百度空间百度首页 lmhytr

NET获取硬盘序列号的几个方法

最近作软件注册,收集了很多.NET相关的获取硬盘物理序列号的方法,主要分为使用WMI方式和API方式。但这些方法均可能有问题。 1,使用WMI方式,有的机器根本取不到硬盘序列号,有的方式在Vista下面会报错。 常用的使用WMI的方式主要有下面一些方式: class HardDrive { private string model = null; private string type = null; private string serialNo = null; public string Model { get {return model;} set {model = value;} } public string Type { get {return type;} set {type = value;} } public string SerialNo { get {return serialNo;} set {serialNo = value;} } } class TestProgram { ///

/// The main entry point for the application. /// [STAThread] static void Main(string[] args) { //在Vista下面失败 ArrayList hdCollection = new ArrayList(); ManagementObjectSearcher searcher = new

ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"); foreach(ManagementObject wmi_HD in searcher.Get()) { HardDrive hd = new HardDrive(); hd.Model = wmi_HD["Model"].ToString(); hd.Type = wmi_HD["InterfaceType"].ToString(); hdCollection.Add(hd); } searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia"); int i = 0; foreach(ManagementObject wmi_HD in searcher.Get()) { // get the hard drive from collection // using index HardDrive hd = (HardDrive)hdCollection[i]; // get the hardware serial no. if (wmi_HD["SerialNumber"] == null) hd.SerialNo = "None"; else hd.SerialNo = wmi_HD["SerialNumber"].ToString(); ++i; } // Display available hard drives foreach(HardDrive hd in hdCollection) { Console.WriteLine("Model\t\t: " + hd.Model); Console.WriteLine("Type\t\t: " + hd.Type); Console.WriteLine("Serial No.\t: " + hd.SerialNo); Console.WriteLine(); } // Pause application Console.WriteLine("Press [Enter] to exit..."); Console.ReadLine(); } }

软件系统命名规则

1、目的 本指导书是为软件配置管理而制定。其目的是使公司软件产品配置标识的命名规范化。 2、适用范围 适用于本公司所有软件产品的配置管理。 3、职责 4、控制内容 、软件配置标识的组成 、软件提供给用户的阶段产品和最终产品的配置标识由公司代码QW和以下五部分组成。 a、产品类别代码 b、产品(项目)标识或子系统标识 c、配置项标识 d、版本号 其一般形式为:QWa-bbbb-cc-dd 、软件开发过程中产生仅供公司或项目内部使用的配置项,其配置标识的一般形式为:bbcccccc-dd,其中,bb为产品(项目)标识缩写,cccccc为配置项标识,dd为版本号。 、部门代码 部门代码按《体系文件编号规定》条的规定控制。 、产品(项目)标识及其缩写 产品(项目)标识由反映产品或项目名称的4~5位拼音字母组成,前2位字母为其缩写。如DHMIS是杭州大和热磁电子有限公司管理信息系统的项目标识,而DH则为其缩写。 、子系统标识 子系统标识由2位产品(项目)标识缩写和2~3位子系统名拼音字母组成,其中第3、4两位为子系统标识缩写。如DHXS是大和项目销售子系统的标识,而XS是其缩写。 、配置项标识 、所述配置标识中的配置项标示:识(cc)如下表所

配置项标识(cc) 系统规格说明书FB 项目开发计划DP 软件需求规格说明书RS 概要设计说明书PD 详细设计说明书DD 用户手册UM 操作手册OM 源程序SP 、所述配置标识中的配置项标识(cccccc)有以下情况: a、配置项为数据项:配置标识由2位全局标识SY或子系统标识缩 写(局部数据)和3位数字码组成。 如SY001为001号全局数据的配置项标识 XS031为销售子系统031号数据的配置项标识。 b、配置项为数据流: 配置项标识由2位子系统标识缩写,2位数据流标识DF和2位数字码组成。 如ZCDF02为资财子系统02号数据流的配置项标识。 c、配置项为数据存储结构: 配置项标识由2位子系统标识缩写,2位数据存储标识DB和2位数字码组成。 如ZZDB01为制造子系统01号数据存储结构的配置项标识。 d、配置项为程序模块: 配置项标识由2位子系统标识缩写,程序模块标识M和2~3位数字码组成。 如XSM101为销售子系统101号程序模块的配置项标识。 e、配置项为存储媒体 配置项标识由2位产品(项目)标识缩写或子系统标识缩写,2

常见的软件版本编号及命名

常见的软件版本编号及命名 1、RC,GA RC:就是Release Candidate(候选版本)的缩写 GA:就是General Availability,正式发布的版本 Alpha:内测版。 Alpha是希腊字母的第一位的英文谐音,就是α,用在软件版本中就是表示最初级的版本。通常情况下Alpha是内部测试版,一般不向外部发布,会有很多Bug。除非你也是测试人员,否则不建议使用。 Beta:公测版。 Beta是希腊字母的第二位的英文谐音,就是β,是一个比Alpha稍高的版本。Beta 也是一个测试版本,在正式版推出之前发布,主要用于面向公众进行测试及Bug收集,这个阶段的版本Bug可能较多,并且可能会加入一些新的功能。 Delux:豪华版。 Plus版和Delux版区别不大,比普通版本多了一些附加功能。 EVAL:体验版或评估版。 功能上和正式版没有区别,但存在一些时间或空间上的限制。 Final:正式版。 软件的正式版本,修正了Alpha版和Beta版的Bug。 Free:免费版。 Full:完全版。 OEM: 是给计算机厂商随着计算机贩卖的,也就是随机版。只能随机器出货,不能零售。如果买笔记型计算机或品牌计算机就会有随机版软件。包装不像零售版精美,通常只有一面CD和说明书(授权书)。 Plus:加强版。 Pro:专业版。 需要注册后才能解除限制,否则为评估版本。 RC(Release Candidate):Candidate是候选人的意思,用在软件上就是候选版本,而Release Candidate 就是发行候选版本,也就是说这还不能算是正式的发布版。。

和Beta版最大的差别在于Beta阶段会一直加入新的功能,但是到了RC版本,几乎就不会加入新的功能了,而主要着重于除错! RTL(Retail):零售版。 正式上架零售版。 RTM(Release to Manufacture): 程序代码开发完成之后,要将母片送到工厂大量压片,这个版本就叫做RTM版。所以说,RTM版的程序码一定和正式版一样。 RVL: 不详。 SR:修正版或更新版。 修正了正式版推出后发现的Bug。 Trial:试用版。 软件在功能或时间上有所限制,如果想解除限制,需要购买正式版。 ------------------------------------------------------------------------------- 另外: Build:不是一个发行版本,而是一个内部版本构建标号,用于周期性的生成目标程序,主要目的是构建程序进行测试及版本备份,并可以版本发布时进行选择,类似于RC版本。同一版本可以有多个Build号,通常Build后面的数字越大,软件版本越新。 为了维护软件项目, 我们提出了对版本进行管理控制的要求. 而对于用户来说, 版本直接体现在版本号的命名上. 那么, 如何对版本号进行命名呢? 我查了许多的资料, 希望能解释得比较具体, 同时也希望您在阅读本文的时候, 能够对版本号的命名格式提出自己的见解, 这当然包括一些版本号命名的个例. 下面, 让我们看一下比较普遍的 3 种命名格式. GNU 风格的版本号命名格式: 主版本号.子版本号[.修正版本号[.编译版本号]] 英文对照: Major_Version_Number.Minor_Version_Number[.Revision_Number[.Bui ld_Number]] 示例: 1.2.1, 2.0, 5.0.0 build-13124 Windows 风格的版本号命名格式: 主版本号.子版本号[修正版本号[.编译版本号]]英文对照: Major_Version_Number.Minor_Version_Number[Revision_Number[.Buil d_Number]] 示例: 1.21, 2.0 .Net Framework 风格的版本号命名格式: 主版本号.子版本号[.编译版本号[.修

软件版本命名规范

软件版本命名规范(如1.0.0.1各代表什么意思) 1. 软件版本阶段说明 * Base版: 此版本表示该软件仅仅是一个假页面链接,通常包括所有的功能和页面布局,但是页面中的功能都没有做完整的实现,只是做为整体网站的一个基础架构。 * Alpha版: 此版本表示该软件在此阶段主要是以实现软件功能为主,通常只在软件开发者内部交流,一般而言,该版本软件的Bug较多,需要继续修改。 * Beta版: 该版本相对于α版已有了很大的改进,消除了严重的错误,但还是存在着一些缺陷,需要经过多次测试来进一步消除,此版本主要的修改对像是软件的UI。 * RC版: 该版本已经相当成熟了,基本上不存在导致错误的BUG,与即将发行的正式版相差无几。 * Release版: 该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本。该版本有时也称为标准版。一般情况下,Release不会以单词形式出现在软件封面上,取而代之的是符号(R)。 2. 版本命名规范 软件版本号由四部分组成,第一个1为主版本号,第二个1为子版本号,第三个1为阶段版本号,第四部分为日期版本号加希腊字母版本号,希腊字母版本号共有5种,分别为:base、alpha、beta、RC、release。例如:1.1.1.051021_beta。 # 版本号定修改规则: * 主版本号(1):当功能模块有较大的变动,比如增加多个模块或者整体架构发生变化。此版本号由项目决定是否修改。 * 子版本号(1):当功能有一定的增加或变化,比如增加了对权限控制、增加自定义视图等功能。此版本号由项目决定是否修改。 * 阶段版本号(1):一般是 Bug 修复或是一些小的变动,要经常发布修订版,时间间隔不限,修复一个严重的bug即可发布一个修订版。此版本号由项目经理决定是否修改。 * 日期版本号(051021):用于记录修改项目的当前日期,每天对项目的修改都需要更改日期版本号。此版本号由开发人员决定是否修改。 * 希腊字母版本号(beta):此版本号用于标注当前版本的软件处于哪个开发阶段,当软件进入到另一个阶段时需要修改此版本号。此版本号由项目决定是否修改。 # 文件命名规范 文件名称由四部分组成:第一部分为项目名称,第二部分为文件的描述,第三部分为当前软件的版本号,第四部分为文件阶段标识加文件后缀,例如:项目外包平台测试报告 1.1.1.051021_beta_b.xls,此文件为项目外包平台的测试报告文档,版本号为: 1.1.1.051021_beta。 3. 如果是同一版本同一阶段的文件修改过两次以上,则在阶段标识后面加以数字标识,每次修改数字加1,项目外包平台测试报告1.1.1.051021_beta_b1.xls

版本号命名规则

版本命名规范 1. 版本命名规范 软件版本号由四部分组成: 第一个1为主版本号 第二个1为子版本号 第三个1为阶段版本号 第四部分为日期版本号加希腊字母版本号 希腊字母版本号共有5种,分别为:base、alpha、beta、RC、release。例如:1.0.0.081015_release 常规:完全的版本号定义,分三项::<主版本号>.<次版本号>.<修订版本号>,如 1.0.0 2. 版本号定修改规则 主版本号(1):当功能模块有较大的变动,比如增加多个模块或者整体架构发生变化。此版本号由项目决定是否修改。 子版本号(1):当功能有一定的增加或变化,比如增加了对权限控制、增加自定义视图等功能。此版本号由项目决定是否修改。 阶段版本号(1):一般是 Bug 修复或是一些小的变动,要经常发布修订版,时间间隔不限,修复一个严重的bug即可发布一个修订版。此版本号由项目经理决定是否修改。 日期版本号(051021):用于记录修改项目的当前日期,每天对项目的修改都需要更改日期版本号。此版本号由开发人员决定是否修改。 希腊字母版本号(beta):此版本号用于标注当前版本的软件处于哪个开发阶段,当软件进入到另一个阶段时需要修改此版本号。此版本号由项目决定是否修改。 3. 文件命名规范 文件名称由四部分组成:第一部分为项目名称,第二部分为文件的描述,第三部分为当前软件的版本号,第四部分为文件阶段标识加文件后缀,例如:rongliaoRCS 1.0.0.081015_release.apk,此文件为项目外包平台的测试报告文档,版本号为:1.0.0.081015_release。

软件版本命名及含义解释

软件版本命名 常用版本命名: Alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。Beta:也是测试版,这个阶段的版本会一直加入新的功能。在Alpha版之后推出。RC:(Release Candidate)顾名思义么 ! 用在软件上就是候选版本。系统平台上就是发行候选版本。RC版不会再加入新的功能了,主要着重于除错。 RTM:(Release to Manufacture)是给工厂大量压片的版本,内容跟正式版是一样的,不过RTM版也有出限制、评估版的。但是和正式版本的主要程序代码都是一样的。 OEM:是给计算机厂商随着计算机贩卖的,也就是随机版。只能随机器出货,不能零售。只能全新安装,不能从旧有操作系统升级。包装不像零售版精美,通常只有一面CD和说明书(授权书)。 RVL:称是正式版,其实RVL根本不是版本的名称。它是中文版/英文版文档破解出来的。 EVAL:而流通在网络上的EVAL版,与“评估版”类似,功能上和零售版没有区别。 RTL:Retail(零售版)是真正的正式版,正式上架零售版。在安装盘的i386文件夹里有一个eula.txt,最后有一行 EULAID,就是你的版本。比如简体中文正式版是EULAID:WX.4_PRO_RTL_CN,繁体中文正式版是WX.4_PRO_RTL_TW。其中:如果是WX.开头是正式版,WB.开头是测试版。_PRE,代表家庭版;_PRO,代表专 业版。 版本号: V(Version):即版本,通常用数字表示版本号。(如:EVEREST Ultimate v4.20.1188 Beta ) Build:用数字或日期标示版本号的一种方式。(如:VeryCD eMule v0.48a Build 071112) SP:Service Pack,升级包。(如:Windows XP SP 2/Vista SP 1) 授权和功能划分: Trial:试用版,通常都有时间限制,有些试用版软件还在功能上做了一定的限制。可注册或购买成为正式版 Unregistered:未注册版,通常没有时间限制,在功能上相对于正式版做了一定的限制。可注册或购买成为正式版。 Demo:演示版,仅仅集成了正式版中的几个功能,不能升级成正式版。 Lite:精简版。 Full version:完整版,属于正式版。 语言划分: SC:Simplified Chinese简体中文版。 CN:简体中文版 GBK:简体中文汉字内码扩展规范版。

VC获得硬盘序列号

VC 之获取硬盘序列号 上一回,一帆风给大家讲了讲如何读取计算机的MAC地址,这次聊聊怎么获取硬盘序列号。硬盘物理序列号是硬盘的出厂序列号,它是全球都是唯一的,不会随着系统的安装、硬盘的格式化等操作而改变,跟mac地址一样都具有唯一性。1,第一步:创建设备对象,得到设备句柄,设备为硬盘。 { CString sFilePath; sFilePath.Format("\\\\.\\PHYSICALDRIVE%d", driver); HANDLE hFile=::CreateFile(sFilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); DWORD dwBytesReturned; GETVERSIONINPARAMS gvopVersionParams; DeviceIoControl(hFile, //向设备对象发送SMART_GET_VERSION设备请求,获取硬盘属性 SMART_GET_VERSION, NULL, 0, &gvopVersionParams, sizeof(gvopVersionParams), &dwBytesReturned, NULL); if(gvopVersionParams.bIDEDeviceMap <= 0) return -2; 2。第二步,发送SMART_RCV_DRIVE_DATA设备请求,获取硬盘详细信息。 // IDE or ATAPI IDENTIFY cmd int btIDCmd = 0; SENDCMDINPARAMS InParams; int nDrive =0; btIDCmd = (gvopVersionParams.bIDEDeviceMap >> nDrive & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY; // 输出参数 BYTE btIDOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1]; if(DoIdentify(hFile, &InParams,

软件版本管理规范

软件版本管理规范 V1.0.0 文档版本变更记录:

目录 前言 (4) 1 范围 (6) 2 术语和定义 (6) 2.1 软件 (6) 2.2 产品软件 (6) 2.3 演示软件 (6) 3 软件版本命名规则 (7) 3.1 软件版本命名组成 (7) 3.2 产品软件版本命名 (7) 3.3 演示软件版本命名 (8) 3.4 正式版本号的升级规则 (8) 3.4.1 软件版本升级规则 (9) 3.4.2 演示版本升级规则 (9) 3.5 版本的安装文件命名规则及存放路径 (10)

4 软件版本发布流程 (10) 5 管理条例 (11) 6 附录 (11) 前言 为规范部门产品软件版本的管理与控制,保证产品版本的有效与质量,制定本标准。 本标准由移动金融事业部拟制。 本标准于2015年6月首次发布。

软件版本管理规定 1范围 本标准规定了移动银行事业部产品软件版本的控制与管理。 本标准适用于移动银行事业部产品软件版本的控制与管理。2术语和定义 下列定义适用于本标准。 2.1软件 指与产品相关的所有软件,可以分为产品软件和演示软件。 2.2产品软件 已签订合同,有明确交付日期的产品。 2.3演示软件 处于研发阶段,并未正式投入生产的应用。

3软件版本命名规则 3.1软件版本命名组成 产品的正式软件版本命名由四部分组成。第一部分为主版本号,第二部分为次版本号,第三部分为修订版本号,第四部分为日期版本号。 产品的演示版本命名由四部分组成。第一部分为主版本号,第二部分为次版本号,第三部分为修订版本号,第四部分为日期版本号。 3.2产品软件版本命名 产品软件版本的命名规则如下所示: 产品标识VX.Y.Z_YYMMDD 版本号和时间之间以下划线分隔。具体含义见表1。 表1 软件版本命名规则描述 例如:

C++获取硬盘序列号

作者自己已经在vs2008下编译通过,此代码获取的是机器的硬盘物理序列号(唯一的,即使格式化硬盘也不变) main.cpp #include "GetHDSerial.h" #include #include #include using namespace std; int main(int argc,char** argv){ CGetHDSerial* disk = new CGetHDSerial; char *diskNumber=disk->GetHDSerial();//获取硬盘序列号 std::cout< #include #define SENDIDLENGTH sizeof (SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE #define IDENTIFY_BUFFER_SIZE 512 #define FILE_DEVICE_SCSI 0x0000001b #define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501) #define IOCTL_SCSI_MINIPORT 0x0004D008 // see NTDDSCSI.H for definition #define IDE_ATAPI_IDENTIFY 0xA1 // Returns ID sector for ATAPI. #define IDE_ATA_IDENTIFY 0xEC // Returns ID sector for ATA. #define IOCTL_GET_DRIVE_INFO 0x0007c088 #define IOCTL_GET_VERSION 0x00074080 typedef struct _IDSECTOR { USHORT wGenConfig; USHORT wNumCyls; USHORT wReserved; USHORT wNumHeads; USHORT wBytesPerTrack; USHORT wBytesPerSector; USHORT wSectorsPerTrack; USHORT wVendorUnique[3]; CHAR sSerialNumber[20]; USHORT wBufferType;

相关文档
最新文档