C# 超级狗 二次开发 读写数据 激活验证 存储数据库连接字符串
本文主要讲解如果使用C#语言来对超级狗进行二次开发,如果仅仅是做个激活的功能,可以参照另一篇博客,地址:http://www.cnblogs.com/dathlin/p/8487842.html

继续主题研究,如果使用C#来对超级狗进行二次开发。
楼主在研究这个超级狗的时候,直接某宝购买了开发狗和子狗两个狗,并没有购买demo狗,所以后来在研究开发套件里的Demo项目时,老是提醒找不到超级狗,一定要开发套件里生成的公司的独一无二的组件进行访问。
第一步,当然是下载公司的API库了



其中开发商代码文件很关键,等会要用到

然后耐心的等待下载完成就好了。
准备资源
接下来要找到两个重要的东西才能进行开发,一个是组件库,一个是开发商代码文件。
独一无二的组件库在我的电脑的文档里(可能不同的电脑会不一致)

把所有的组件拷贝出来,放到你自己的项目里去,然后引用dog_net_windows.dll即可
还有下面这个文件夹里的这个文件的内容,也是非常的重要,涉及到是否成功访问超级狗的关键。

然后在项目里新建一个类。把里面的字符串拷贝出来,如下:

应用篇
情景一:在软件中显示当前的激活状态
虽然一般来说,软件可运行就代表着激活了,但是对于超级狗而言,有很多种方式,可能是永久激活的,可能是限制了次数的,可能是限制了日期的,不管超级狗的特征是什么类型的,我们都希望在软件界面上友好的激活。
例如界面显示当前为永久激活,界面上显示当前激活天数只剩30天之类的
public DogStatus ReadDogActiveString( int feature, string verdorCode, out string msg )
{
string scope = "<dogscope />";
DogStatus status;
Dog curDog = new Dog( new DogFeature( feature ) ); status = curDog.Login( verdorCode, scope );
if (status != DogStatus.StatusOk)
{
if (status == DogStatus.InvalidVendorCode)
{
msg = "Invalid vendor code.";
}
else if (status == DogStatus.UnknownVcode)
{
msg = "Vendor Code not recognized by API.";
}
else
{
msg = "Login to feature failed with status: " + status;
}
return status;
} string info = string.Empty;
DogStatus read = curDog.GetSessionInfo( "<dogformat><feature><attribute name=\"id\"/><element name=\"license\"/></feature></dogformat>", ref info );
if (read == DogStatus.StatusOk)
{
// 读取特征成功
XElement xElement = XElement.Parse( info ).Element( "feature" ).Element( "license" );
string type = xElement.Element( "license_type" ).Value;
if (type == "perpetual")
{
// 永久激活方式
msg = "产品激活成功";
}
else if (type == "executions")
{
// 执行次数的验证方式
msg = "总激活数:" + xElement.Element( "counter_fix" ).Value + " 当前激活次数:" + xElement.Element( "counter_var" ).Value;
}
else if (type == "expiration")
{
// 到期时间的激活方式
string time_second = xElement.Element( "exp_date" ).Value;
DateTime dateTime = new DateTime( 1970, 1, 1 ).AddSeconds( double.Parse( time_second ) );
msg = "到期时间:" + dateTime.ToString( "yyyy-MM-dd" );
}
else if (type == "trial")
{
// 测试版
DateTime dateTime = new DateTime( 1970, 1, 1 ).AddSeconds( double.Parse( xElement.Element( "time_start" ).Value ) );
int days = int.Parse( xElement.Element( "total_time" ).Value ) / 3600 / 24;
DateTime timeNow = DateTime.Now;
curDog.GetTime( ref timeNow );
msg = "剩余激活天数:" + (days - (int)(timeNow - dateTime).TotalDays);
}
else
{
msg = "激活方式未知";
}
}
else
{
msg = "ReadFailed: " + read;
} curDog.Logout( );
curDog.Dispose( );
return read;
}
此处提供一个通用的方法,读取超级狗的激活状态,并返回msg。使用方式如下:
private void button3_Click( object sender, EventArgs e )
{
if(!int.TryParse(textBox1.Text,out int feature))
{
MessageBox.Show( "特征输入不正确" );
} DogStatus status = ReadDogActiveString( feature, VendorCode.strVendorCode, out string msg );
label2.Text = msg;
}
效果如下:

情景二:存储隐私数据,密码或是数据库连接字符串
想必这个应用也是非常广泛的了,如果你要验证用户的密码输入,如果不使用数据库实现,那么就只能直接判断了
string password = "123456";
if(password=="123456")
{
// 密码正确
}
else
{
// 密码错误
}
但是这样就会非常的危险,对付一般的小白用户可能无所谓,但是只要是知道些反编译技术的人,用反编译工具就可以很快知道这个密码了,然后就可以进去做某些XXXXX的事了。
可能有人会觉得把正确的密码存放在数据库好了,然后软件启动的时候加载数据库里的密码,这样不就安全了吗?但是你也公开了一个信息,那就是数据库连接字符串
Server=(local);Database=pubs;Uid=sa;Pwd=asdasd;
别人就知道了你的数据库的地址,用户名,密码,然后入侵到你的数据库服务器里,这样所有的数据都暴露了。
那么我们怎么用加密狗解决这个问题呢?加密狗里有数据文件,允许进行读写操作,OK,那么我们来试一下

我们新增一个数据文件,然后按照下面进行勾选,我们发现可以创建三种模式的数据文件,读写,只读,写一次,很好理解,这里我们创建个可读写的,长度为128字节。

然后点击确定,回到上个界面,点击编程超级狗,将信息写入到超级狗里。

刚才写的是文件ID是5,所以接下来就需要在代码上操作,我们先读取这个数据
public DogStatus ReadString( int feature, int fileId, string verdorCode, out string msg )
{
string scope = "<dogscope />";
DogStatus status;
Dog curDog = new Dog( new DogFeature( feature ) ); status = curDog.Login( VendorCode.strVendorCode, scope );
if (status != DogStatus.StatusOk)
{
if (status == DogStatus.InvalidVendorCode)
{
msg = "Invalid vendor code.\n" ;
}
else if (status == DogStatus.UnknownVcode)
{
msg = "Vendor Code not recognized by API.\n" ;
}
else
{
msg = "Login to feature failed with status: " + status ;
}
return status;
} DateTime time = DateTime.Now;
DogFile file = curDog.GetFile( fileId ); int size = 0;
file.FileSize( ref size );
byte[] buffer = new byte[size];
file.Read( buffer, 0, size ); msg = Encoding.ASCII.GetString( buffer ).Trim( '\0' ); curDog.Logout( ); return status;
}
调用该方法即可读取指定的数据文件的信息,比如,数据文件5,读取出来就是Sample Data File
private void button2_Click( object sender, EventArgs e )
{
ReadString( 1, 5, VendorCode.strVendorCode, out string msg );
label2.Text = msg;
}
写入的通用方法
public DogStatus WriteString( int feature, int fileId, string verdorCode, out string msg ,string content)
{
string scope = "<dogscope />";
DogStatus status;
Dog curDog = new Dog( new DogFeature( feature ) ); status = curDog.Login( VendorCode.strVendorCode, scope );
if (status != DogStatus.StatusOk)
{
if (status == DogStatus.InvalidVendorCode)
{
msg = "Invalid vendor code.\n";
}
else if (status == DogStatus.UnknownVcode)
{
msg = "Vendor Code not recognized by API.\n";
}
else
{
msg = "Login to feature failed with status: " + status;
}
return status;
} DateTime time = DateTime.Now;
DogFile file = curDog.GetFile( fileId ); byte[] buffer = Encoding.ASCII.GetBytes( content );
file.Write( buffer, 0, buffer.Length ); msg = "success";
curDog.Logout( ); return status;
}
下面就是调用演示的方法
private void button5_Click( object sender, EventArgs e )
{
WriteString( 1, 5, VendorCode.strVendorCode, out string msg, "Server=(local);Database=pubs;Uid=sa;Pwd=asdasd;" );
}
我们把数据库的信息写入到超级狗里,然后再读取出来就,相对的提升了安全性。然后再读取这个数据
注意:如果你在写入了"123456",然后再读取字符串信息 "123456=(local);Database=pubs;Uid=sa;Pwd=asdasd;"
写入了时候需要外带清空后面的字符串。
C# 超级狗 二次开发 读写数据 激活验证 存储数据库连接字符串的更多相关文章
- TFS二次开发的数据统计以PBI、Bug、Sprint等为例(一)
TFS二次开发的数据统计以PBI.Bug.Sprint等为例(一) 在TFS二次开发中,我们可能会根据某一些情况对各个项目的PBI.BUG等工作项进行统计.在本文中将大略讲解如果进行这些数据统计. 一 ...
- 小程序开发技巧(三)-- 云开发时效数据刷新和存储 (access_token等)
小程序云开发时效数据刷新和存储 (access_token等) 1.问题描述 小程序中经常有需要进行OCR识别,或者使用外部api例如百度AI识别等接口,请求调用这些接口需要令牌,即一些具有时效性的数 ...
- TFS二次开发系列:七、TFS二次开发的数据统计以PBI、Bug、Sprint等为例(一)
在TFS二次开发中,我们可能会根据某一些情况对各个项目的PBI.BUG等工作项进行统计.在本文中将大略讲解如果进行这些数据统计. 一:连接TFS服务器,并且得到之后需要使用到的类方法. /// < ...
- ios开发之数据的持久化存储机制
IOS中数据的持久化保存这块内容,类似于Android中文件的几种常见的存储方式. 对于数据的持久化存储,ios中一般提供了4种不同的机制. 1.属性列表 2.对象归档 3.数据库存储(SQLite3 ...
- JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动
JavaScript日历控件开发 概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果代码地址:https://github.com/aspwebc ...
- TFS二次开发系列:八、TFS二次开发的数据统计以PBI、Bug、Sprint等为例(二)
上一篇文章我们编写了此例的DTO层,本文将数据访问层封装为逻辑层,提供给界面使用. 1.获取TFS Dto实例,并且可以获取项目集合,以及单独获取某个项目实体 public static TFSSer ...
- Android BLE蓝牙开发-读写数据 获取UUID
https://www.jianshu.com/p/3711cfbf7128 一个ble蓝牙设备有多个包括多个Profile 一个Profile中有多个服务Service(通过服务的uuid找到对应的 ...
- Python中异常和JSON读写数据
异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在java中通过try ... catch ... finally来处理异常,在Python中通过try ... except .. ...
- 性能测试工具 nGrinder 项目剖析及二次开发
转:https://testerhome.com/topics/4225 0.背景 组内需要一款轻量级的性能测试工具,之前考虑过LR(太笨重,单实例,当然它的地位是不容置疑的),阿里云的PTS(htt ...
随机推荐
- Ubuntu 12.04下安装QQ 2012 Beta3
Ubuntu 12.04下安装QQ 2012 Beta3 由于wine的发展非常迅速.现在网上的利用老版本的wine来安装QQ2012的教程已经有些过时了.实际上操作起来非常简单: 第一步:Ctr ...
- LeetCode (65):Same tree
Total Accepted: 83663 Total Submissions: 200541 Difficulty: Easy Given two binary trees, write a fun ...
- Servlet3.0异步请求
在Servlet3.0之前,Servlet采用Thread-Per-Request的方式处理请求 即每次Http请求都有一个线程从头到尾负责处理 如果一个请求需要进行IO操作,比如访问数据库.调用第三 ...
- Faster-rcnn 配置方法
Faster-rcnn 在Linux下的配置方法 感谢@邓学长 建立过程: (下载库的时候要按照库readme 进行操作) opencv 的包下载安装,安装教程 用git命令将这个库下载到本地 fas ...
- 数据结构实习 - problem M 判断平衡二叉树
writer:pprp date: 20171103 题目描述 给定一棵二叉树的中序和层序输出,判断是否为平衡二叉树的.如果是,输出YES如果不是输出NO. 输入 树结点个数 中序遍历序列 层序遍历序 ...
- 修改sublime侧边栏的颜色
Ctrl+Shift+P -> install -> 搜索安装包SyncedSidebarBg,自动同步侧边栏底色为编辑窗口底色.
- Floyd判圈算法 Floyd Cycle Detection Algorithm
2018-01-13 20:55:56 Floyd判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm) ...
- IdentityServer4在Asp.Net Core中的应用(三)
今天的内容是授权模式中的简化模式,还是先看以下授权流程图: 在这种模式中我们将与OpenID结合使用,所以首先我们要了解OpenID和OAuth的区别,关于他们的区别,在我上一篇博客<理解Ope ...
- JSP 表达式语言
JSP 表达式语言 JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单.JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式.在JSP EL表达式内可以使用整型数,浮点 ...
- 手机APP测试环境搭建---appium
这些都不是重点---一切都可以参考虫师 Appium移动自动化测试(一)--安装Appium 1.ADB的安装:ADB(ANDROID DEBUG BRIDGE) 应用场景: 针对移动端 Andr ...