欢迎来到天天文库
浏览记录
ID:41032853
大小:34.50 KB
页数:4页
时间:2019-08-14
《VB、VC 混合编程(dll)中数组的传入传出》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、VB、VC混合编程(dll)中数组的传入传出2008年10月23日星期四21:39以前用到的神经网络都是在matlab中调的,而项目需要,要写个神经网络的算法,系统主界面是VB写的,在VB中做网络训练速度是不照的,用VB,VC的混合编程,但是一直被VB与Dll之间的数组传递这个难题所困扰,在网上搜了也找不到答案,据说safearray可以解决,但是看了下比较麻烦,在CSDN社区中也没有找到答案,但是社区中一个朋友的指点,给我找到解决问题的方法了。下面总结下共享。数值型数组在VB中其数据是连续存放的,相当于一维的,
2、而在C/C++中数组可以等价于指向数组第1个元素的指针。可以用引用的方式把VB中数组的第1个元素的地址传给VC编写的DLL,在DLL中用一个指针来接收,这样就实现了VB到Dll在中数组的传递。从DLL传递数组给VB方法相同,过程相反.如果是二维数组,则把二维数组按照一维数组的方式传入传出,只是在使用的时候,顺便把二维数组的行和列数传递即可。总体思想是这样的。下面看例子。VC中:double_stdcallOneDimensionArrayTest(double*inArr,intnCount,double*out
3、Arr,int*ioutArrCount)//一维数组的传入传出{intiNum=nCount;double*dRes=newdouble[iNum];inti;for(i=0;i4、ntnRows,intnCols,double*outArr,int*outRows,int*outCols)//二维数组的传入传出{double*dRes=newdouble[nRows*nCols];inti;intj;for(i=0;i5、ols*i+j]*2;}}*outRows=nRows;*outCols=nCols;delete[]dRes;}LIBRARY"TestDll"EXPORTS;此处可以是显式导出Add@1darray@2OneDimensionArrayTest@3TwoDimensionArrayTest@4VB中DeclareFunctionOneDimensionArrayTestLib"D:在编程序DllVBLoadDllTestDll.dll"(ByRefinputerAsDouble,ByValinLeng6、thAsLong,ByRefoutputAsDouble,ByRefoutLengthAsLong)AsDoubleDeclareFunctionTwoDimensionArrayTestLib"D:在编程序DllVBLoadDllTestDll.dll"(ByRefinputerAsDouble,ByValinRowsAsLong,ByValinColsAsLong,ByRefoutputerAsDouble,ByRefoutRowsAsLong,ByRefoutColsAsLong)PrivateSu7、bcmdTest2_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(8、out)str=str+""+CStr(out(i))NextMsgBoxstr,vbOKOnly,"一维数组的元素"EndSubPrivateSubcmdTest3_Click()DimiRowsAsIntegerDimiColsAsIntegeriRows=3iCols=4Diminputer()AsDoubleReDiminputer(iRows,iCols)Dim
4、ntnRows,intnCols,double*outArr,int*outRows,int*outCols)//二维数组的传入传出{double*dRes=newdouble[nRows*nCols];inti;intj;for(i=0;i5、ols*i+j]*2;}}*outRows=nRows;*outCols=nCols;delete[]dRes;}LIBRARY"TestDll"EXPORTS;此处可以是显式导出Add@1darray@2OneDimensionArrayTest@3TwoDimensionArrayTest@4VB中DeclareFunctionOneDimensionArrayTestLib"D:在编程序DllVBLoadDllTestDll.dll"(ByRefinputerAsDouble,ByValinLeng6、thAsLong,ByRefoutputAsDouble,ByRefoutLengthAsLong)AsDoubleDeclareFunctionTwoDimensionArrayTestLib"D:在编程序DllVBLoadDllTestDll.dll"(ByRefinputerAsDouble,ByValinRowsAsLong,ByValinColsAsLong,ByRefoutputerAsDouble,ByRefoutRowsAsLong,ByRefoutColsAsLong)PrivateSu7、bcmdTest2_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(8、out)str=str+""+CStr(out(i))NextMsgBoxstr,vbOKOnly,"一维数组的元素"EndSubPrivateSubcmdTest3_Click()DimiRowsAsIntegerDimiColsAsIntegeriRows=3iCols=4Diminputer()AsDoubleReDiminputer(iRows,iCols)Dim
5、ols*i+j]*2;}}*outRows=nRows;*outCols=nCols;delete[]dRes;}LIBRARY"TestDll"EXPORTS;此处可以是显式导出Add@1darray@2OneDimensionArrayTest@3TwoDimensionArrayTest@4VB中DeclareFunctionOneDimensionArrayTestLib"D:在编程序DllVBLoadDllTestDll.dll"(ByRefinputerAsDouble,ByValinLeng
6、thAsLong,ByRefoutputAsDouble,ByRefoutLengthAsLong)AsDoubleDeclareFunctionTwoDimensionArrayTestLib"D:在编程序DllVBLoadDllTestDll.dll"(ByRefinputerAsDouble,ByValinRowsAsLong,ByValinColsAsLong,ByRefoutputerAsDouble,ByRefoutRowsAsLong,ByRefoutColsAsLong)PrivateSu
7、bcmdTest2_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(
8、out)str=str+""+CStr(out(i))NextMsgBoxstr,vbOKOnly,"一维数组的元素"EndSubPrivateSubcmdTest3_Click()DimiRowsAsIntegerDimiColsAsIntegeriRows=3iCols=4Diminputer()AsDoubleReDiminputer(iRows,iCols)Dim
此文档下载收益归作者所有