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 ...
随机推荐
- 智能车学习(二)—— GPIO学习
一.概述 使用的是蓝宇的底层,主要有初始化管脚,设置管脚状态,反转管脚状态等. 二.代码重述: 1.头文件gpio.h #ifndef GPIO_H //防止重复定义(gpio_H 开头) #defi ...
- Jmeter 检查点
Jmeter的检查点就是插入个断言,但用下来不好用,没LR好用,先放放.
- Android源码学习之模板方法模式应用
一.模板方法模式定义 模板方法模式定义: defines the skeleton of an algorithm in a method, deferring some steps to subcl ...
- Loadrunner中参数化实战(6)-Random+Each occurrence
参数化数据30条: 脚本如下,演示登录,投资,退出操作是,打印手机号: 首先验证Vugen中迭代: Random+Each occurrence 设置迭代4次Action 结果如下:
- POJ 3974 回文串-Manacher
题目链接:http://poj.org/problem?id=3974 题意:求出给定字符串的最长回文串长度. 思路:裸的Manacher模板题. #include<iostream> # ...
- SU Demos-06Selecting Traces
不足之处,欢迎批评指正 共3个脚本,先看readme 第1个脚本 运行结果 第2个脚本 运行结果 第3个脚本 运行结果
- mongodb学习04 操作详解(2)
查找文档 筛选查找 db.collection.find(); 返回一个集合中文档的子集,子集的 范围从 0 个文档到整个集合; db.collection.findOne(); 返回筛选的一个文档; ...
- 转:Docker学习---挂载本地目录
原文: http://my.oschina.net/piorcn/blog/324202 docker可以支持把一个宿主机上的目录挂载到镜像里 docker run -it -v /home/dock ...
- ural 1146. Maximum Sum
1146. Maximum Sum Time limit: 0.5 secondMemory limit: 64 MB Given a 2-dimensional array of positive ...
- BZOJ2149 : 拆迁队
设$c[i]=g[i]+\frac{i(i+1)}{2}-a[i]\times i-a[i]$,$d[i]=a[i]-i$ $f[i]$表示以$i$为结尾最多保留多少个建筑,则 $f[i]=\max( ...