叶帆工作室

嵌入式开发爱好者(十年开发经验,精通C/C++/VC/VB/C#...)

用户操作
[即时聊天] [发私信] [加为好友]
叶帆ID:yefanqiu
537177次访问,排名80好友0人,关注者226
微软MVP / CSDN 2008十大MVB/MSDN中文技术论坛版主
yefanqiu的文章
原创 218 篇
翻译 0 篇
转载 3 篇
评论 1099 篇
叶帆的公告
本博客原创文章,作者保留一切权利,需经作者同意后方可转载,转载时 请注明[叶帆工作室]及文章链接。yefan@vip.sina.com
【简介】叶帆[微软MVP]
【文章】叶帆文章列表
【软件】叶帆共享软件列表
最近评论
BinYu:我用的是vista home basic sp1,但vs2005强行装不上去,请帮忙分析一下,qq:811344767,先谢谢了
wjh6877:算法想好了吗?

没有就是空话
一生好人:其实我也想来正版,但生活逼人,没办法啊
fox23:something like java card;-)
wwqqha:不错不错
文章分类
收藏
    相册
    叶帆照片
    【叶帆软件】
    [01]VB源码之友(V2.1.548)
    [02]API浏览器.net(V5.0)
    [03]叶帆成语词典(V2.0.8)
    [04]叶帆密码库(V1.2.8)
    【叶帆资源】
    DAO 2.0引擎
    叶帆快速通道
    MSDN-MVP
    Windows Embedded 专题
    中文MSDN
    叶帆圈子--工业自动化
    叶帆工作室(博客园)
    叶帆工控--工业自动化
    叶帆群组--工业应用开发
    微软中文技术论坛
    微软硬件创新中心(HIC)
    瑞康社区论坛
    叶帆友情链接
    张欣
    枕善居
    莫依
    葛涵涛
    郑建
    陈辉
    马宁
    马骐
    魏涛序
    黎波
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 用C#操作类读写WinCE平台Mac地址收藏

    新一篇: 小I机器人初探 | 旧一篇: .Net Micro Framework研究—Tinyfnt字体研究

             前段时间在测试我们触摸屏联网性能的时候,由于屏的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("更改失败");
        }
    }

    发表于 @ 2007年12月29日 11:20:00|评论(loading...)|编辑

    新一篇: 小I机器人初探 | 旧一篇: .Net Micro Framework研究—Tinyfnt字体研究

    评论

    #can19850 发表于2007-12-31 00:43:57  IP: 219.137.37.*
    初学者 路过
    #John1202 发表于2008-04-07 11:06:00  IP: 125.74.11.*
    请教:最近做一个基于win ce 4.2的东西,想取mac地址,来生成序列号,采用你的方法后,取到的mac地址全是error,不知为何?我的设备是 windows mobile 2003 第二版
    版本 4.21.1088
    #yefanqiu 发表于2008-04-07 14:04:34  IP: 125.34.186.*
    不同网卡,不同公司定制出的wince系统有可能不同,我只是对我们生产的屏这样取Mac地址,其实该段代码主要的目的是演示注册表使用的。
    这是我用EVC取MAC地址的相关代码
    // 发送ARP查询包获得 MAC 地址
    dwLen = 6;
    iReturn = SendARP(dwIP, 0, (PULONG) &byMAC, &dwLen);
    if (iReturn != NO_ERROR)
    {
    //__leave;
    }
    swprintf(strValue,_T("%.2X-%.2X-%.2X-%.2X-%.2X-%.2X"),
    byMAC[0], byMAC[1], byMAC[2], byMAC[3], byMAC[4], byMAC[5]);

    //写网卡MAC地址
    swprintf(strSysValue[23],_T("s,%s,Mac地址"),strValue);
    #arsser 发表于2008-06-27 18:28:37  IP: 58.246.240.*
    请问上面这段代码只能读取MAC地址,如何进行设置呢?另外,我用的wince 4.2系统,在Comm\CS89001\Parms下面并没有SoftwareMacAddress0等键值,请问系统把MAC地址保存在哪了呢?还是说MAC地址是计算出来的,我又该如何设定MAC呢?万望赐教,不甚感激。
    #yefanqiu 发表于2008-06-28 16:54:45  IP: 221.217.132.*
    我们公司的触摸屏配置的MAC地址就是通过注册表获得的,其它的设备有可能是其它方式,正规的MAC地址需要向专门的组织进行申请。
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 叶帆