本文主要講解如果使用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;"
寫入了時候需要外帶清空后面的字符串。
