天天看點

用C#操作類讀寫WinCE平台Mac位址

前段時間在測試我們觸摸屏聯網性能的時候,由于屏的Mac位址通過系統資料庫設定,而PB定制WinCE核心的時候就有一個預設值,是以一批下來Mac位址都一樣,兩台以上的機器一聯網準出問題,通過系統資料庫軟體去修改Mac位址太麻煩了,是以做了一個小的Mac位址軟體。

以前用VB做了一個系統資料庫操作類(參見我的blog:

http://blog.csdn.net/yefanqiu/archive/2004/07/13/40379.aspx

),功能比較詳盡;現在用C#做了一個系統資料庫操作類也别簡單的隻做資料讀寫了,索性也做個全功能的了。由于.Net在域名空間Microsoft.Win32中提供RegistryKey類,操作系統資料庫還是比較友善的,唯感不足的時在操作多級子鍵的時候不很便捷,是以在封裝系統資料庫操作類的時候也把這部分内容給考慮進去了。

系統資料庫操作類代碼(可以用在.Net精簡架構集下)如下:

///<summary>
///系統資料庫操作類 -- 葉帆工作室
///</summary>
public class YFReg
{
    public enum HKEY { HKEY_LOCAL_MACHINE = 0, HKEY_CLASSES_ROOT = 1, HKEY_CURRENT_USER = 2, HKEY_USERS = 3 };
    private RegistryKey[] reg = new RegistryKey[4];
 
    public YFReg()
    {
        reg[(int)HKEY.HKEY_LOCAL_MACHINE] = Registry.LocalMachine;
        reg[(int)HKEY.HKEY_CLASSES_ROOT] = Registry.ClassesRoot;
        reg[(int)HKEY.HKEY_CURRENT_USER] = Registry.CurrentUser;
        reg[(int)HKEY.HKEY_USERS] = Registry.Users;
    }
 
    //讀指定變量值
    public string ReadValue(HKEY Root,string SubKey,string ValueName)
    {
        RegistryKey subKey=reg[(int)Root];
        if (ValueName.Length == 0) return "[ERROR]";
        try
        {
            if (SubKey.Length > 0)
            {
                string[] strSubKey = SubKey.Split('//');
                foreach (string strKeyName in strSubKey)
                {
                    subKey = subKey.OpenSubKey(strKeyName);
                }
            }
            string strKey = subKey.GetValue(ValueName).ToString();
            subKey.Close();
            return strKey;
        }
        catch
        {
            return "[ERROR]";
        }
    }
 
    //讀指定變量的類型
    public RegistryValueKind ReadValueType(HKEY Root, string SubKey, string ValueName)
    {
        RegistryKey subKey = reg[(int)Root];
        if (ValueName.Length == 0) return RegistryValueKind.Unknown;
        try
        {
            if (SubKey.Length > 0)
            {
                string[] strSubKey = SubKey.Split('//');
                foreach (string strKeyName in strSubKey)
                {
                    subKey = subKey.OpenSubKey(strKeyName);
                }
            }
            RegistryValueKind valueType = subKey.GetValueKind(ValueName);               
            subKey.Close();
            return valueType;
        }
        catch
        {
            return RegistryValueKind.Unknown;
        }
    }
 
    //寫指定變量值
    public int WriteValue(HKEY Root, string SubKey, string ValueName, string ValueData)
    {
        return WriteValue(Root, SubKey, ValueName, ValueData, RegistryValueKind.String); 
    }
   
    //寫指定變量值
    public int WriteValue(HKEY Root, string SubKey, string ValueName,object ValueData,RegistryValueKind ValueType)
    {
        RegistryKey subKey = reg[(int)Root];
        if (ValueName.Length == 0) return 2;
        try
        {
            if (SubKey.Length > 0)
            {
                string[] strSubKey = SubKey.Split('//');
                foreach (string strKeyName in strSubKey)
               {
                    subKey = subKey.CreateSubKey(strKeyName);
                }
            }
            subKey.SetValue(ValueName, ValueData, ValueType);
            subKey.Close();
            return 0;
        }
        catch
        {
            return 1;
        }
    }
 
    //删除指定變量
    public int DeleteValue(HKEY Root, string SubKey, string ValueName)
    {
        RegistryKey subKey = reg[(int)Root];
        try
        {
            if (SubKey.Length > 0)
            {
                string[] strSubKey = SubKey.Split('//');
                foreach (string strKeyName in strSubKey)
                {
                    subKey = subKey.OpenSubKey(strKeyName,true);
                }
            }
            subKey.DeleteValue(ValueName, true);
            subKey.Close();
            return 0;
        }
        catch
        {
            return 1;
        }
    }
 
    //建立指定的鍵
    public int CreateKey(HKEY Root, string SubKey, string KeyName)
    {
        RegistryKey subKey = reg[(int)Root];
        if (KeyName.Length == 0) return 2;
        try
        {
            if (SubKey.Length > 0)
            {
                string[] strSubKey = SubKey.Split('//');
                foreach (string strKeyName in strSubKey)
                {
                    subKey = subKey.CreateSubKey(strKeyName);
                }
            }
            subKey.CreateSubKey(KeyName);
            subKey.Close();
            return 0;
        }
        catch
        {
            return 1;
        }
    }
 
    //删除指定的鍵
    public int DeleteKey(HKEY Root, string SubKey, string KeyName)
    {
        RegistryKey subKey = reg[(int)Root];
        try
        {
            if (SubKey.Length > 0)
            {
                string[] strSubKey = SubKey.Split('//');
                foreach (string strKeyName in strSubKey)
                {
                    subKey = subKey.OpenSubKey(strKeyName, true);
                }
            }
            subKey.DeleteSubKeyTree(KeyName);
            subKey.Close();
            return 0;
        }
        catch
        {
            return 1;
        }
    }
 
    //判斷指定的鍵是否存在
    public int IsExistKey(HKEY Root, string SubKey, string KeyName)
    {
        RegistryKey subKey = reg[(int)Root];
        try
        {
            if (SubKey.Length > 0)
            {
                string[] strSubKey = SubKey.Split('//');
                foreach (string strKeyName in strSubKey)
                {
                    subKey = subKey.OpenSubKey(strKeyName);
                }
            }
            string[] strSubKey1 = subKey.GetSubKeyNames();
            foreach (string strKeyName in strSubKey1)
            {
                if (strKeyName == KeyName) return 0;
            }
            return 1;
        }
        catch
        {
            return 2;
        }
    }
 
    //枚舉指定的鍵的子鍵
    public string[] EnumKeyName(HKEY Root, string SubKey)
    {           
        RegistryKey subKey = reg[(int)Root];
        if (SubKey.Length == 0) return null;
        try
        {
            string[] strSubKey = SubKey.Split('//');
            foreach (string strKeyName in strSubKey)
            {
                subKey = subKey.OpenSubKey(strKeyName);
            }
            string[] strKey = subKey.GetSubKeyNames();
            subKey.Close();
            return strKey;
        }
        catch
        {
            return null;
        }
    }
   
    //枚舉指定的鍵的值
    public string[] EnumValueName(HKEY Root, string SubKey)
    {
        RegistryKey subKey = reg[(int)Root];
        if (SubKey.Length == 0) return null;
        try
        {
            string[] strSubKey = SubKey.Split('//');
            foreach (string strKeyName in strSubKey)
            {
                subKey = subKey.OpenSubKey(strKeyName);
            }
            string[] strValue = subKey.GetValueNames();
            subKey.Close();
            return strValue;
        }
        catch
        {
            return null;
        }
    }
}           

類出來了,用它讀寫Mac位址就是小菜一碟了,下面是讀寫Mac位址的示例代碼:

private void btnRead_Click(object sender, EventArgs e)
{
    txtMAC1.Text = reg.ReadValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress0");
    txtMAC2.Text = reg.ReadValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress1");
    txtMAC3.Text = reg.ReadValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress2");
    txtMAC4.Text = reg.ReadValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress3");
    txtMAC5.Text = reg.ReadValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress4");
    txtMAC6.Text = reg.ReadValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress5");
}
 
private void btnWrite_Click(object sender, EventArgs e)
{
    int intRet = 0;
    intRet += reg.WriteValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress0", txtMAC1.Text);
    intRet += reg.WriteValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress1", txtMAC2.Text);
    intRet += reg.WriteValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress2", txtMAC3.Text);
    intRet += reg.WriteValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress3", txtMAC4.Text);
    intRet += reg.WriteValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress4", txtMAC5.Text);
    intRet += reg.WriteValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress5", txtMAC6.Text);
    if (intRet > 0)
    {
        MessageBox.Show("更改失敗");
    }
}           

繼續閱讀