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 ...
随机推荐
- ios录音
#import "ViewController.h" #import <AVFoundation/AVFoundation.h> @interface ViewCont ...
- Android中常用的五种数据存储方式
第一种: 使用SharedPreferences存储数据 适用范围: 保存少量的数据,且这些数据的格式非常简单:字符串型.基本类型的值.比如应用程序的各种配置信息(如是否打开音效.是否使用震动效果.小 ...
- Jmeter之JDBC请求(四)
我们常用的Jmeter中的功能又HTTP请求.JDBC Request.SOAP/XML -RPC Request,这3个请求, 现在就为大家介绍下 什么是JDBC请求 首先,大家右键点击“测试计划” ...
- hdu1087 最大递增子段和
http://acm.split.hdu.edu.cn/showproblem.php?pid=1087 状态方程:sum[j]=max{sum[i]}+a[j]; 其中,0<=i<=j, ...
- POJ 1159 回文串-LCS
题目链接:http://poj.org/problem?id=1159 题意:给定一个长度为N的字符串.问你最少要添加多少个字符才能使它变成回文串. 思路:最少要添加的字符个数=原串长度-原串最长回文 ...
- 对NLP的一些新认识
其实这是老板让上交的一份总结,贴出来,欢迎朋友们批评指正. 最近看了一部分关于NLP的几篇论文,其中大部分为神经网络实现, 从基本的HMM算法实现,到LSTM实现,有很多方法可以用来处理NLP任务中的 ...
- 分享Kali Linux 2016.2第47周镜像
分享Kali Linux 2016.2第47周镜像Kali Linux官方于11月20日发布Kali Linux 2016.2的第47周镜像.这次发布仍然包含11个镜像文件.其中,不仅包含Gnome桌 ...
- junit单元测试中私有方法测试
1.单元测试可以对系统逻辑进行每个单元模块的测试. 2.单元测试也可以作为回归测试的依据,可以避免升级完善功能时引入问题. 3.单元测试要求将代码写的更清晰,更易于测试. 4.有时单元测试需要测试私有 ...
- 【noip暑假tarjan专题】
%%%奎老师 A:傻逼缩点...傻逼编译器卡我next... B:就是这道奎老师没讲清楚的题,明明小朋友们都一A嘛,,,明明细节有很多嘛,,,怎么都这么熟练啊. C:本质还是B,换了个马甲而已. D: ...
- Android自动截屏小脚本
@echo off echo * 截图文件将保存在 E:\pic下,以当前日期+时间命名. echo ================================================= ...