為了使開發的軟體能被更廣泛地使用,開發人員希望更多的使用者能試用軟體,而另一方面,又不想讓使用者長時間免費使用未經授權的軟體,這就需要設計軟體註冊程式。下面通過幾個典型執行個體介紹保護軟體安全的方法。執行個體468 利用INI檔案對軟體進行註冊
執行個體說明本執行個體實現使用INI檔案對軟體的使用者資訊進行註冊的功能。運行程式,輸入登入名稱稱、登入口令和註冊碼,單擊【註冊】按鈕進行註冊,如果註冊成功,則給出提示;如果資訊登入,系統給出提示資訊。執行個體運行結果16.6所示。
技術要點實現本執行個體功能主要用到API函數WritePrivateProfileString和GetPrivateProfileString函數。下面分別進行介紹。(1)WritePrivateProfileString函數此函數實現對INI檔案的寫操作。函式宣告如下。[ DllImport ( "kernel32" ) ] private static extern long WritePrivateProfileString ( string section ,string key , string val , string filePath ) ;參數說明如下。l section:INI檔案中的段落。l key:INI檔案中的關鍵字。l val:INI檔案中關鍵字的數值。l filePath:INI檔案完整的路徑和名稱。(2)GetPrivateProfileString函數此函數實現對INI檔案的讀操作。函式宣告如下。[DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);參數說明如表16.5所示。表16.5 參數說明
| 參 數 值 |
說 明 |
| section |
INI檔案中的段落名稱 |
| key |
INI檔案中的關鍵字 |
| def |
無法讀取時候的預設數值 |
| retVal |
讀取數值 |
| size |
數值的大小 |
| filePath |
INI檔案的完整路徑和名稱 |
注意:使用API函數必須引用System.Runtime.InteropServices命名空間。
實現過程(1)建立一個Windows應用程式,將其命名為Ex16_07,預設表單為Form1。(2)在Form1表單中,主要添加3個TextBox控制項,用於輸入註冊資訊;添加兩個Button控制項,用來執行註冊和退出操作。(3)主要程式碼。註冊使用者資訊的實現代碼如下:private void Form1_Load(object sender, EventArgs e) { FileStream c = new FileStream("C://desck.ini",FileMode.OpenOrCreate,FileAccess.Write); } [ DllImport ( "kernel32" ) ] private static extern long WritePrivateProfileString ( string section ,string key , string val , string filePath ) ; [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); private void button1_Click(object sender, EventArgs e) { StringBuilder temp = new StringBuilder(200); string FileName = "C://desck.ini";//NI檔案的完整的路徑和名稱。 foreach (object ct in Controls) { if (ct.GetType().ToString() == "System.Windows.Forms.TextBox") { TextBox tx = (TextBox)ct; if (tx.Text == "") { MessageBox.Show(tx.Tag.ToString()+"不可為空"); } } } string section = textBox3.Text;//INI檔案中的段落 string key = textBox1.Text;//INI檔案中的關鍵字 string keyValue = textBox2.Text;//INI檔案中的關鍵字 int i = GetPrivateProfileString(section, key, "無法讀取對應數值!", temp, 200, FileName);//判斷是否註冊過 if (temp.ToString() == "無法讀取對應數值!") { WritePrivateProfileString(section, key, keyValue, FileName); MessageBox.Show("註冊成功寫入INI檔案!", "資訊"); } else { MessageBox.Show("此資訊登入過了"); } }
舉一反三根據本執行個體,讀者可以實現以下功能。 對INI檔案加密儲存註冊資訊。 對組合INI檔案加密儲存註冊資訊。執行個體469 利用註冊表設計軟體註冊程式
執行個體說明大多數應用軟體會將使用者輸入的註冊資訊寫進註冊表中,程式運行過程中,可以將這些資訊從註冊表中讀出。本執行個體主要實現在程式中對註冊表進行操作的功能,運行程式,單擊【註冊】按鈕,會將使用者輸入的資訊寫入註冊表中。執行個體運行結果16.7所示。
技術要點實現本執行個體功能主要用到了Microsoft.Win32命名空間下的Registry類的CurrentUser屬性、RegistryKey類的OpenSubKey( )方法、GetSubKeyNames( )方法、SetValue( )方法和CreateSubKey( )方法。下面分別進行介紹。(1)Microsoft.Win32命名空間Microsoft.Win32命名空間提供兩種類型的類:處理由作業系統引發的事件的類和作業系統註冊表的類。(2)RegistryKey類此類表示Windows註冊表中的項級節點,此類是註冊表封裝。文法格式為:public sealed class RegistryKey : MarshalByRefObject, IDisposable 注意:要擷取RegistryKey執行個體,需要使用Registry類的靜態成員之一。(3)Registry類此類提供表示Windows註冊表中的根項的RegistryKey對象,並提供訪問項/值對的static( )方法。文法格式為:public static class Registry(4)CurrentUser屬性此屬性包含有關目前使用者喜好設定的資訊,該欄位讀取Windows 註冊表中的HKEY_ CURRENT_USER登錄機碼。文法格式為:public static readonly RegistryKey CurrentUser 注意:儲存在此項中的資訊包括環境變數的設定和有關程式組、顏色、印表機、網路連接和應用程式喜好設定的資料,此項使建立目前使用者的設定更容易。在此項中,軟體供應商儲存要在其應用程式中使用的目前使用者特定的喜好設定。(5)OpenSubKey( )方法此方法檢索指定的子項。文法格式為:public RegistryKey OpenSubKey (string name,bool writable)參數說明如下。l name:要開啟的子項的名稱或路徑。l writable:如果需要項的寫存取權限,則設定為True。l 傳回值:請求的子項;如果操作失敗,則為空白引用。(6)CreateSubKey( )方法此方法建立一個新子項或開啟一個現有子項以進行寫訪問。字串subkey不區分大小寫。文法格式為:public RegistryKey CreateSubKey (string subkey)參數說明如下。l subkey:要建立或開啟的子項的名稱或路徑。l 傳回值:RegistryKey對象,表示建立的子項或Null 參考。如果為subkey指定了零長度字串,則返回當前的RegistryKey對象。(7)GetSubKeyNames( )方法此方法檢索包含所有子項名稱的字串數組。文法格式為:public string[] GetSubKeyNames ()l 傳回值:包含當前項的子項名稱的字串數組。(8)SetValue( )方法此方法設定指定的成對的名稱和數值。文法格式為:public void SetValue (string name,Object value)參數說明如下。l name:要儲存的值的名稱。l value:要儲存的資料。 注意:對註冊表操作使用RegistryKey類和Registry類時,必須引用Microsoft.Win32 命名空間。
實現過程(1)建立一個Windows應用程式,將其命名為Ex16_07,預設表單為Form1。(2)在Form1表單中,主要添加3個TextBox控制項,用於輸入註冊資訊;添加兩個Button控制項,用來執行註冊和退出操作。(3)主要程式碼。 private void button1_Click(object sender, EventArgs e) { if(textBox1.Text=="") { MessageBox.Show("公司名稱不可為空"); return; } if(textBox2.Text=="") { MessageBox.Show("使用者名稱稱不可為空"); return; } if (textBox3.Text == "") { MessageBox.Show("註冊碼不可為空"); return; } //執行個體RegistryKey 類對象 Microsoft.Win32.RegistryKey retkey1 = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("software").OpenSubKey("ZHY").OpenSubKey("ZHY.INI", true); foreach (string strName in retkey1.GetSubKeyNames())//判斷註冊碼是否到期 { if (strName == textBox3.Text) { MessageBox.Show("此註冊碼已經到期"); return; } }//開始註冊資訊 Microsoft.Win32.RegistryKey retkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("software", true).CreateSubKey("ZHY").CreateSubKey("ZHY.INI").CreateSubKey(textBox3.Text.TrimEnd()); retkey.SetValue("UserName", textBox2.Text); retkey.SetValue("capataz", textBox1.Text); retkey.SetValue("Code", textBox3.Text); MessageBox.Show("註冊成功,您可以使用本軟體"); Application.Exit(); }
舉一反三根據本執行個體,讀者可以實現以下功能。 註冊資訊加密後存入註冊表。 記錄使用者試用次數的註冊程式。