博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArcGIS AddIN开发之COM对象写入注册表
阅读量:4686 次
发布时间:2019-06-09

本文共 4091 字,大约阅读时间需要 13 分钟。

做一个交互式绘制文字的工具,希望这次设置的Symbol,下次打开ArcMap时自动调用这个Symbol,并支持对其进行修改。

解决方法是将这个Symbol写入注册表中,每次自动读取上一次设置的Symbol,如果修改了Symbol,则自动写入注册表中。

相关文章:

注册表读写

http://blog.csdn.net/p424671075/article/details/6176219

ESRI COM对象序列化

http://blog.csdn.net/xgyb12458/article/details/4125911

Object与二进制的转换

http://www.cnblogs.com/jesszhu/archive/2013/08/22/3276556.html

阅读上述帖子后,开始着手写。首先想的是将ISymbol装箱为Object,再序列号为二进制,就可以写入注册表了。调试时显示这个Object不支持序列化

后来查阅到COM对象的序列化,需要用到IXMLSerializer,将COM对象序列化为字符,使用方式如下:

public string esriSerializer(object obj)        {            IXMLSerializer xmlSerializer = new XMLSerializerClass();            string xmlstring = xmlSerializer.SaveToString(obj, null, null);            return xmlstring;        }        public object esriDeserializer(string str)        {            IXMLSerializer xmlSerializer = new XMLSerializerClass();            return xmlSerializer.LoadFromString(str, null, null);        }
    public string esriSerializer(object obj)        {            IXMLSerializer xmlSerializer = new XMLSerializerClass();            string xmlstring = xmlSerializer.SaveToString(obj, null, null);            return xmlstring;        }        public object esriDeserializer(string str)        {            IXMLSerializer xmlSerializer = new XMLSerializerClass();            return xmlSerializer.LoadFromString(str, null, null);        }

之后,在将字符串对象序列化为二进制,写入注册表即可。

序列化为与反序列化二进制的代码如下:

public byte[] BinarySerializer(object obj)        {            try            {                using (var ms = new MemoryStream())                {                    var formatter = new BinaryFormatter();                    formatter.Serialize(ms, obj);                    var data = ms.ToArray();                    return data;                }            }            catch (InvalidOperationException)            {                throw;            }        }        public object BinaryDeserializer(byte[] bt)        {            object obj=null;            try            {                using (var ms = new MemoryStream(bt))                {                    var formatter = new BinaryFormatter();                    obj=formatter.Deserialize(ms);                }            }            catch (InvalidOperationException)            {                            }            return obj;        }

读取与写入注册表代码如下:

///         /// 从注册表获取值        ///         /// 工具名称        /// 值名称        /// 
public object getValueFromReg(string toolname,string key) { object obj=null; try { RegistryKey rkey = Registry.LocalMachine; RegistryKey rootkey = Registry.LocalMachine; RegistryKey sftkey = rootkey.OpenSubKey("software", true); RegistryKey llcsft = sftkey.OpenSubKey("llcSft"); RegistryKey AddinCfg = llcsft.OpenSubKey("AddInConfig"); RegistryKey AddInName = AddinCfg.OpenSubKey(toolname); byte[] tmp = (byte[])AddInName.GetValue(key); obj = esriDeserializer(BinaryDeserializer(tmp).ToString()); } catch (System.Exception ex) { return null; } return obj; } /// /// 写入注册表 /// /// 工具名称 /// 键值 ///
public bool setValueToReg(string toolName,KeyValuePair
pm) { try { RegistryKey rootkey = Registry.LocalMachine; RegistryKey sftkey = rootkey.OpenSubKey("software",true); RegistryKey llcsft = sftkey.CreateSubKey("llcSft"); RegistryKey AddinCfg = llcsft.CreateSubKey("AddInConfig"); RegistryKey AddInName = AddinCfg.CreateSubKey(toolName); AddInName.SetValue(pm.Key, BinarySerializer(esriSerializer(pm.Value)), RegistryValueKind.Binary); } catch (System.Exception ex) { } return true; }

使用中,直接调用setValueToReg,getValueFromReg两个函数即可。

 

转载于:https://www.cnblogs.com/DayDreamEveryWhere/p/4581275.html

你可能感兴趣的文章
快速排序
查看>>
crontab调用python脚本新思路
查看>>
df和du显示的磁盘空间使用情况不一致的原因及处理(文件删除后磁盘空间不释放)...
查看>>
进程与线程的关系与区别
查看>>
第一次使用maven记录
查看>>
SharePoint服务器端对象模型 之 使用CAML进展数据查询
查看>>
Building Tablet PC Applications ROB JARRETT
查看>>
Adobe® Reader®.插件开发
查看>>
【POJ 3461】Oulipo
查看>>
Alpha 冲刺 (5/10)
查看>>
使用Siege进行WEB压力测试
查看>>
斑马为什么有条纹?
查看>>
android多层树形结构列表学习笔记
查看>>
Android_去掉EditText控件周围橙色高亮区域
查看>>
《构建之法》第一、二、十六章阅读笔记
查看>>
Pandas基础(十一)时间序列
查看>>
arrow:让Python的日期与时间变的更好
查看>>
MySQL命令行参数
查看>>
MFC中 用Static控件做超链接(可以实现变手形、下划线、字体变色等功能)
查看>>
20144303 《Java程序设计》第五周学习总结
查看>>