SAFEARRAY使用实例

合集下载

COleSafeArray

COleSafeArray

COleSafeArrayVC 2009-05-09 13:33:10 阅读786 评论0 字号:大中小COleSafeArrayCOleSafeArray类是用于处理任意类型和维数的数组的类。

COleSafeArray是从OLE VARIANT结构派生而来的。

OLE SAFEARRAY成员函数在可以通过COleSafeArray来访问,就象是特别为一维的字节数组所设计的一个成员函数集。

#include请参阅:COleVariant, CRecordset, CDatabaseCOleSafeArray类成员构造COleSafeArray 构造一个COleSafeArray对象操作Attach 给COleSafeArray对象以存在的VARIANT数组的控制Clear 释放基VARIANT中的所有数据Detach 将VARIANT数组从COleSafeArray对象中分离出来(这将使数据不会被释放)Win32 API 包装AccessData 获取一个指向数组数据的指针AllocData 为数组分配内存AllocDescriptor 为安全数组描述符分配内存Copy 创建一个已存在的数组的拷贝Create 创建一个安全数组Destroy 销毁一个已经存在的数组DestroyData 销毁一个安全数组中的数据DestroyDescriptor 销毁一个安全数组的描述符GetDim 返回数组的维数GetElement 获取安全数组中的一个单一元素GetElemSize 返回安全数组中一个元素的按字节表示的大小GetLBound 返回一个安全数组任一维的下界GetUBound 返回一个安全数组任一维的上界Lock 增加一个数组的加锁计数,并将一个指向数组数据的指针放到数组描述符中PtrOfIndex 返回一个指向被索引的元素的指针PutElement 将一个单一的元素放入数组中Redim 改变一个安全数组的最不重要(最右边)的边界UnaccessData 减小一个数组的加锁计数,并使由AccessData获得的指针无效Unlock 减小一个数组的加锁以使它能被释放或改变大小一维数组操作CreateOneDim 创建一个一维的COleSafeArray对象GetOneDimSize 返回一个一维的COleSafeArray对象中的元素个数ResizeOneDim 改变一个一维的COleSafeArray对象中的元素个数操作operator = 将一些值(包括SAFEARRAY,VARIANT,COleVariant,或COleSafeArray对象)拷贝到COleSafeArray对象中operator == 比较两个不同的数组(SAFEARRAY,VARIANT,ColeVariant,或COleSafeArray对象)operator构造函数COleSafeArray::COleSafeArrayCOleSafeArray();COleSafeArray( const SAFEARRAY& saSrc, VARTYPE vtSrc );COleSafeArray( LPCSAFEARRAY psaSrc, VARTYPE vtSrc );COleSafeArray( const COleSafeArray& saSrc );COleSafeArray( const VARIANT& varSrc );COleSafeArray( LPCVARIANT pSrc );COleSafeArray( const COleVariant& varSrc );参数:saSrc 要被拷贝到新的COleSafeArray对象中去的已经存在的COleSafeArray对象或SAFEARRAY。

[数据类型]plc数据类型

[数据类型]plc数据类型

[数据类型]plc 数据类型[数据类型]plc 数据类型篇一 : plc 数据类型在STEP 7-Micro/WIN中编程时,在下列两种情况下您必须识别并使用数据类型:?如果您以IEC 1131-3模式编程,则必须为全局符号表中的所有数值选择数据类型。

,]?如果您在局部变量表中赋值,则必须为每个局部变量定义数据类型。

当您明确地为数值指定数据类型时,您为STEP 7-Micro/WIN提供清晰的指令,指明需要为数值分配多少内存空间以及如何表示数值。

每个SIMATIC和IEC 1131-3指令或参数化子程序均由精确定义识别。

该定义可被称为签名。

对于所有的标准指令,每个指令操作数允许使用的数据类型集均从签名获得。

对于参数化子程序,用户通过局部变量表建立子程序签名。

STEP 7-Micro/WIN V3.0编程软件为SIMATIC模式执行简单的数据类型检查,为IEC 1131-3模式执行细致的数据类型检查。

这意味着为局部或全局变量指定一种数据类型时,软件在下表所列的每个等级中确保操作数数据类型与指令签名相匹配。

基本数据类型数据类型大小说明范围布尔 1位布尔 0至1字节 8位不带符号的字节 0至255字节 8位带符号的字节 -128至+127字 16位不带符号的整数 0至65,535整数 16位带符号的整数 -32768至+32767双字 32位不带符号的双整数 0至4294967295双整数 32位带符号的双整数 -2147483648至+2147483647 实数 32位 IEEE 32 位浮点 +1.175495E-38+3.402823E+38-1.175495E-38至3.402823E+38字符串 2至255字节 ASCII字符串照原样存储在PLC内存中,形式为1字符串长度接ASCII数据字节 ASCII字符代码128至255 复杂数据类型说明范围TON 打开接通延时定时器 1 ms10 ms100 ms T32, T96T33 -T36, T97 - T100T37 - T63, T101 -T255TOF 关闭接通延时定时器 1 ms10 ms100 ms T32, T96T33 -T36, T97 - T100T37 - T63, T101 - 255TP 脉冲定时器 1 ms10 ms100 ms T32, T96T33 - T36, T97 -T100T37 - T63, T101 - 255CTU 向上计数器 0至255 至CTD 向下计数器 0至255CTUD 向上,向下计数器 0至255SR 设置主要双稳态触发器无关RS 复原主要双稳态触发器无关STEP 7-Micro/WIN 提供三级数据类型检查1. IEC编辑器具有细致数据类型检查。

python中array的用法

python中array的用法

python中array的用法Python中array是一种数组类型,用于存储同类型的元素。

array模块提供了一个array()函数,用于创建数组。

下面是用法的详细说明:1. 导入array模块(可选)pythonimport array2. 创建数组pythonmy_array = array.array('i', [1, 2, 3, 4])上面的代码创建了一个整数类型的数组,并通过数组初始化列表指定数组元素。

'i'是类型码,表示创建整数类型的数组。

typecodes表示支持的不同类型的数组,下面是一些常见的类型码列表:`Type Code` `C Type` `Python Type` `Minimum size in bytes` -`'b'` signed char int 1`'B'` unsigned char int 1`'u'` Py_UNICODE Unicode char 2`'i'` int int 2`'I'` unsigned int int 2`'f'` float float 4`'d'` double float 83. 操作数组数组支持以下方法:- `append(x)`:将x添加到数组的末尾- `extend(iterable)`:将可迭代对象的元素添加到数组的末尾- `count(x)`:返回元素x的数量- `index(x)`:返回元素x的索引- `insert(i, x)`:将元素x插入到索引i处- `remove(x)`:从数组中删除第一个出现的元素x- `pop([i])`:删除并返回索引为i的元素(不指定i时默认删除最后一个元素)- `reverse()`:反转数组元素的顺序- `tofile(f)`:将数组写入文件f下面是一些使用数组的示例:python# 创建数组import arraymy_array = array.array('i', [1, 2, 3, 4])# 访问数组元素print(my_array[0]) # 输出1print(my_array[1]) # 输出2# 修改数组元素my_array[0] = 5print(my_array[0]) # 输出5# 计算数组长度print(len(my_array)) # 输出4# 遍历数组元素for i in my_array:print(i)# 操作数组my_array.append(5)print(my_array) # 输出array('i', [5, 2, 3, 4, 5])my_array.extend([6, 7, 8])print(my_array) # 输出array('i', [5, 2, 3, 4, 5, 6, 7, 8]) print(my_array.count(5)) # 输出2print(my_array.index(4)) # 输出3my_array.insert(0, 0)print(my_array) # 输出array('i', [0, 5, 2, 3, 4, 5, 6, 7, 8])my_array.remove(5)print(my_array) # 输出array('i', [0, 2, 3, 4, 5, 6, 7, 8])print(my_array.pop()) # 输出8print(my_array) # 输出array('i', [0, 2, 3, 4, 5, 6, 7])my_array.reverse()print(my_array) # 输出array('i', [7, 6, 5, 4, 3, 2, 0])# 将数组写入文件f = open('myarray.bin', 'wb')my_array.tofile(f)f.close()# 从文件中读取数组f = open('myarray.bin', 'rb')new_array = array.array('i')new_array.fromfile(f, len(my_array))f.close()print(new_array) # 输出array('i', [7, 6, 5, 4, 3, 2, 0])。

safe的使用方法

safe的使用方法

safe的使用方法【1】Safe的使用方法——保护个人信息的最佳实践在当今数字化的社会中,互联网的普及给我们的生活带来了巨大的便利。

然而,与此个人信息的泄露和滥用也成为了严重的问题。

为了保护自己的个人隐私和数据安全,使用安全的方法来处理信息变得至关重要。

本文将重点探讨Safe的使用方法,以帮助大家建立起一个安全可靠的数字生活。

【2】了解Safe的概念和特点在开始Safe的使用之前,我们首先需要了解它的概念和特点。

Safe (Secure Access For Everyone)是一种去中心化的存储和通信网络,基于区块链技术,旨在提供更安全和私密的在线体验。

通过使用Safe,我们可以获得去中心化的存储、隐私保护、加密通信等功能,从而保护我们的个人信息和数据。

【3】保护个人隐私的最佳实践要真正发挥Safe的作用,我们需要按照一些最佳实践来使用它。

以下是一些建议,帮助你更好地保护个人隐私:1. 了解Safe的工作原理:在开始使用Safe之前,了解其底层技术和安全机制非常重要。

这将帮助你更好地理解如何保护个人信息和数据。

2. 创建强密码:一个强大的密码是保护个人信息的基本步骤。

确保密码包含字母、数字和特殊字符,并定期更换密码以防止被猜测或破解。

3. 限制信息的分享:在使用Safe时,我们应该尽量减少个人信息的分享。

只向可信的人或组织提供必要的信息,避免信息的滥用和泄露。

4. 加强设备的安全性:保护个人信息不仅仅是在网络上的问题,我们还应该关注设备的安全性。

确保设备有最新的安全补丁和防病毒软件,以减少恶意软件的风险。

5. 定期备份数据:无论我们使用多么安全的方法来保护个人信息,意外事件总是可能发生的。

定期备份数据非常重要,以防止数据的永久丢失。

6. 小心不明链接和附件:在网络上,我们经常会收到陌生人的链接或附件。

为了保护个人信息,我们应该谨慎对待这些不明来源的链接和附件,避免点击或下载可能带来风险的内容。

delphi中SafeArray的读写问题

delphi中SafeArray的读写问题

delphi 中SafeArray 的读写问题下面这段代码不是我写的,网上说是hubdog 写的,如果对楼主有帮助,一起向作者致敬吧Delphi/Pascal code ?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 SafeArray 的使用非常麻烦,下面是写过的一段为ScriptControl 添加自定义函数并调用的代码,就用到了SafeArrayprocedure TForm1.Button1Click(Sender: TObject); varn:Integer;Parameters:PSafeArray;bound:TSAFEARRAYBOUND;Index:integer;v:Variant;begin//tryn:=StrToInt(inputbox('demo','请输入要计算阶乘的数',''));exceptShowMessage('输入有误,必须输入数字,请重新运行'); Exit;end;ScriptControl1.Reset;nguage:='JScript';//添加阶乘函数scriptcontrol1.addCode('function factorial(num){'+ 'result=1;for(ix=1;ix<=nu m;ix++){'+'result = result*ix;};r eturn result;};');//参数为一维有一个元素的SafeArraybound.lLbound:=0;bound.cElements:=1;tryParameters := SafeArrayCreate(VT_VARIANT, 1, bo und);exceptShowMessage('分配内存错误');Exit;end;2 4 2 5 2 6 2 7 2 8 2 93 0 3 1 3 2 3 3 34 35 36 37 38 39 4 0 4 1 4 2 4 3 //因为SafeArrayPutElement的第二个参数定义为const类型,//所以index必须定义为变量并赋值才能被调用V:=n;Index:=0;SafeArrayPutElement(Parameters,Index,V);tryShowMessage(ScriptControl1.Run('factorial',Parameters));finallySafeArrayDestroy(Parameters);end;end;#4 得分:0 回复于: 2012-02-06 17:02:10自己反复测试发现SafeArrayGETElement (Mysafearray; Indices; Data)中,MySafearry是要被读取得目标safearray,Indices 当Mysafearray中的内容是一维数组时,它是数组引索,当Mysafearray中内容是多维数组时,Indices必须是个整形数组,数组元素是每维的引索。

SAFEARRAY使用详解

SAFEARRAY使用详解

SAFEARRAY(安全数组)使用详解一,何谓SAFEARRAY(安全数组):winddows操作系统与使用SAFEARRAY 定义。

下列SAFEARRAY 结构是SAFEARRAY 典型、一般定义:typedef struct FARSTRUCT tagSAFEARRAY {unsigned short cDims; // 安全数组的大小unsigned short fFeatures; //安全数组的标记,取值见下表#if defined(WIN32) //如果在windows系统上unsigned long cbElements; //安全数组元素的大小//不包括安全数组数据的大小unsigned long cLocks; // 被锁定次数#elseunsigned short cbElements;unsigned short cLocks;unsigned long handle; // 仅用在 Macintosh 系统上#endifvoid HUGEP* pvData; // 数据指针SAFEARRAYBOUND rgsabound[1]; //安全数组的下界,元素数, 结构见下说明} ;typedef struct tagSAFEARRAYBOUND {unsigned long cElements;// 元素数long lLbound;// 数组的下界} ;fFeatures; //安全数组的标记说明FADF_AUTO 0x0001 在栈上创建数组FADF_STATIC 0x0002 在堆上创建数组FADF_EMBEDDED 0x0004 在结构中创建FADF_FIXEDSIZE 0x0010 不能改变数组大小FADF_RECORD 0x0020 记录容器FADF_HAVEIID 0x0040 有IID 身份标记数组FADF_HAVEVARTYPE 0x0080 VT 类型数组FADF_BSTR 0x0100 BSTR数组FADF_UNKNOWN 0x0200 IUnknown* 数组FADF_DISPATCH 0x0400 IDispatch* 数组FADF_VARIANT 0x0800 VARIANTs数组FADF_RESERVED 0xF0E8 余留,将来使用Microsoft Windows 2000 和WindowsXP 等操作系统系统使用整个Win32API。

SAFEARRAY使用

SAFEARRAY使用

SAFEARRAY使用目录:SAFEARRAY使用实例 1目录: 1前言: 1何谓SAFEARRAY: 1创建SAFEARRAY: 2方法一:使用SafeArrayAllocDescriptor在栈上创建一维数组 2方法二:使用SafeArrayAllocDescriptor和SafeArrayAllocData在堆上创建一维数组 2方法三:使用SafeArrayAllocDescriptor和SafeArrayAllocData在堆上创建二维数组 3方法四:使用SafeArrayCreate在堆上创建一维数组 4方法五:使用SafeArrayCreate在堆上创建二维数组 5方法六:使用SafeArrayCreateEx创建包含结构的一维数组 5访问SAFEARRAY: 7方法一:使用SafeArrayAccessData方法 7方法二:使用SafeArrayGetElement和SafeArrayPutElement 7 CComSafeArray类介绍: 8基本的入门例子: 8注意事项: 8前言:SAFEARRAY使用总是困扰很多人,为了把这个问题说个明白,我把我目前掌握的知识做个总结何谓SAFEARRAY:SAFEARRAY实际上是一个结构,关于这部分可以参考MSDN。

ms-help://MS.MSDNQTR.2003FEB.2052/automat/htm/chap7_9ntx.htm我们不需要关心16位操作系统下的定义,因为我们团队只在WIN2000以上平台下开发。

创建SAFEARRAY:方法一:使用SafeArrayAllocDescriptor在栈上创建一维数组//创建SAFEARRAY数组,每个元素为long型,该数组是一维数组long nData[10]={1,2,3,4,5,6,7,8,9,10};SAFEARRAY* pArray=NULL;HRESULT hr=SafeArrayAllocDescriptor(1,&pArray);//创建SAFEARRAY结构的对象pArray->cbElements=sizeof(nData[0]);pArray->rgsabound[0].cElements=10;pArray->rgsabound[0].lLbound=0;pArray->pvData=nData;pArray->fFeatures=FADF_AUTO|FADF_FIXEDSIZE;//FADF_AUTO指定在栈上分配数据,并且大小不可以改变(固定为10)//访问SAFEARRAY数组long* pValue=NULL;SafeArrayAccessData(pArray,(void**)&pValue);long Low(0),High(0);hr=SafeArrayGetLBound(pArray,1,&Low);//维数索引从1开始hr=SafeArrayGetUBound(pArray,1,&High);//维数索引从1开始SafeArrayUnaccessData(pArray);SafeArrayDestroy(pArray);这种方法在栈上分配数组元素所占的空间,即nData数组所用的空间方法二:使用SafeArrayAllocDescriptor和SafeArrayAllocData在堆上创建一维数组//创建SAFEARRAY数组,每个元素为long型,该数组是一维数组long nData[10]={1,2,3,4,5,6,7,8,9,10};SAFEARRAY* pArray=NULL;HRESULT hr=SafeArrayAllocDescriptor(1,&pArray);//创建SAFEARRAY结构的对象pArray->cbElements=sizeof(nData[0]);pArray->rgsabound[0].cElements=10;pArray->rgsabound[0].lLbound=0;SafeArrayAllocData(pArray);long* pData=NULL;SafeArrayAccessData(pArray,(void**)&pData);long l(0),h(0);SafeArrayGetLBound(pArray,1,&l);SafeArrayGetUBound(pArray,1,&h);long Size=h-l+1;SafeArrayAccessData(pArray,(void**)&pData);for(long Idx=l;Idx<Size;++Idx){pData[Idx]=nData[Idx];}SafeArrayUnaccessData(pArray);//访问SAFEARRAY数组long* pValue=NULL;SafeArrayAccessData(pArray,(void**)&pValue);long Low(0),High(0);hr=SafeArrayGetLBound(pArray,1,&Low);//维数索引从1开始hr=SafeArrayGetUBound(pArray,1,&High);//维数索引从1开始SafeArrayUnaccessData(pArray);SafeArrayDestroy(pArray);方法三:使用SafeArrayAllocDescriptor和SafeArrayAllocData在堆上创建二维数组SAFEARRAY* pArray=NULL;HRESULT hr=SafeArrayAllocDescriptor(2,&pArray);pArray->rgsabound[0].lLbound=0;pArray->rgsabound[0].cElements=3;pArray->rgsabound[1].lLbound=0;pArray->rgsabound[1].cElements=3;pArray->cbElements=sizeof(long);hr=SafeArrayAllocData(pArray);long lDimension[2];long x=1;//为第一行赋值for(long i=0;i<3;++i){lDimension[1]=0;//行lDimension[0]=i;//列SafeArrayPutElement(pArray,lDimension,&x);x++;}//为第二行赋值for(long i=0;i<3;++i){lDimension[1]=1;//行lDimension[0]=i;//列SafeArrayPutElement(pArray,lDimension,&x);x++;}//读取SafeArray中第二行第三列的数据long y(0);lDimension[1]=1;lDimension[0]=2;SafeArrayGetElement(pArray,lDimension,&y); SafeArrayDestroy(pArray);二维SAFEARRAY数组使用的时候下标要注意,这里采用的是列主序的方式,即lDimension[1]代表行,lDimension[0]代表列。

C++串口通信实例(vs2008)

C++串口通信实例(vs2008)

VS2008下用MFC 的MSComm控件编写串口程序首先启动VS2008,文件——新建——项目(快捷键Ctrl+Shift+N),项目类型——Visual C++——MFC——模板——MFC应用程序,●名称(如port1)。

●位置(如桌面下的文件夹‘配置软件’)。

●解决方案名称(会随着名称自动生成,建议不要修改)点击确定,进入MFC应用程序向导。

选择下一步,不要直接点完成。

选择——基于对话框,把使用Unicode库(N)点掉。

然后下一步,把“关于”框(B)点掉,可以点完成了。

进入界面把对话框窗口中的静态文本控件,两个按钮控件都删掉,(选中后按Delete键即可),修改后的界面如下图。

在对话框中添加两个组框(Group Box),组框中分别添加一个文本编辑控件(Edit Control),另外加入一个按钮控件(Button)这些都在工具箱中,选中后在对话框窗口中调节控件大小。

1.需要修改所添加的控件一些属性,如鼠标左键选中上面的组框,单击鼠标右键选属性——Caption——改为:显示区。

2.修改下面的组框:属性——Caption——发送区。

3.修改上面的示例编辑框属性:●ID——IDC_EDIT_RECV;●Multiline——True;●Want Return——True;●Vertical Scroll——True;●Auto VScroll——True;4.修改下面的示例编辑框属性:●ID——IDC_EDIT_SEND;●Multiline——True;●Vertical Scroll——True;5.修改按钮控件的属性:●ID——IDC_BUTTON_SEND;●Caption——发送修改好属性后的窗口如下图:接下来添加关键的控件,选择工具——选择工具箱项——COM组件——Microsoft Communications Control,version 6.0——确定,这时在工具箱下就有了该控件,小电话标志。

array常用方法

array常用方法

array常用方法数组(Array)是JavaScript中一种常用的数据类型,用于存储一系列有序的元素。

在JavaScript中,数组有一些常用的方法,包括:1. push():向数组末尾添加一个或多个元素,并返回新的长度。

2. pop():删除并返回数组的最后一个元素。

3. unshift():向数组的开头添加一个或多个元素,并返回新的长度。

4. shift():删除并返回数组的第一个元素。

5. splice():通过删除或替换现有元素或者添加新元素来修改数组,并返回被修改的元素。

6. sort():对数组的元素进行排序。

默认排序顺序是根据字符串Unicode码点。

7. reverse():颠倒数组中元素的顺序。

8. indexOf():返回指定元素在数组中的第一个索引,如果不存在则返回-1。

9. lastIndexOf():返回指定元素在数组中的最后一个索引,如果不存在则返回-1。

10. forEach():对数组的每个元素执行一次给定的函数。

11. map():对数组的每个元素执行一次给定的函数,并返回结果组成的新的数组。

12. filter():对数组的每个元素执行一次给定的函数,并返回结果为true的元素组成的新的数组。

13. some():对数组的每个元素执行一次给定的函数,如果函数对某个元素返回true,则返回true。

14. every():对数组的每个元素执行一次给定的函数,如果函数对所有元素都返回true,则返回true。

15. reduce():对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值。

16. join():将数组的所有元素连接成一个字符串。

17. concat():用于合并两个或多个数组。

此方法不会更改现有数组,而是返回一个新数组。

18. slice():返回一个新的数组对象,这个对象是一个由开始和结束索引(不包括结束索引)指定的原数组的浅拷贝。

数组Array的十种使用方法

数组Array的十种使用方法

数组Array的⼗种使⽤⽅法第⼀种⽅法
array toString ()
将数组的元素全部转换为字符串;
第⼆种⽅法
array join ("这⾥是分隔符")
这种⽅法可以把数组的元素转换为字符串,并把分隔符换成其他字符串;
第三种⽅法
arr.concat(这⾥是变量)
⽤于将新变量与arr拼接,置于尾部;
第四种⽅法
arr.slice(开始位置,结束位置)
⽤于指定位置的数组元素输出,结尾不算本⾝;
第五种⽅法
arr.sort()
给指定的变量数组排序,具体按什么排,不清楚
估计是按数字优先,其次⼤写字母,⼩写字母,布尔值
第六种⽅法
arr.reverse()
颠倒1变量的数据(元素);
第七种⽅法
arr.unshift("元素")
在变量数组的开头增加元素;
第⼋种⽅法
arr.shift()
删除第⼀个元素,并返回被删除的那个元素
第九种⽅法
arr.push("填写指定的元素")
添加指定的元素到尾部
第⼗种⽅法
arr.pop()
删除数组的最后⼀个并返回
第⼗⼀种⽅法
arr.splice(从哪⾥开始删?,删到哪⾥?,新增哪些?)如上。

power automate filter array 用法

power automate filter array 用法

power automate filter array 用法Power Automate是微软提供的一款自动化工具,它可以帮助用户简化和自动化各种重复性任务和流程。

在Power Automate中,Filter Array 是一个非常有用的操作,它允许用户根据一定的条件来过滤和筛选数据。

本文将介绍Filter Array的用法,并逐步回答与该功能相关的问题。

一、Filter Array的作用和用途Filter Array的作用是筛选和过滤数组中的元素,只保留符合指定条件的元素。

它可以用于各种不同的场景和业务需求,例如:1. 筛选指定条件的数据:Filter Array可以根据用户定义的条件,从数组中筛选出符合条件的数据。

例如,可以根据销售额大于某个特定值的数据来生成一份销售报表。

2. 数据清洗和处理:Filter Array可以用于清洗和处理数据,去除不需要的元素或者只保留特定类型的数据。

例如,可以将一个包含多种类型文件的文件夹中,只保留特定类型的文件。

3. 数据转换和格式化:Filter Array可以用于对数据进行转换和格式化,根据不同的条件做出不同的操作。

例如,可以根据用户的国家或地区来选择使用不同的日期格式。

二、使用Filter Array的步骤使用Filter Array需要以下几个步骤:步骤1:添加Filter Array操作在Power Automate的设计画布中,选择需要添加Filter Array操作的位置。

然后,点击“New step”按钮,在弹出的菜单中选择“Add an action”并搜索“Filter Array”。

点击“Filter Array”操作以添加。

步骤2:配置Filter Array操作在配置Filter Array操作时,需要提供以下几个参数:1. From:指定需要进行筛选和过滤的数组。

可以是一个静态数组,也可以是来自其他操作的动态数组。

2. Filter:定义筛选条件的表达式。

array函数用法

array函数用法

array函数用法Array函数是JavaScript中非常重要的一个函数,它可以快速创建数组、遍历数组、对数组进行排序、筛选、删除、合并等操作。

本文将详细介绍Array函数的用法,让大家更好地掌握JavaScript编程技巧。

1.创建数组:使用Array函数可以快速创建一个数组,语法如下:var arr = new Array(); //创建一个空数组var arr = new Array('a','b','c'); //创建一个包含元素的数组var arr = ['a','b','c']; //使用数组字面量创建数组2.遍历数组:使用for循环可以遍历数组,语法如下:for(var i=0; i<arr.length; i++){console.log(arr[i]);}3.对数组进行排序:使用sort()函数可以对数组进行排序,语法如下:arr.sort();4.对数组进行筛选:使用filter()函数可以对数组进行筛选,语法如下:var newArr = arr.filter(function(value){return value>2;});5.对数组进行删除:使用splice()函数可以对数组进行删除,语法如下:arr.splice(1,1); //删除第二个元素6.对数组进行合并:使用concat()函数可以合并两个数组,语法如下:var arr2 = ['d','e','f'];var newArr = arr.concat(arr2);以上就是Array函数的用法,希望大家能够掌握并应用到实际开发中。

编程中array用法

编程中array用法

编程中array用法编程中Array用法在编程中,Array(数组)是一种常见的数据结构,用于存储多个相同类型的元素。

它是许多编程语言中都支持的重要特性,具有广泛的应用。

下面我们来详细介绍一些Array的常见用法。

声明和初始化Array1.声明一个空的ArrayArray arrayName = new Array();这种方式创建了一个空的Array,我们可以通过后续的操作添加和删除元素。

2.声明并初始化ArrayArray arrayName = new Array(element1, elem ent2, ...);这种方式声明并初始化了一个包含多个元素的Array,通过逗号分隔不同的元素。

访问和修改Array元素1.通过索引访问Array元素arrayName[index]Array的每个元素都有一个唯一的索引,从0开始递增。

通过索引即可访问和修改特定位置的元素。

2.修改Array元素的值arrayName[index] = newValue;通过索引将Array元素的值修改为新的值。

获取Array的长度1.使用length属性获取Array的长度使用Array的length属性可以获取Array中元素的个数,从而确定Array的长度。

遍历Array1.使用for循环遍历Arrayfor (int i = 0; i < ; i++) {// 访问arrayName[i]}使用for循环可以遍历Array的每个元素,通过索引来依次访问和操作每个元素。

2.使用foreach循环遍历Arrayfor (type element : arrayName) {// 使用element访问和操作Array中的每个元素}使用foreach循环可以更加简洁地遍历Array,无需使用索引,直接访问每个元素。

添加和删除Array元素1.使用Array的内置方法添加元素(element);使用add方法可以在Array的末尾添加新的元素。

array在java中的用法

array在java中的用法

在Java 中,数组(array)是一种用来存储多个相同类型数据的对象。

数组在Java 中的应用非常广泛,以下是一些常见的用法:1. 声明和创建数组:声明数组的方法是使用`arrayOf` 或者直接使用方括号`[]`。

例如,创建一个整数数组:```javaint[] intArray = new int[5]; // 创建一个包含5 个整数的数组```2. 初始化数组:在创建数组时,可以使用大括号`{}` 初始化数组元素。

例如:```javaint[] intArray = {1, 2, 3, 4, 5}; // 创建一个包含5 个整数的数组```或者使用循环初始化数组:```javaint[] intArray = new int[5];for (int i = 0; i < intArray.length; i++) {intArray[i] = i + 1;}```3. 访问数组元素:使用数组下标来访问数组元素。

数组下标从0 开始。

例如:```javaint intValue = intArray[2]; // intValue 等于3```4. 修改数组元素:通过索引来修改数组元素。

例如:```javaintArray[2] = 42; // 将intArray 数组中下标为2 的元素修改为42```5. 获取数组长度:使用`length` 属性来获取数组的长度。

例如:```javaint length = intArray.length; // length 等于5```6. 遍历数组:使用for 循环或者增强型for 循环(for-each 循环)遍历数组。

例如:```javafor (int i = 0; i < intArray.length; i++) {System.out.println(intArray[i]);}```7. 数组操作:Java 提供了许多数组操作方法,例如`concat()`(合并数组)、`equals()`(比较两个数组是否相等)、`fill()`(填充数组)等。

ADO编程

ADO编程

一、在VC++中使用ADO编程ADO实际上就是由一组Automation对象构成的组件,因此可以象使用其它任何Automation对象一样使用ADO。

ADO中最重要的对象有三个:Connection、Command和Recordset,它们分别表示连接对象、命令对象和记录集对象。

如果您熟悉使用MFC中的ODBC类(CDatabase、CRecordset)编程,那么学习ADO编程就十分容易了。

使用ADO编程时可以采用以下三种方法之一:1、使用预处理指令#import但要注意不能放在stdAfx.h文件的开头,而应该放在所有include指令的后面。

否则在编译时会出错。

程序在编译过程中,VC++会读出msado15.dll中的类型库信息,自动产生两个该类型库的头文件和实现文件msado15.tlh和msado15.tli(在您的Debug或Release目录下)。

在这两个文件里定义了ADO的所有对象和方法,以及一些枚举型的常量等。

我们的程序只要直接调用这些方法就行了,与使用MFC中的COleDispatchDriver类调用Automation对象十分类似。

2、使用MFC中的CIDispatchDriver就是通过读取msado15.dll中的类型库信息,建立一个COleDispatchDriver 类的派生类,然后通过它调用ADO对象。

3、直接用COM提供的API如使用如下代码:CLSID clsid;HRESULT hr = ::CLSIDFromProgID(L"ADODB.Connection", &clsid);if(FAILED(hr)){...}::CoCreateInstance(clsid, NULL, CLSCTX_SERVER, IID_IDispatch,(void **)&pDispatch);if(FAILED(hr)){...}以上三种方法,第一和第二种类似,可能第一种好用一些,第三种编程可能最麻烦。

学会使用SafeArray之Delphi篇

学会使用SafeArray之Delphi篇

学会使用SafeArray之Delphi篇学会使用SafeArray 之 Delphi 篇分类: Delphi 2010-11-05 14:07 966人阅读评论(0) 收藏举报delphiintegerdatasetfunctionstring百度在学习的时候曾经百度了一下,想查找关于delphi中SafeArray 的用法,没想到资料竟然如此之少,甚至连一篇相对完整的都没有。

也许正如田师傅所说,现在高手们都在实行“技术封锁”了?在CSDN技术中心有一篇关于C++的使用,说的比较详细。

鉴于手中有田师傅写的代码,特拿来一部分对照自己学习的,翻译为Delphi版本。

留作笔记,日后翻阅。

=============================================================================== SAFEARRAY的主要目的是用于automation中的数组型参数的传递。

因为在网络环境中,数组是不能直接传递的,而必须将其包装成SafeArray。

实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元素类型等信息。

SafeArray也并不单独使用,而是将其再包装到VARIANT类型的变量中,然后才作为参数传送出去。

在VARIANT的vt成员的值如果包含VT_ARRAY|...,那么它所封装的就是一个SafeArray,它的parray成员即是指向SafeArray的指针。

SafeArray中元素的类型可以是VARIANT能封装的任何类型,包括VARIANT类型本身。

Delphi中com组件或外部调用需要传递一个对象或者数组,这个时候可以考虑使用SafeArray。

比如三层架构中通常需要将使用的ClientDataSet数据集传出,那么就可以将DataSet转换为SafeArray,再由其他模块转换接收。

===============================================================================代码块:pSafeArray是一个结构体,其定义在ActiveX单元中,相关定义如下:PSafeArray = ^TSafeArray;{$EXTERNALSYM tagSAFEARRAY}tagSAFEARRAY = recordcDims: Word;//数组的维数fFeatures: Word;//用来描述数组如何分配和如何被释放的标志cbElements: Longint;//数组元素的大小cLocks: Longint;//一个计数器,用来跟踪该数组被锁定的次数pvData: Pointer;//指向数据缓冲的指针rgsabound: array[0..0] of TSafeArrayBound;//描述数组每维的数组结构,该数组的大小是可变的end;TSafeArray = tagSAFEARRAY;{$EXTERNALSYM SAFEARRAY}SAFEARRAY = TSafeArray;====================================== ========================================= 一维数组的传递://一维数组传递procedure TForm1.ArrayT oSafeArray(DataArray: array of string);varVarBound: TVarArrayBound;psa: PSafeArray;i: Integer;AV1: OleVariant;begin//初始化OleValueVariantInit(OleValue);VarBound.LowBound := 0;VarBound.ElementCount := High(DataArray) + 1;psa := SafeArrayCreate(VT_BSTR, 1, VarBound);//创建SafeArray对象//将数组元素放到SafeArray中for i := Low(DataArray) to High(DataArray) dobeginAV1 := DataArray[i];SafeArrayPutElement(psa, i, TVarData(AV1).VPointer^);end;//封装到Varaint变量中TVarData(OleValue).VType := VT_ARRAY or VT_BSTR;TVarData(OleValue).VArray := pVarArray(psa);end;读取一维safeArray的步骤://使用SafeArrayGetLBound、SafeArrayGetUBound方法获取safeArray数组上下限function TForm1.SafeArrayT oText(OleValue: OleVariant): string;varRVarData: TVarData;RBound: TVarArrayBound;j, UCount: Integer;aValue: WideString;beginResult := '';//获取OleVaraint对象指针RVarData := FindVarData(OleValue)^;if RVarData.VArray = nil thenExit;VarResultCheck((SafeArrayGetLBound(pSafeArray(RVarData. VArray), 1, RBound.LowBound)));VarResultCheck(SafeArrayGetUBound(pSafearray(RVarData. VArray), 1, UCount));RBound.ElementCount := UCount - RBound.LowBound;for j := RBound.LowBound to RBound.ElementCount dobeginVarResultCheck(SafeArrayGetElement(PSafeArray(RVarData. VArray), j, aValue));if Result = '' thenResult := Result + aValueelseResult := Result + ',' + aValue;end;end;//另外附上将DataSet通过SafeArray传递的方法,其实为多维数组的传递:procedure TForm1.DataSetToSafeArray(ClientData: TClientDataSet);varDataArray: TDoubleArray;VarBound: array[0..1] of TVarArrayBound;Demen: array[0..1] of DWORD;psa: PSafeArray;i, j, k, Count: Integer;AV1: OleVariant;beginSetLength(DataArray, ClientData.FieldCount + 1, ClientData.RecordCount + 1);Count := 0;ClientData.First;while not ClientData.Eof dobeginfor i := 0 to ClientData.FieldCount - 1 dobeginif Count = 0 thenDataArray[i][Count] := ClientData.Fields[i].FieldNameelseDataArray[i][Count] := ClientData.Fields[i].Value;end;if Count > 0 thenClientData.Next;inc(Count);end;//--------开始转换为SafeArray-----------//初始化OleValueVariantInit(OleValue);VarBound[0].LowBound := 0;VarBound[0].ElementCount := ClientData.FieldCount + 1; VarBound[1].LowBound := 0;VarBound[1].ElementCount := ClientData.RecordCount + 1; psa := SafeArrayCreate(VT_BSTR, 2, VarBound);for i := Low(DataArray) to High(DataArray) dobeginDemen[0] := i;for j := Low(DataArray[i]) to High(DataArray[i]) dobeginDemen[1] := j;AV1 := DataArray[i][j];SafeArrayPutElement(psa, Demen, TVarData(AV1).VPointer^);end;end;TVarData(OleValue).VType := VT_ARRAY or VT_BSTR;TVarData(OleValue).VArray := pVarArray(psa);end;//读多维数组,读出后再转换为想要的格式:function TForm1.SafeArrayT oDataSet(oleValue: OleVariant): string;varRVarData: TVarData;RBound: array[0..1] of TVarArrayBound;Demen: array[0..1] of DWORD;i, j, DCount, UCount, iCount: Integer;aValue: WideString;beginResult := '';RVarData := FindVarData(OleValue)^;if RVarData.VArray = nil thenExit;DCount := RVarData.Varray^.DimCount; //取维数for i := 0 to DCount - 1 dobeginVarResultCheck((SafeArrayGetLBound(pSafeArray(RVarData. VArray), i + 1, RBound[i].LowBound)));VarResultCheck(SafeArrayGetUBound(pSafearray(RVarData. VArray), i + 1, UCount));RBound[i].ElementCount := UCount - RBound[i].LowBound;end;for j := RBound[1].LowBound to RBound[1].ElementCount do beginDemen[1] := j;for iCount := RBound[0].LowBound to RBound[0].ElementCount dobeginDemen[0] := iCount;VarResultCheck(SafeArrayGetElement(PSafeArray(RVarData. VArray), demen, aValue));if Result = '' thenResult := Result + aValueelseResult := Result + ',' + aValue;end;end;end;。

MSComm控件属性与事件

MSComm控件属性与事件

MSComm控件属性与事件1、CommPort属性•功能:设置或返回通信端口号。

•语法:–void CMSComm::SetCommPort(short nNewV alue); //设置串口号–short CMSComm::GetCommPort(); //查询当前串口号•说明:–nNewV alue取值范围:1~16,但是如果用SetPortOpen属性打开一个不存在的串口号,将产生错误。

•注意:–必须在打开端口之前设置CommPort属性。

程序://根据当前端口号选择所要打开的串口m_Comm.SetCommPort(atoi(m_strCOM.Mid(3,1)));2、PortOpen属性•功能:用于打开或关闭串口,或者返回串口的开关状态。

•语法:–void CMSComm::SetPortOpen(BOOL bNewV alue);–BOOL CMSComm::GetPortOpen();•说明:–bNewV alue=TRUE,则打开串口;–bNewV alue=FALSE,则关闭串口;–当程序终止时,MSComm控件会自动关闭。

–BOOL CMSComm::GetPortOpen(),返回值为真,则串口已打开,否则,未打开;程序if(m_Comm.GetPortOpen()){m_Comm.SetPortOpen(FALSE);}if(!m_Comm.GetPortOpen()){m_Comm.SetPortOpen(TRUE);//打开串口按钮颜色正常GetDlgItem(IDC_BUTTON_OPENPORT)->EnableWindow(FALSE);//关闭串口按钮颜色变灰GetDlgItem(IDC_BUTTON_CLOSEPORT)->EnableWindow(TRUE);}else{AfxMessageBox("cannot open serial port");}3、RThreshold属性•功能:•语法:–void CMSComm::SetRThreshold(short nNewV alue);–short CMSComm::GetRThreshold();•说明:–接收缓冲区收到nNewV alue个字符时产生OnComm事件。

vlax函数

vlax函数

vlax函数VLAX函数是AutoCAD中的一个常用的函数库,VLAX是VLA (Visual Lisp Automation)的一部分,其目的是为了帮助开发者避免编写太多的COM接口代码,同时也可以提高程序的运行速度。

VLAX函数可以用来访问AutoCAD的各种对象,如图形、块、属性、层等等。

使用VLAX函数可以更轻松地编写Lisp程序,同时也可以提高程序的可读性和可维护性。

这是因为VLAX函数的语法非常简单,易于理解,而且它拥有很多可以调用的方法。

下面是一些VLAX函数的实例:1.获取当前文档的ModelSpace和LayoutSpace:(setq doc (vla-get-ActiveDocument (vlax-get-Acad-Object)))(setq modelSpace (vla-get-ModelSpace doc))(setq layoutSpace (vla-get-PaperSpace doc))2.创建线段:(setq pts (vlax-make-safearray vlax-vbObject '(0 . 1))) (vlax-safearray-fill pts '(0 . 0) (vlax-variant-make 0.0)) (vlax-safearray-fill pts '(0 . 1) (vlax-variant-make 0.0)) (setq line (vla-AddLightWeightPolyline modelSpace 2 pts))3.获取模型空间中所有实体:(setq ents (vla-get-Entities modelSpace))(setq entList (vlax-for ent ents (list ent)))4.获取当前块的所有属性:(setq blk (vlax-ename->vla-object (tblobjname "B" "BLOCK")))(setq atts (vla-get-Attributes blk))(setq attList (vlax-for att atts (vla-get-TagString att))) 总之,VLAX函数是一个非常强大的工具,可以让AutoCAD的开发变得更加高效、简单、灵活。

array在python中的用法

array在python中的用法

array在python中的用法在Python中,array模块提供了一个数组对象,它类似于列表,但是与列表相比,它更加高效,因为它在内存中存储数据时使用了更少的空间。

array模块中的数组对象通常用于处理数值数据,尤其是当处理大量数据时,使用array模块可以显著提高程序的性能。

下面是array模块在Python中的一些基本用法:导入array模块:python复制代码importarray创建一个array对象:python复制代码# 创建一个包含整数的数组arr = array.array('i', [1, 2, 3, 4, 5])# 创建一个包含浮点数的数组arr_float = array.array('f', [1.1, 2.2, 3.3, 4.4,5.5])在上面的例子中,'i'和'f'是数组的类型码,分别表示整数和浮点数。

array模块支持多种类型码,如'b'表示有符号字符,'u'表示无符号字符,'h'表示有符号短整型等。

访问数组元素:python复制代码# 访问数组的第一个元素first_element =arr[0]# 修改数组的第三个元素arr[2] = 99数组切片:python复制代码# 获取数组的子数组(切片)sub_arr = arr[1:4] # 包含索引1, 2, 3的元素数组操作:python复制代码# 数组长度length = len(arr)# 数组求和sum_arr =arr.sum()# 数组最大值和最小值max_value =arr.max()min_value =arr.min()数组类型转换:python复制代码# 将整数数组转换为浮点数数组arr_float =arr.astype(float)将array对象转换为列表:python复制代码list_from_arr =arr.tolist()需要注意的是,array模块中的数组对象与Python的内置列表类型在用法上有很多相似之处,但array模块更适合处理大量数值数据,因为它在内存中使用更少的空间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录:SAFEARRAY使用实例目录:前言:何谓SAFEARRAY:创建SAFEARRAY:方法一:使用SafeArrayAllocDescriptor在栈上创建一维数组方法二:使用SafeArrayAllocDescriptor和SafeArrayAllocData在堆上创建一维数组方法三:使用SafeArrayAllocDescriptor和SafeArrayAllocData在堆上创建二维数组方法四:使用SafeArrayCreate在堆上创建一维数组方法五:使用SafeArrayCreate在堆上创建二维数组方法六:使用SafeArrayCreateEx创建包含结构的一维数组访问SAFEARRAY:方法一:使用SafeArrayAccessData方法方法二:使用SafeArrayGetElement和SafeArrayPutElementCComSafeArray类介绍:基本的入门例子:注意事项:前言:SAFEARRAY使用总是困扰很多人,为了把这个问题说个明白,我把我目前掌握的知识做个总结何谓SAFEARRAY:SAFEARRAY实际上是一个结构,关于这部分可以参考MSDN。

ms-help://MS.MSDNQTR.2003FEB.2052/automat/htm/chap7_9ntx.htm我们不需要关心16位操作系统下的定义,因为我们团队只在WIN2000以上平台下开发。

创建SAFEARRAY:方法一:使用SafeArrayAllocDescriptor在栈上创建一维数组//创建SAFEARRAY数组,每个元素为long型,该数组是一维数组long nData[10]={1,2,3,4,5,6,7,8,9,10};SAFEARRAY* pArray=NULL;HRESULT hr=SafeArrayAllocDescriptor(1,&pArray);//创建SAFEARRAY结构的对象pArray->cbElements=sizeof(nData[0]);pArray->rgsabound[0].cElements=10;pArray->rgsabound[0].lLbound=0;pArray->pvData=nData;pArray->fFeatures=FADF_AUTO|FADF_FIXEDSIZE;//FADF_AUTO指定在栈上分配数据,并且大小不可以改变(固定为10)//访问SAFEARRAY数组long* pValue=NULL;SafeArrayAccessData(pArray,(void**)&pValue);long Low(0),High(0);hr=SafeArrayGetLBound(pArray,1,&Low);//维数索引从1开始hr=SafeArrayGetUBound(pArray,1,&High);//维数索引从1开始SafeArrayUnaccessData(pArray);SafeArrayDestroy(pArray);这种方法在栈上分配数组元素所占的空间,即nData数组所用的空间方法二:使用SafeArrayAllocDescriptor和SafeArrayAllocData 在堆上创建一维数组//创建SAFEARRAY数组,每个元素为long型,该数组是一维数组long nData[10]={1,2,3,4,5,6,7,8,9,10};SAFEARRAY* pArray=NULL;HRESULT hr=SafeArrayAllocDescriptor(1,&pArray);//创建SAFEARRAY结构的对象pArray->cbElements=sizeof(nData[0]);pArray->rgsabound[0].cElements=10;pArray->rgsabound[0].lLbound=0;SafeArrayAllocData(pArray);long* pData=NULL;SafeArrayAccessData(pArray,(void**)&pData);long l(0),h(0);SafeArrayGetLBound(pArray,1,&l);SafeArrayGetUBound(pArray,1,&h);long Size=h-l+1;SafeArrayAccessData(pArray,(void**)&pData);for(long Idx=l;Idx<Size;++Idx){pData[Idx]=nData[Idx];}SafeArrayUnaccessData(pArray);//访问SAFEARRAY数组long* pValue=NULL;SafeArrayAccessData(pArray,(void**)&pValue);long Low(0),High(0);hr=SafeArrayGetLBound(pArray,1,&Low);//维数索引从1开始hr=SafeArrayGetUBound(pArray,1,&High);//维数索引从1开始SafeArrayUnaccessData(pArray);SafeArrayDestroy(pArray);方法三:使用SafeArrayAllocDescriptor和SafeArrayAllocData 在堆上创建二维数组SAFEARRAY* pArray=NULL;HRESULT hr=SafeArrayAllocDescriptor(2,&pArray);pArray->rgsabound[0].lLbound=0;pArray->rgsabound[0].cElements=3;pArray->rgsabound[1].lLbound=0;pArray->rgsabound[1].cElements=3;pArray->cbElements=sizeof(long);hr=SafeArrayAllocData(pArray);long lDimension[2];long x=1;//为第一行赋值for(long i=0;i<3;++i){lDimension[1]=0;//行lDimension[0]=i;//列SafeArrayPutElement(pArray,lDimension,&x);x++;}//为第二行赋值for(long i=0;i<3;++i){lDimension[1]=1;//行lDimension[0]=i;//列SafeArrayPutElement(pArray,lDimension,&x);x++;}//读取SafeArray中第二行第三列的数据long y(0);lDimension[1]=1;lDimension[0]=2;SafeArrayGetElement(pArray,lDimension,&y);SafeArrayDestroy(pArray);二维SAFEARRAY数组使用的时候下标要注意,这里采用的是列主序的方式,即lDimension[1]代表行,lDimension[0]代表列。

方法四:使用SafeArrayCreate在堆上创建一维数组SAFEARRAYBOUND Bound[1];Bound[0].lLbound=0;Bound[0].cElements=10;SAFEARRAY* pArray=SafeArrayCreate(VT_I4,1,Bound);long* pData=NULL;HRESULT hr=SafeArrayAccessData(pArray,(void**)&pData);long Low(0),High(0);SafeArrayGetLBound(pArray,1,&Low);SafeArrayGetUBound(pArray,1,&High);long Size=High-Low+1;for(long Idx=Low;Idx<Size;++Idx){pData[Idx]=Idx;cout<<pData[Idx]<<endl;}SafeArrayUnaccessData(pArray);SafeArrayDestroy(pArray);方法五:使用SafeArrayCreate在堆上创建二维数组SAFEARRAYBOUND Bound[2];Bound[0].lLbound=0;Bound[0].cElements=3;Bound[1].lLbound=0;Bound[1].cElements=3;SAFEARRAY* pArray=SafeArrayCreate(VT_I4,2,Bound);long Demen[2];for(long i=0;i<3;++i){for(long j=0;j<3;++j){Demen[1]=i;Demen[0]=j;long x=i*j;SafeArrayPutElement(pArray,Demen,&x);}}//访问二维数组for(long i=0;i<3;++i){for(long j=0;j<3;++j){Demen[1]=i;Demen[0]=j;long x(0);SafeArrayGetElement(pArray,Demen,&x);cout<<"("<<i<<","<<j<<") "<<x<<endl;}}SafeArrayDestroy(pArray);方法六:使用SafeArrayCreateEx创建包含结构的一维数组使用SAFEARRAY传递UDT(自定义结构)是一项常用的技术,MSDN文档描述得比较齐全,要注意的一点是,自定义结构要求有自己的GUID,这必须在IDL文件中定义。

同时还必须要使用IRecordInfo接口,该接口将和数组一起传递出去,IRecordInfo接口内部记录了UDT的描述信息。

IDL文件中:[uuid(810930AA-9229-46e7-B20C-41F6218D0B1A)]struct _BookMarkSchema{BSTR Name;BSTR Context;BSTR Time;};…interface IShape : IDispatch{[id(6), helpstring("获取属于某用户的书签名称列表")] HRESULT GetBookMarkName([in] BSTR UserID,[out] SAFEARRAY(struct _BookMarkSchema)* pBookMarkNames);}library SarstShapeLib{importlib("stdole2.tlb");[uuid(DBDCC0F1-38F3-4EB4-A5BD-79A3707BDE9C),helpstring("Shape Class")]coclass Shape{[default] interface IShape;};struct _BookMarkSchema;};方法的实现为:STDMETHODIMP CShape::GetBookMarkName(BSTR UserID,SAFEARRAY** pBookMarkNames){//获得GIS库信息CSarstConfigure Configure;string Flag("GIS");string IP,Database,UserName,Key,Context;Configure.GetDatabaseInfo(Flag,IP,Database,UserName,Key,Context);//读取图层属性数据USES_CONVERSION;string user(CString(UserID).GetBuffer());string sql("SELECT 书签名,书签描述,时间FROM 用户书签表where 用户ID='"+user+"' order by 时间desc");FBData data(IP,Database,UserName,Key);table t=data.GetTable(sql);if(t.empty()){return S_FALSE;}//创建SafeArrayIRecordInfo* pRecordInfo=NULL;HRESULThr=::GetRecordInfoFromGuids(LIBID_SarstShapeLib,1,0,GetUserDefaultLCID(),IID_STR UCT_BookMarkSchema,&pRecordInfo);if(FAILED(hr))return E_FAIL;*pBookMarkNames=::SafeArrayCreateVectorEx(VT_RECORD,0,long(t.size()-1),(void*)p RecordInfo);_BookMarkSchema* pData=NULL;hr=::SafeArrayAccessData(*pBookMarkNames,(void**)&pData);for(int i=0;i<int(t.size()-1);i++){t[i+1].at(0).CopyTo(&pData[i].Name);t[i+1].at(1).CopyTo(&pData[i].Context);t[i+1].at(2).ChangeType(VT_BSTR);t[i+1].at(2).CopyTo(&pData[i].Time);}::SafeArrayUnaccessData(*pBookMarkNames);pRecordInfo->Release();return S_OK;}访问SAFEARRAY:方法一:使用SafeArrayAccessData方法这种方法可以参见创建SAFEARRAY之方法一请注意,访问完后要调用SafeArrayUnaccessData方法,并且调用SafeArrayDestroy 销毁数组这种方式通常用于访问一位数组方法二:使用SafeArrayGetElement和SafeArrayPutElement这种方法可以参见创建SAFEARRAY之方法五这种方式在访问多维数组的时候很有用CComSafeArray类介绍:基本的入门例子:可以参见下面的MSDN链接ms-help://MS.MSDNQTR.2003FEB.2052/vclib/html/vclrfCComSafeArray.htm注意,我个人认为本例有错,应该最后加上一句代码delete pSar;因为虽然pvData指针指向的内存是在堆中,但是tagSAFEARRAY结构对象生存在new开辟的堆上,如果不delete的话,将会内存泄漏。

相关文档
最新文档