VB、VC 混合编程(dll)中数组的传入传出.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:4 大小:34KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

VB、VC 混合编程(dll)中数组的传入传出.doc

VB、VC混合编程(dll)中数组的传入传出.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

VB、VC混合编程(dll)中数组的传入传出2008年10月23日星期四21:39以前用到的神经网络都是在matlab中调的,而项目需要,要写个神经网络的算法,系统主界面是VB写的,在VB中做网络训练速度是不照的,用VB,VC的混合编程,但是一直被VB与Dll之间的数组传递这个难题所困扰,在网上搜了也找不到答案,据说safearray可以解决,但是看了下比较麻烦,在CSDN社区中也没有找到答案,但是社区中一个朋友的指点,给我找到解决问题的方法了。下面总结下共享。数值型数组在VB中其数据是连续存放的,相当于一维的,而在C/C++中数组可以等价于指向数组第1个元素的指针。可以用引用的方式把VB中数组的第1个元素的地址传给VC编写的DLL,在DLL中用一个指针来接收,这样就实现了VB到Dll在中数组的传递。从DLL传递数组给VB方法相同,过程相反.如果是二维数组,则把二维数组按照一维数组的方式传入传出,只是在使用的时候,顺便把二维数组的行和列数传递即可。总体思想是这样的。下面看例子。VC中:double_stdcallOneDimensionArrayTest(double*inArr,intnCount,double*outArr,int*ioutArrCount)//一维数组的传入传出{intiNum=nCount;double*dRes=newdouble[iNum];inti;for(i=0;i<nCount;i++){dRes[i]=inArr[i]*2;}for(i=0;i<nCount;i++){outArr[i]=dRes[i];}*ioutArrCount=iNum;returndRes[0];delete[]dRes;}void_stdcallTwoDimensionArrayTest(double*inArr,intnRows,intnCols,double*outArr,int*outRows,int*outCols)//二维数组的传入传出{double*dRes=newdouble[nRows*nCols];inti;intj;for(i=0;i<nRows;i++){for(j=0;j<nCols;j++){dRes[nCols*i+j]=inArr[nCols*i+j]*2;}}for(i=0;i<nRows;i++){for(j=0;j<nCols;j++){outArr[nCols*i+j]=inArr[nCols*i+j]*2;}}*outRows=nRows;*outCols=nCols;delete[]dRes;}LIBRARY"TestDll"EXPORTS;此处可以是显式导出Add@1darray@2OneDimensionArrayTest@3TwoDimensionArrayTest@4VB中DeclareFunctionOneDimensionArrayTestLib"D:\在编程序\Dll\VBLoadDll\TestDll.dll"(ByRefinputerAsDouble,ByValinLengthAsLong,ByRefoutputAsDouble,ByRefoutLengthAsLong)AsDoubleDeclareFunctionTwoDimensionArrayTestLib"D:\在编程序\Dll\VBLoadDll\TestDll.dll"(ByRefinputerAsDouble,ByValinRowsAsLong,ByValinColsAsLong,ByRefoutputerAsDouble,ByRefoutRowsAsLong,ByRefoutColsAsLong)PrivateSubcmdTest2_Click()Diminputer(8)AsDoubleDimout(9)AsDoubleDimresAsDoubleDimmAsLonginputer(0)=1.2inputer(1)=2.3inputer(2)=1res=OneDimensionArrayTest(inputer(0),9,out(0),m)MsgBoxCStr(m),vbOKOnly,"一维数组的元素个数"'MsgBoxCStr(res)DimstrAsStringDimiAsIntegerFori=0ToUBound(out)str=str+""+CStr(out(i))NextMsgBoxstr,vbOKOnly,"一维数组的元素"EndSubPrivateSubcmdTest3_Click()DimiR