精华内容
下载资源
问答
  • 动态链接库(dll)的好处就不多说了,这里就把如何在VB中调用VC写的dll函数的方法介绍一下,供需要的朋友们参考,同时也免得自己以后忘了。 初次接触DLL的用户经常会遇到一个问题:在VC环境下创建的DLL,在VC里...

    动态链接库(dll)的好处就不多说了,这里就把如何在VB中调用VC写的dll函数的方法介绍一下,供有需要的朋友们参考,同时也免得自己以后忘了。

    初次接触DLL的用户经常会遇到一个问题:在VC环境下创建的DLL,在VC里运行的好好的,可在VB应用程序中调用时却老是出现"调用约定错误"、"找不到入口点"之类的错误。这主要是由以下疏漏造成的。


    首先,要注意DLL中的函数和VB中的函数声明在名称、返回类型、参数类型、参数个数等方面必须完全相同,尤其要注意大小写的问题。
    其次,在DLL的.def文件中必须加上入口函数。
    最后,在函数定义前必须加上extern "c",_stdcall关键字。

    其中 _stdcall 是一种函数的调用约定,有关函数的调用约定可以参考文章

    http://hi.baidu.com/atomxu/blog/item/01334717c378924621a4e955.html


    比如现在做一个求数组中所有元素的和的函数,完整代码如下

    DLL_test_dll.h中的代码

    extern "C"
    {
     int _stdcall sum(int len,int* a);
    }

     

    DLL_test_dll.cpp中的代码,红色部分为自己写的代码,其余的为系统自动生成

    // DLL_test_dll.cpp : 定义 DLL 应用程序的入口点。
    //

    #include "DLL_test_dll.h"
    #include <iostream>
    using namespace std;


    #ifdef _MANAGED
    #pragma managed(push, off)
    #endif

    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
          )
    {
        return TRUE;
    }

    #ifdef _MANAGED
    #pragma managed(pop)
    #endif

    extern "C"
    int _stdcall sum( int len,int* a )
    {
     int result = 0;
     for ( int i = 0;i<len;i++ )
     {
      result = result+a[i];
     }
     return result;
    }

    还要在工程中添加一个 def 文件来指定导出的函数,这个直接在VC中新建文件就可以,扩展名是  .def

    DLL_test_dll.def文件中的内容为

    LIBRARY "DLL_test_dll"
    EXPORTS
    sum  @1

    把上面的代码都写好后编译就可以生成  .dll   和  .lib  文件了,下面是说如何在VB中调用并传递数组参数

    首先在VB中声明dll中的函数,名字要和dll中的函数名一致,至于变量类型这个没法对应,毕竟是两种语言,不过要注意的是变量数量和变量大小应该是对应的,比如现在在C语言中 int 型是 4 字节,在VB中就要用 Integer 型来对应,函数声明方法如下

    Public Declare Function sum Lib "E://Study//VB//DLL_test_dll//Debug//DLL_test_dll.dll" (ByVal a As Integer,ByRef b As Integer) As Integer

    以上代码是在一行中写的

    与一般函数生命的不同之处就是多了一个 Declare ,Function 后面的 sum 就是函数名,要与dll中一致,Lib 是指定dll地址的,推荐用全路径地址,不过如果只写一个名字并把dll跟程序放在一个目录下的话应该也可以,这个没试过

    注意到上面参数定义的红色的 ByRef 关键字,VB中函数参数的传递有两种方式,一种是传值,就是前面那个 ByVal,另一种就是传地址,就是这里用的 ByRef,由于我们想传递数组参数,所以要用 ByRef 方式传递

    函数定义完了具体要如何调用呢,请看下面的例子

    Dim a As Integer      '定义一个整数,作为数组长度
    Dim b(1) As Integer   '定义一个有两个数的数组,其中的1代表数组下标上界,这里与C语言是不同的
    Dim c As Integer      '顶一个整数存放结果

    a = 2
    b(0) = 17
    b(1) = 11
    c = sum(a, b(0))

     

    这里可能有点令人费解,我明明应该传数组的地址,怎么传了个 b(0) 过去呢?

    这里要说的是在 C/C++ 语言中数组的地址和第一个元素的地址是相同的,VB语言中 ByRef 方式直接传递的就是参数的地址,综合上面两条就可以知道这个语句实际传递的就是数组 b 中第一个元素 b(0) 的地址,这样就完成了从VB中向dll数组参数参数的传递

    参考文章:

    http://hi.baidu.com/hfutgiser/blog/item/63418858a4f09f87810a187e.html

    http://www.360doc.com/content/06/0804/14/6002_173346.shtml

    展开全文
  • 一种VB窗体之间简单的参数传递方法

    千次阅读 2008-09-04 14:57:00
    假设两个窗体 form1 和form2,form1打开form2时必须将一个值传递给form2,实现该参数传递的方法如下: 首先form2定义一个变量,如下 public nt as string 然后form1给该变量赋值,如下 form2.nt="aaa" ...

     假设有两个窗体 form1 和form2,form1打开form2时必须将一个值传递给form2,实现该参数传递的方法如下:

     

    首先在form2定义一个变量,如下

      public nt as string

     

    然后在form1中给该变量赋值,如下

     

      form2.nt="aaa"

     

      form2.show

     

    如此,即将“aaa”传递给了form2.

    展开全文
  • 如题,在传递数组参数的时候报错,网上也一些关于参数的提问,传回的数组参数只有一个数,这里一篇百度的文章解决的方法已经算是解决了,但是看了一下,它使用的函数vs2012没有,如 ``` Call mtInitM Dim...
  • vb中byref参数类型不符

    千次阅读 2011-12-05 20:36:46
    在vb中执行过程或函数时,提示"byref参数类型不符" 分析问题主要由于对应参数的类型不符造成的。造成这种情况一般几种情况: 1。传递参数未定义类型,假如参数在调用前未定义类型,系统自动将他定义为variant类型...

    在vb中执行过程或函数时,提示"byref参数类型不符" 分析问题主要由于对应参数的类型不符造成的。造成这种情况一般有几种情况:

    1。传递参数未定义类型,假如参数在调用前未定义类型,系统自动将他定义为variant类型,由于和过程或函数中的对就参数类型不相同,所以提示"byref参数类型不符"

    2。传递参数类型已定义,但由于定义方法不对,所以提示"byref参数类型不符"。具体情况如下: 当vb中如此定义变量时,将会出现以上错误信息的出现 

     private sub command1_click() 

     dim i , j as integer

     i = 3 j = 4 

     call get1(i, j) 

     text1.text = i 

     end sub

     private sub get1(byref para1 as integer, para2 as integer) 

     para1 = para1 + para2 

     end sub

     假如将 dim i , j as integer 改为 dim i as integer dim i as integer 程式执行正常。也就是说,第一种方法的变量定义,只是对 j 做了定义,并未对前面的 i 进行定义 一般在过程和函数中定义参数时采用byref,则需要参数声明的类型和实际参数的类型完全相同,否则vb就会报告错误

    展开全文
  • 在VB中执行过程或函数时,会提示"ByRef参数类型不符" 。  分析VB.NET参数类型不符这一问题主要由于对应参数的类型不符造成的。造成这种情况一般几种情况:  1。传递参数未定义类型,如果参数在调用前未定义...

      在VB中执行过程或函数时,会提示"ByRef参数类型不符" 。

      分析VB.NET参数类型不符这一问题主要由于对应参数的类型不符造成的。造成这种情况一般有几种情况:

      1。传递参数未定义类型,如果参数在调用前未定义类型,系统自动将它定义为Variant类型,由于与过程或函数中的对就参数类型不相同,所以提示"ByRef参数类型不符"

      2。传递参数类型已经定义,但由于定义方法不对,所以提示"ByRef参数类型不符"。具体情况如下:

      当VB中如此定义变量时,将会出现VB.NET参数类型不符的问题

      Private Sub Command1_Click()

      Dim i , j As Integer

      i = 3 j = 4 Call get1(i, j)

      Text1.Text = i End Sub

      Private Sub get1(ByRef para1 As Integer, para2 As Integer)

      para1para1 = para1 + para2

      End Sub

      如果将 Dim i , j As Integer 改为

      Dim i As Integer

      Dim i As Integer

      程序执行正常。也就是说,第一种方法的变量定义,只是对 J 做了定义,并未对前面的 I 进行定义

      一般在过程和函数中定义参数时采用ByRef,则要求参数声明的类型和实际参数的类型完全相同,否则就会出现VB.NET参数类型不符。

      上海阜和进修学校

    展开全文
  • 在网上找了好多关于在程序向VB脚本传递自定义对象文章,一般都采用script controlAddObject方法,不过这个方法有个缺点,那就是在VB脚本必须要知道程序传递给脚本对象名字,这样就使程序扩充性受到了...
  • 关于VB提示ByRef参数类型不符分析

    千次阅读 2006-09-18 15:12:00
    在VB中执行过程或函数时,提示"ByRef参数类型不符" 分析问题主要由于对应参数的类型不符造成的。造成这种情况一般几种情况:1。传递参数未定义类型,如果参数在调用前未定义类型,系统自动将它定义为Variant类型...
  • 各种语言,输入参数传递方法(地址传递、值传递)各不同。如: VB :默认为地址传递,可以指定用值传递 C: 普通方式实现值传递,指针方式实现地址传递 C++:比 C 多了引用传...
  • 参数传递

    2010-07-15 11:47:00
    <br />这个知识点当初第一次接触vb的时候就不懂,现在回过头来仔细看看,把它放在过程函数使用反而将它掌握了也记过程这张网了,不会轻易忘记了。 介绍参数传递之前,先说说过程,所谓过程就是...
  • 比如..VB中有MODEL C#中为何要取消呢...WINFROM中做用户登录,权限控制需要传权值吧.这样传起来相当的麻烦...这几日想了好久也想出以下的方法 重载窗体的构造函数,比如frmF1(要传的参数);当然也可以传递DataSet,...
  • VB 2010 (14)共享方法

    2020-04-04 17:07:52
    共享方法中唯一能使用变量就是共享变量、传递方法中的参数,或共享方法内部声明变量。如果试图共享方法中访问实例变量,将会产生一个编译错误。 另外,共享方法实际上是类而非任何对象一部分,所以...
  • C#使用ADO中的AddNew方法.

    千次阅读 2006-07-14 16:37:00
    项目中使用WebService,使用C#编写,调用VB写的组件,VB组件使用ADO,其中有的方法是需要传递Recordset的,但是C#中的Recordset.AddNew的方法VB中的不同,这是由于C#没有默认的参数.C#中的AddNew的方法原型为:AddNew...
  • 一、 前言  数据类型转换编程经常用到,VB6提供了一整套类型转换函数。但是,进行类型转换时,时候仅仅依靠VB提供... Visual Basic使用Byte数组主要是为了32位API函数的参数传递和函数返回。...
  • 2、传递至out参数的实参可以不初始化,因为即使初始化实参,out方法中也无法取得该值,但在方法中必须初始化(即使参数不被使用) 3、无法同时使用ref和out方法,不可以同时重载 4、一个方法中可以同时使用多个Ref...
  • 但是shell命令中的参数传递也是非常讲究,对于第一次使用人来说,很可能会难以理解,并且加上此类知识网上也很难找到,所以会导致学习起来非常困难。 本节课程,我们就一起来学习如何使用shell命令
  • 一、 前言   数据类型转换编程经常用到,VB6提供了一整套类型转换函数。但是,进行类型转换时,时候仅仅依靠VB提供... Visual Basic使用Byte数组主要是为了32位API函数的参数传递和函数返回。3
  • 一、 前言 数据类型转换编程经常用到,VB6提供了一整套类型转换函数。但是,进行类型转换时,时候仅仅依靠VB提供... VisualBasic使用Byte数组主要是为了32位API函数的参数传递和函数返回。32位Vis
  • VB6字节数组和字符串相互转换(转)

    千次阅读 2009-02-07 16:03:00
    一、 前言 数据类型转换编程经常用到,VB6提供了一整套类型转换函数。但是,进行类型转换时,时候仅仅依靠VB... Visual Basic使用Byte数组主要是为了32位API函数的参数传递和函数返回。32位Visual
  • 一、 前言 数据类型转换编程经常用到,VB6提供了一整套类型转换函数。但是,进行类型转换时,时候仅仅依靠... Visual Basic使用Byte数组主要是为了32位API函数的参数传递和函数返回。32位Visua...
  • VB课程设计俄罗斯方块

    热门讨论 2011-02-25 10:46:55
    将它的形状编号为0和1,后面方便调用,其他的方块造型同样的方法。 2.1.3俄罗斯方块的旋转 俄罗斯方块的旋转主要将方块的位置加以变换得到的,例如上述范例,长条型样式,根据小方块的编号变动来实现整个...
  • 项目中使用WebService,使用C#编写,调用VB写的组件,VB组件使用ADO,其中有的方法是需要传递Recordset的,但是C#中的Recordset.AddNew的方法VB中的不同,这是由于C#没有默认的参数.C#中的AddNew的方法原型为:AddNew...
  • VB.Net常用语法

    2009-03-15 23:47:02
    在VB.Net有些事件是要自已动手写, 如窗体鼠标过程,一般加上这个参数在后面括号内就解决了。 四:重载语法Overloads 如:class class1 public strtem as string overloads public sub subx()重载sub...
  • 6.通过编写上面代码,我们在vb中编写asp组件实例环境已经具备了, 下面,我就尝试写两个与asp中基本相类似函数,也就是说,关键部位就在 这里了,你完全可以把你所有asp源码封装在这里... 先写个最简单输出屏幕...
  • VB.NET高级编程(第二版)

    热门讨论 2008-07-18 15:47:58
    Microsoft在VB.NET融入了许多新功能,其中非常重要就是完全实现了面向对象编程,并极大地增强了Web设计功能。 本书主要内容包括:.NET Framework和公共语言运行时(CLR)、应用继承从基类中派生类、...

空空如也

空空如也

1 2 3
收藏数 60
精华内容 24
关键字:

在vb中传递参数的方法有