ArcGIS AddIN开发之COM对象写入注册表
做一个交互式绘制文字的工具,希望这次设置的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;
}
读取与写入注册表代码如下:
/// <summary>
/// 从注册表获取值
/// </summary>
/// <param name="toolname">工具名称</param>
/// <param name="key">值名称</param>
/// <returns></returns>
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;
} /// <summary>
/// 写入注册表
/// </summary>
/// <param name="toolName">工具名称</param>
/// <param name="pm">键值</param>
/// <returns></returns>
public bool setValueToReg(string toolName,KeyValuePair<string,object> 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两个函数即可。
ArcGIS AddIN开发之COM对象写入注册表的更多相关文章
- ArcGIS Engine开发之旅09--几何对象和空间参考
原文:ArcGIS Engine开发之旅09--几何对象和空间参考 1.Geometry Geometry 是 GIS 中使用最为广泛的对象集之一,用户在创建.删除.编辑和进行地理分析的时候,就是处 ...
- ArcGIS Engine开发之旅08--和查询相关的对象和接口
原文:ArcGIS Engine开发之旅08--和查询相关的对象和接口 查询在GIS领域应该是一个很频繁的操作,在GIS中除了具有属性查询(和其他关系型数据库的查询类似),还提供了空间查询.在介绍查询 ...
- ArcGIS Engine开发之旅04---ARCGIS接口详细说明
原文:ArcGIS Engine开发之旅04---ARCGIS接口详细说明 ArcGIS接口详细说明... 1 1. IField接口(esriGeoDatabase)... 2 2. ...
- ArcGIS Engine开发之旅10--空间参考及坐标转换
原文:ArcGIS Engine开发之旅10--空间参考及坐标转换 空间参考(Spatial Reference)是 GIS 数据的骨骼框架,能够将我们的数据定位到相应的位置,为地图中的每一点提供准确 ...
- ArcGIS Engine开发之旅05---空间数据库
原文:ArcGIS Engine开发之旅05---空间数据库 1 Geodatabase概念 Geodatabase是ArcInfo8引入的一种全新的面向对象的空间数据模型,是建立在DBMS之上的统 ...
- ArcGIS Engine开发之旅03--ArcGIS Engine中的控件
原文:ArcGIS Engine开发之旅03--ArcGIS Engine中的控件 制图控件,如MapControl.PageLayoutControl,其中MapControl控件主要用于地理数据的 ...
- ArcGIS Engine开发之旅02--ArcGIS Engine中的类库
原文:ArcGIS Engine开发之旅02--ArcGIS Engine中的类库 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他 ...
- ArcGIS Engine开发之旅07---文件地理数据库、个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较 、打开栅格数据
原文:ArcGIS Engine开发之旅07---文件地理数据库.个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较 .打开栅格数据 对文件地理数据库.个人地理数据库和 ArcSDE 地理 ...
- ArcGIS Engine开发之旅01---产品组成、逻辑体系结构
原文:ArcGIS Engine开发之旅01---产品组成.逻辑体系结构 ArcGIS Engine 由两个产品组成: 面向开发人员的软件开发包(ArcGIS Engine Developer k ...
随机推荐
- WEB前端知识体系脑图
说在开始的话: 我上大学那会,虽说主要是学Java语言,但是web前端也稍微学了一些,那时候对前端也没多在意,因为涉入的不深,可以搞一个差不多可以看的界面就可以了,其他也没过多在意. 因为稍微了解一点 ...
- Jmeter之csv、用户自定义变量以及Query Type分析(八)
很多童鞋不知道对于Jmeter的Query Type 不知道选哪个,为什么选,怎么选! 下面这边做个简单的分析, 那么首先什么是CSV Data Set Config,有什么用呢? CSV Data ...
- 网页细分图结果分析(Web Page Diagnostics)
Discuz开源论坛网页细分图结果分析(Web Page Diagnostics) 续LR实战之Discuz开源论坛项目,之前一直是创建虚拟用户脚本(Virtual User Generator)和场 ...
- loadrunner通过C语言实现自定义字符出现次数截取对应字符串
void lr_custom_string_delim_save(char inputStr[500], char* outputStr, char *delim, int occrNo, int s ...
- C#中Invoke的用法()
invoke和begininvoke 区别 一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些新的认识和理解. 首先说下,invoke和beg ...
- SpringJMS解析3-监听器
消息监听器容器是一个用于查看JMS目标等待消息到达的特殊bean,一旦消息到达它就可以获取到消息,并通过调用onMessage()方法将消息传递给一个MessageListener实现.Spring中 ...
- 《DSP using MATLAB》示例Example4.13
代码: b = [1, 0, -1]; a = [1, 0, -0.81]; % [R, p, C] = residuez(b,a); Mp = (abs(p))' Ap = (angle(p))'/ ...
- HTTP基础05--http首部
HTTP 报文首部 HTTP 请求报文 在请求中,HTTP 报文由方法.URI.HTTP 版本.HTTP 首部字段等部分构成. HTTP 响应报文 在响应中,HTTP 报文由 HTTP 版本.状态码( ...
- 简单的Flume和hive的结合
1. 日志格式 #Software: Microsoft Internet Information Services 6.0 #Version: 1.0 #Date: -- :: #Fields: d ...
- 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器
Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...