C++ AO读取一个shapefile文件的所有属性值
作者:网络转载 发布时间:[ 2014/3/7 9:37:57 ] 推荐标签:C++ 属性值
需要注意的地方:
--------------------------------------------
1、程序开始要初始化COM库,即::CoInitialize(NULL);,这个一般可以在程序开始的地方(确切的说只要在开始使用COM组件之前行吧),如果是做组件我想放在构造的时候是个不错的选择。
2、既然初始化了,后要卸载COM库(暂且这么说吧),即::CoUninitialize();。它一般在程序的后(程序退出之前行)。当然不要它,似乎也能运行,但还是规范点好。这里有个问题,是程序中用到的变量置空的问题。如果在卸载COM库之前,不将这些变量的置空(释放掉对象的引用),那么在卸载的时候会得到烦人的错误。我被这个错误困扰了好一阵子(毕竟在VB里COM库的初始化和卸载不要我来做)。当然在一个子过程中,我想不一定需要置空(过程结束,这些变量也撤销了),但作为一个好习惯,我想还是自己来做一下这个事免得出错。
3、在Import的时候,这些库有先后顺序。比如这里的esriGeometry.olb要放在前面,否则你会得到一个基类未定义的错误,因为这个基类是在esriGeometry.olb这个库里定义的:(
4、下面的问题全集中在字符串的处理上了。COM里用到了BSTR和VARIANT,目的COM原理的书里都有。这两种数据类型会出现在很多地方,搞清楚这两种数据类型很重要。它们的使用有一些麻烦,为了方便我们使用ATL封装的两个类CComBSTR和CComVariant。程序在后读取属性的时候可以看到,读取的属性值的类型很多,但我们为了在Console中输出,需要做一些处理。字串4
[a]具体是:如果它是Geometry,那么直接用“Shape”来表示,如果它是其它的类型把它转化成BSTR,当然本身是BSTR不用转化了。(注意里面用到的L"",When working with CComBSTR, use the text mapping L"" to declare constant OLECHAR strings. )
[b]对BSTR本身来说无法直接链接两个BSTR,要连接需要转换(如用_bstr_t类)。但CComBSTR重载了+=,真是幸福的事,呵呵。
[c]后一步在console中输出,cout不支持BSTR,无疑又要用到转换了。方法有两个:第一是用_bstr_t类,将BSTR转换成_bstr_t类型,然后输出;第二个是使用ATL提供的宏,OLE2A,这里需要在程序中添加USES_CONVERSION; 程序中只要添加一次行了。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11