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 ...
随机推荐
- selenium实战-自动退百度云共享群
必备知识 在官网上下好selenium-3.0.1-py2.py3-none-any.whl,然后进入下载文件所在的位置 pip install selenium-3.0.1-py2.py3-none ...
- mysql中sql语句
<数据定义语言DDL> 一. create TABLE tableName 创建表 二. alter TABLE tableName 修改表 三. drop TBALE tableName ...
- Linux学习笔记(19) Linux服务管理
1. 服务的分类 Linux服务可分为RPM包默认安装的服务和源码包安装的服务.前者可细分为独立的服务(直接作用于内存中)和基于xinetd服务.xinetd本身是独立的服务,其唯一的功能是管理其他服 ...
- thinkphp几个表的数据合并,并用数组分页
控制器: //金币扣除 public function jbkc(){ $map['UG_dataType']= 'xtkc'; $list1 = M ( 'userget' )->where ...
- 深入理解KMP算法
前言:本人最近在看<大话数据结构>字符串模式匹配算法的内容,但是看得很迷糊,这本书中这块的内容感觉基本是严蔚敏<数据结构>的一个翻版,此书中给出的代码实现确实非常精炼,但是个人 ...
- 多个$(document).ready()函数的执行顺序问题,(未解决)
今天遇到了一个问题: jQuery获取不了动态添加的元素,我使用的是append添加的.寻求了帮助,得到解决方案: 在文件开头写上这样一段代码来获取,写在$(document).ready()里面. ...
- 用div,ul,input模拟select下拉框
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- PHP 一个表单多个提交按钮,处理不同的业务逻辑
<?phpini_set("error_reporting","E_ALL & ~E_NOTICE");?> <head>< ...
- 豆制品厂开车超市送货智能手持PDA POS打票机-手持票据打印机
豆制品厂开车拉着豆腐到某一个超市送货,到达后秤出斤数后就用票据打印机开单 能直接开单,单子一式两份,一张给客户一张留底,到月底时客户要根据客户的量返点的,单子统计.能现场开单,单子上显示哪个超市,豆制 ...
- jquery: json树组数据输出到表格Dom树的处理方法
项目背景 项目中需要把表格重排显示 处理方法 思路主要是用历遍Json数组把json数据一个个append到5个表格里,还要给每个单元格绑定个单击弹出自定义对话框,表格分了单双行,第一行最后还要改ro ...