`
dazhilao
  • 浏览: 245856 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

【转】VB VC 混合编程(dll)中 数组 的传入传出

阅读更多

原文地址:http://hi.baidu.com/hfutgiser/blog/item/63418858a4f09f87810a187e.html

       以前用到的神经网络都是在matlab中调的,而项目需要,要写个神经网络的算法,系统主界面是VB写的,在VB中做网络训练速度是不照的,用VB,VC的混合编程,但是一直被VB与Dll之间的数组传递这个难题所困扰,在网上搜了也找不到答案,据说safearray可以解决,但是看了下比较麻烦,在CSDN社区中也没有找到答案,但是社区中一个朋友的指点,给我找到解决问题的方法了。下面总结下共享。
    数值型数组在VB中其数据是连续存放的,相当于一维的,而在C/C++中数组可以等价于指向数组第1个元素的指针。可以用引用的方式把VB中数组的第1个元素的地址传给VC编写的DLL,在DLL中用一个指针来接收,这样就实现了VB到Dll在中数组的传递。从DLL传递数组给VB方法相同,过程相反.
    如果是二维数组,则把二维数组按照一维数组的方式传入传出,只是在使用的时候,顺便把二维数组的行和列数传递即可。
    总体思想是这样的。下面看例子。

VC中:

double _stdcall OneDimensionArrayTest(double *inArr,int nCount,double *outArr,int* ioutArrCount) //一维数组的传入传出
{
    int iNum=nCount;
     double *dRes=new double[iNum];
    int i;
     for(i=0;i<nCount;i++)
     {
         dRes[i]=inArr[i]*2;
     }

    for(i=0;i<nCount;i++)
     {
         outArr[i]=dRes[i];
     }
    *ioutArrCount=iNum;
     return dRes[0];
     delete []dRes;
}


void _stdcall TwoDimensionArrayTest(double *inArr,int nRows,int nCols,double *outArr,int* outRows,int *outCols)//二维数组的传入传出
{
     double *dRes=new double[nRows*nCols];
    int i;
     int j;
     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 @1
    darray @2
    OneDimensionArrayTest @3
TwoDimensionArrayTest @4

VB中
Declare Function OneDimensionArrayTest Lib "D:\在编程序\Dll\VBLoadDll\TestDll.dll" (ByRef inputer As Double, ByVal inLength As Long, ByRef output As Double, ByRef outLength As Long) As Double
Declare Function TwoDimensionArrayTest Lib "D:\在编程序\Dll\VBLoadDll\TestDll.dll" (ByRef inputer As Double, ByVal inRows As Long, ByVal inCols As Long, ByRef outputer As Double, ByRef outRows As Long, ByRef outCols As Long)

Private Sub cmdTest2_Click()
Dim inputer(8) As Double
Dim out(9) As Double
Dim res As Double
Dim m As Long
inputer(0) = 1.2
inputer(1) = 2.3
inputer(2) = 1
res = OneDimensionArrayTest(inputer(0), 9, out(0), m)
MsgBox CStr(m), vbOKOnly, "一维数组的元素个数"

'MsgBox CStr(res)

Dim str As String
Dim i As Integer
For i = 0 To UBound(out)
   str = str + "   " + CStr(out(i))
Next
MsgBox str, vbOKOnly, "一维数组的元素"
End Sub

Private Sub cmdTest3_Click()
Dim iRows As Integer
Dim iCols As Integer
iRows = 3
iCols = 4
Dim inputer() As Double
ReDim inputer(iRows, iCols)
Dim outputer() As Double
ReDim outputer(iRows, iCols)
Dim oRows As Long
Dim oCols As Long
Dim i, j As Integer
For i = 0 To UBound(inputer, 1)
   For j = 0 To UBound(inputer, 2)
     inputer(i, j) = (i + 1) * (j + 1)
   Next
Next
Dim str As String
For i = 0 To UBound(inputer, 1)
   For j = 0 To UBound(inputer, 2)
      str = str + "   " + CStr(inputer(i, j))
   Next
   str = str + vbCrLf
Next
MsgBox str, vbOKOnly, "inputer,二维数组的输入"

Call TwoDimensionArrayTest(inputer(0, 0), iRows + 1, iCols + 1, outputer(0, 0), oRows, oCols)

str = ""
'
For i = 0 To UBound(outputer, 1)
   For j = 0 To UBound(outputer, 2)
      str = str + "   " + CStr(outputer(i, j))
   Next
   str = str + vbCrLf
Next
MsgBox str, vbOKOnly, "outputer,二维数组的输出"
End Sub
笨方法,很简单,但是真的可以用

分享到:
评论

相关推荐

    VB调用VC的DLL,

    本篇文章将详细探讨如何在VB中调用使用VC6.0开发的DLL。 1. **DLL的基本概念** 动态链接库(DLL)是一种共享代码的机制,允许多个应用程序同时使用同一份代码,从而节省内存资源并提高程序效率。VC6.0是Microsoft ...

    VC VB 联合编程

    在这个案例中,"VC VB 联合编程"指的是使用Visual C++(VC)和Visual Basic(VB)这两种不同的编程工具进行协作,通过动态链接库(DLL)来实现程序功能的扩展。下面将详细阐述这一主题: 1. **VC算法生成DLL**: ...

    VB call vc dll

    在Windows应用程序开发中,VB作为高级编程语言,常用于构建用户界面,而VC则擅长底层编程和高效计算。通过调用VC编译生成的DLL,VB应用可以利用DLL中的函数实现更复杂的功能。 **VB调用VC DLL的基本步骤:** 1. **...

    VB调用VC DLL

    在IT行业中,VB(Visual Basic)和VC(Visual C++)是两种常见的编程语言,分别由微软公司开发,用于创建Windows应用程序。VB6.0是VB的一个版本,它以其直观的用户界面和事件驱动编程模型而闻名,适合快速开发应用...

    将数组从VC ++ DLL传递到VB

    VB6数组传递给DLL时实际上是传入一个指向连续内存区域的指针,而VC++需要知道数组的维度。因此,DLL内部可能需要解析VB6传递的数组,或者要求VB6先将数组转换为一维数组。 3. **调用约定**: 由于VB6默认使用...

    Variant输入出参数,ocx传递byte数组,safearray使用方法,vc写ocx在vb下调用

    当在 VC 中定义 OCX 控件的方法时,可以声明 Variant 类型的参数,这样VB调用时,无论传入何种类型的数据,都能被正确处理。在VB中,可以直接赋值给 Variant 变量,然后作为参数传递给 OCX 方法。 2. OCX 传递字节...

    《通过VB结构数组输入数据VC编写DLL实现图形文件(1)》配套源代码

    《通过VB结构数组输入数据VC编写DLL实现图形文件(1)》是一篇关于在VB(Visual Basic)中利用VC(Visual C++)编写的DLL(Dynamic Link Library)处理图形文件的文章,重点在于如何通过结构数组在VB和VC之间传递数据...

    VC_DLL应用方法

    本文将深入探讨如何在VB(Visual Basic)应用程序中使用由VC(Visual C++)编写的DLL文件,以及相关的导入与调用方法。 首先,我们需要理解DLL的优点。DLL可以减少内存占用,因为它在内存中只加载一次,可被多个...

    突破VB之DLL编写教程

    在上述代码中,`DllMain`函数根据传入的`dwReason`参数判断DLL当前的状态。例如,当DLL首次加载到进程中时,会执行`DLL_PROCESS_ATTACH`分支,此时输出“Dll is attached!”;当DLL从进程中卸载时,则执行`DLL_...

    CreateProcess创建暂停进程进行DLL注入-[VC.Dll+VB.Code]

    在`Test.exe`(VB窗体应用)中,你可以调用`InjectDll`函数,传入你要注入的进程名(如`notepad.exe`)和DLL路径(如`C:\path\to\HP.dll`),来测试DLL注入的效果。 注意,DLL注入可能涉及安全风险,因为它允许代码...

    VB6 MD5正确完整应用 含DLL和调用模块

    DLL文件是由VC(Visual C++)编写的,意味着它是用C++语言实现的MD5算法,这通常比VB6原生实现更高效。 MD5的应用场景包括但不限于: 1. 文件校验:通过计算文件的MD5值,可以判断文件在传输或存储过程中是否被篡改...

    VC2015调用C#的DLL的范例

    在编程领域,跨语言通信是常见的需求之一。本示例主要展示了如何在VC++2015环境下调用由C#2015编写的DLL动态链接库。这个过程涉及到了COM(Component Object Model)技术,它允许不同编程语言之间进行互操作。以下是...

    A simple way to call a VB ActiveX DLL from a VC/MFC Client在

    在实际开发过程中,"VCClient"可能是包含MFC代码的客户端项目,而"VB ActiveX"可能是一个包含VB ActiveX DLL源码的文件或项目。两者结合,形成一个完整的跨语言交互示例。 总结来说,通过理解和应用上述步骤,...

    VB测试FFT.rar

    整个项目流程可能是这样的:VB程序通过调用DLL中的函数,传入时域信号数据,DLL执行FFT计算后返回频域数据,VB接收到数据后,利用TChart组件将这些数据绘制成图表,用户就可以看到信号的频率分布情况。 这个项目...

    ATL数组传递详细说明

    本文将详细介绍如何在 ATL/MFC DLL 中实现数组的有效传递,包括数组作为参数传入函数以及作为返回值从函数传出的情况。 #### 二、将数组打包到 VARIANT 在 COM 编程中,`VARIANT` 类型常用于封装多种数据类型,以...

    vc下编写的DLL可实现实时曲线绘制

    VB代码可以创建一个定时器对象,每隔一定时间调用DLL的函数,将新数据传入,从而在VB界面中实时更新曲线。 为了实现曲线的实时绘制,开发者可能使用了GDI(Graphics Device Interface)或者更现代的GDI+,这些是...

    VC通过包装类来调用VBActiveXDLL[定义].pdf

    在软件开发过程中,有时我们需要在不同的编程环境中进行互操作,比如在C++(VC)中调用VB(Visual Basic)编写的ActiveX DLL。本文主要介绍如何通过包装类在VC中调用VBActiveXDLL。 首先,我们创建VB ActiveX DLL。...

    crc-ccitt.rar_CRC CCITT_VC调用VB_ccitt crc _vb G_visual basic ccit

    总之,CRC-CCITT是一种有效的错误检测方法,而本话题涉及到的实践是通过VC++创建DLL并用VB调用来实现CRC校验,这对于在不同编程环境中集成CRC校验功能非常有用。了解这些内容有助于理解数据通信中的错误检测机制,...

    TSC条码打印机-VC6调用范例

    1. **加载库文件**:在VC6项目中,我们需要先将"TSCLIB.DLL"文件引入,这可以通过`LoadLibrary`函数实现。这样我们才能在程序运行时访问到库中的函数。 2. **获取函数指针**:接下来,我们需要获取DLL中具体函数的...

    欧姆龙PLC全系列HostLink通信协议串口动态链接库DLL.pdf

    DLL提供了全面的函数接口,使得操作变得简单,无论是VB、VC还是Delphi等开发环境,都可以轻松集成。它还支持USB和PC扩展卡等扩展串口号,兼容多种操作系统,如win9x、win2000和winXP,极大地增强了其适应性。 具体...

Global site tag (gtag.js) - Google Analytics