做一个交互式绘制文字的工具,希望这次设置的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对象写入注册表的更多相关文章

  1. ArcGIS Engine开发之旅09--几何对象和空间参考

    原文:ArcGIS Engine开发之旅09--几何对象和空间参考 1.Geometry  Geometry 是 GIS 中使用最为广泛的对象集之一,用户在创建.删除.编辑和进行地理分析的时候,就是处 ...

  2. ArcGIS Engine开发之旅08--和查询相关的对象和接口

    原文:ArcGIS Engine开发之旅08--和查询相关的对象和接口 查询在GIS领域应该是一个很频繁的操作,在GIS中除了具有属性查询(和其他关系型数据库的查询类似),还提供了空间查询.在介绍查询 ...

  3. ArcGIS Engine开发之旅04---ARCGIS接口详细说明

    原文:ArcGIS Engine开发之旅04---ARCGIS接口详细说明 ArcGIS接口详细说明... 1 1.      IField接口(esriGeoDatabase)... 2 2.    ...

  4. ArcGIS Engine开发之旅10--空间参考及坐标转换

    原文:ArcGIS Engine开发之旅10--空间参考及坐标转换 空间参考(Spatial Reference)是 GIS 数据的骨骼框架,能够将我们的数据定位到相应的位置,为地图中的每一点提供准确 ...

  5. ArcGIS Engine开发之旅05---空间数据库

    原文:ArcGIS Engine开发之旅05---空间数据库 1  Geodatabase概念 Geodatabase是ArcInfo8引入的一种全新的面向对象的空间数据模型,是建立在DBMS之上的统 ...

  6. ArcGIS Engine开发之旅03--ArcGIS Engine中的控件

    原文:ArcGIS Engine开发之旅03--ArcGIS Engine中的控件 制图控件,如MapControl.PageLayoutControl,其中MapControl控件主要用于地理数据的 ...

  7. ArcGIS Engine开发之旅02--ArcGIS Engine中的类库

    原文:ArcGIS Engine开发之旅02--ArcGIS Engine中的类库 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他 ...

  8. ArcGIS Engine开发之旅07---文件地理数据库、个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较 、打开栅格数据

    原文:ArcGIS Engine开发之旅07---文件地理数据库.个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较 .打开栅格数据 对文件地理数据库.个人地理数据库和 ArcSDE 地理 ...

  9. ArcGIS Engine开发之旅01---产品组成、逻辑体系结构

    原文:ArcGIS Engine开发之旅01---产品组成.逻辑体系结构 ArcGIS Engine 由两个产品组成:  面向开发人员的软件开发包(ArcGIS Engine Developer k ...

随机推荐

  1. WEB前端知识体系脑图

    说在开始的话: 我上大学那会,虽说主要是学Java语言,但是web前端也稍微学了一些,那时候对前端也没多在意,因为涉入的不深,可以搞一个差不多可以看的界面就可以了,其他也没过多在意. 因为稍微了解一点 ...

  2. Jmeter之csv、用户自定义变量以及Query Type分析(八)

    很多童鞋不知道对于Jmeter的Query Type 不知道选哪个,为什么选,怎么选! 下面这边做个简单的分析, 那么首先什么是CSV Data Set Config,有什么用呢? CSV Data ...

  3. 网页细分图结果分析(Web Page Diagnostics)

    Discuz开源论坛网页细分图结果分析(Web Page Diagnostics) 续LR实战之Discuz开源论坛项目,之前一直是创建虚拟用户脚本(Virtual User Generator)和场 ...

  4. loadrunner通过C语言实现自定义字符出现次数截取对应字符串

    void lr_custom_string_delim_save(char inputStr[500], char* outputStr, char *delim, int occrNo, int s ...

  5. C#中Invoke的用法()

    invoke和begininvoke 区别 一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些新的认识和理解. 首先说下,invoke和beg ...

  6. SpringJMS解析3-监听器

    消息监听器容器是一个用于查看JMS目标等待消息到达的特殊bean,一旦消息到达它就可以获取到消息,并通过调用onMessage()方法将消息传递给一个MessageListener实现.Spring中 ...

  7. 《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))'/ ...

  8. HTTP基础05--http首部

    HTTP 报文首部 HTTP 请求报文 在请求中,HTTP 报文由方法.URI.HTTP 版本.HTTP 首部字段等部分构成. HTTP 响应报文 在响应中,HTTP 报文由 HTTP 版本.状态码( ...

  9. 简单的Flume和hive的结合

    1. 日志格式 #Software: Microsoft Internet Information Services 6.0 #Version: 1.0 #Date: -- :: #Fields: d ...

  10. 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器

    Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...