vb调用vc 的DLL
VB调用CC++编写的DLL函数说明

VB调用C/C++编写的DLL函数说明2009-11-10 10:58:17| 分类:技术文摘| 标签:|举报|字号大中小订阅方法一:VB默认的传递方式就是传指针(ByRef,也就是把变量的地址传递给所调用的函数)。
如果要传值(也就是把变量的值传递给所调用的函数)反要在参数声明前加ByVal。
所以如果你传递的参数是普通的数据类型,在参数前什么都不要加就行了。
如C语言声明为:void __stdcall MyProc(short * nPara);则VB声明为:Declare Function MyProc Lib "MyDll.dll" (nPara As Integer)调用时同普通函数。
如果C语言中的指针是字符串指针,那么在VB声明时需要加上ByVal,这是个例外。
如C语言声明为:void __stdcall MyProc(char * sPara);则VB声明为:Declare Function MyProc Lib "MyDll.dll" (ByVal sPara As String)调用时同普通函数。
如果C语言的指针是数组指针,则在VB中调用时应将数组的首元素传递给DLL。
如C语言声明为:void __stdcall MyProc(int [] arrPara);则VB声明为:Declare Function MyProc Lib "MyDll.dll" (nPara As String)调用时为MyProc A(0)。
注意:不能直接传递数组名,因为如果传递数组名,VB实际会传一个复杂的结构类型给DLL,这对编写C语言的DLL来说,处理这样的结构比较麻烦,所以通常都不支持这种方式。
方法二:C++ 函数需要指针到C 函数或传递一个数组当从VisualBasic 数组传递到函数通常, 如果编写一个函数在 C 或C++, 中并且未明确旨在函数调用从VisualBasic, 函数需要指针指向第一个元素的数组。
VB6.0调用C# Dll解决方法

VB6.0调用C# Dll解决方法在工作中遇到了在VB6.0的程序里要调用C#的Dll的问题,显然这两个开发环境属于不同的平台。
在网上拜读了几位大师的文章后,在实际试验中还是会发生这样那样的问题,最后还是实现了预期效果,在此我把我的实验步骤和注意事项分享如下,希望对需要之人有所帮助:实验环境:C#dll的创建使用的是VS2010;VB6.0一、C#部分1.用C#创建一个TestVB项目(VS2010);2.所有在VB6中要使用的方法都必须通过继承接口实现,并且为public的(非常重要,没有继承接口实现的方法,在VB6.0里面无法调用);3.接口和类都需要加入属性Guid;Guid通过VS2010自带的工具得到:4.在VS2010的DOS命令工具提示框中运行:sn -k C:\myKey.snk<回车>在C盘根目录下生成一个强名称文件:myKey.snk(注意这个强名称文件的名字可以自己定义,我暂定为myKey.snk)5. 右击项目,选择属性,打开并编辑项目的属性对话框在Application tab中,点击Assembly Information按钮,在打开的对话框中选中“make Assembly COM-Visible”(重要)COM-Visible”(重要)。
在Signing Tab中引入上一步创建的强名称文件myKey.snk不为1.0.*,应该是一个具体的值;7.编译这个项目,生成dll文件。
到此为止,C#的Dll部分已经准备完毕了。
二、VB6部分1. VB6调用环境必须安装.Net framework 4.0或以上版本,最好是4.0(和VS2010相同的framework);2. 复制dll文件进入VB6环境的目标文件夹,例如D:根目录, D:\TestCom.dll3. 在Dos命令窗口用regasm命令注册这个dll文件生成.tlb文件regasm D:\TestCom.dll /tlb:D:\TestCom.tlb /codebase在D:\将会生成一个TestCom.tlb文件4.在Dos命令窗口用gacutil命令添加Dll文件到GAC中(全局程序集缓存),这样这个Dll文件在这个PC中就可以随处使用gacutil /I D:\TestCom.dll5.在VB6项目中,把生成的.tlb文件加入到项目(References)6. VB6代码即可调用tlb文件Private Sub Command1_Click()Dim a As New TestVB.Cryptmand1.Caption = a.Encrypt("aa", "bb")End Sub注意:以上3,4步,需要在VB6环境的C:\WINDOWS\system32下面有相应的exe 文件才可运行;第4步,可以省去;还要说明的是,当转移这个VB6生成的exe程序(这个VB6可执行文件引用了C#的dll)到另外一台电脑上的时候,需要把这个C# Dll文件一同Copy到那台电脑上,并且重新执行第3步的注册生成tlb文件的工作,否则这个exe程序无法运行。
用VB调用VC编写的DLL

这些函数名要用做 VB 中声明时的别名。
如果声明时不带别名会出现“Dll 调用约定错误”。
VB 中编写如下代码运行即可:
Option Explicit
Private
Declare
Function
FuncInDll
Lib
"E:\Computer
Science\dll\liudll\dll_withLibAndH.dll" Alias "_FuncInDll@12" (ByVal a As Long,
如何用 VB 调用 VC 编写的 DLL
——DLL 内函数调用采用别名 首先用 C++编写: dll_withlibAndH.h 如下: extern "C" __declspec(dllexport) int __stdcall FuncInDll (int a);
dll_withlibAndH.cpp 如下: #include <objbase.h> #include <iostream.h> #include "dll_withLibAndH.h"//看到没有,这就是我们增加的头文件
创建一个.bat 文件并输入:
Cl/c dll_withLibAndH.cpp
Link/dll dll_withLibAndH.obj 之后运行此批处理文件即生成 dll_withLibAndபைடு நூலகம்.dll 文件。用 Dll 函数查看器(Viewdll
程序)查看此 dll 文件内的函数,此处为_FuncInDll@12(12 为此函数的参数字节数),
ByVal b As Long, ByVal c As Long) As Long
VB调用C程序的方法

VB调用C程序的方法—动态链接库法文中介绍了一种实现VB调用C语言程序的方法-动态连接库法,给出了动态链接库制作的一般框架,通过实例描述了动态连接库的实现及其制做方法、编程步骤,这种方法具有普遍的意义。
关键词VB 动态连接库DLL C程序一、引言Visual Basic( 以下简称VB)是一种可视化的面向对象的编程语言,以其编程简单、快捷等特点,深受广大WINDOWS程序员的青睐。
利用VB开发界面友好、操作方便的软件只需很短的时间。
但是VB运行速度较慢,对于庞大的科学计算问题,VB的这种慢速会使人难以忍受。
C语言是国际上非常流行的一种中级编程语言,以其灵活、高效等优点而获得广泛应用,许多的应用程序都是用C语言在DOS环境下编写而成。
那么如何发挥VB和C这两种语言的优势,用VB设计一种良好的for windows界面来调用C语言程序,即实现VB调用C 语言程序呢?现有的文献只提到动态链接库(以下简称DLL)可以将这两种语言连接起来,但有讲动态链接库DLL的制做及其编程方法。
本文详细介绍了Borland C环境下制作动态链接库以及VB调用for dos动态链接库的的方法、步骤,并通过实例描述VB调用C程序的全过程。
二、用Borland C编写DLL程序的方法要想实现VB调用C程序,首先需要用Borland C编写动态连接库DLL程序(假设DLL程序取名为example)。
动态链接库包含四个文件:C语言源程序(.C)、模块定义文件(.DEF)、原型函数文件(.H)和工程文件(.PRJ)。
下面分别详细介绍一下这四种文件的具体结构。
1、编写C语言源程序的框架:C语言源程序(example.C),它包括三种函数:入口函数、输出函数和终止函数。
其具体结构如下:/*************************************//* 文件名:example.C *//*************************************/#include <windows.h>/***********入口函数***********/int FAR PASCAL LibMain ( HANDLE hInstance,WORD wDataSeg,WORD cbHeapSize,LPSTR lpszCmdLine ){if (cbHeapSize!=0)UnlockData(0);return (1);}/***********输出函数***********/int FAR PASCAL example(int param1,...,char param n){...... /*C语言应用程序*/}/***********终止函数***********/int FAR PASCAL WEP ( int /*SystemExit*/ ){return(1);}以上各组成部分参数的含义:Windows.h头文件,它包含有数据类型的定义、API入口点定义和其它有用的参数信息。
vc 6.0编写DLL文件及vb调用示例

利用vc6.0编写DLL文件,为了方便其他函数调用,可以采取以下方式方法过程一采用Win32 Dynamic-Link Library建立。
过程:本次采用建立一个计算整数的平方和立方的plf.dll文件。
1文件—新建—工程—Win32 Dynamic-Link Library,工程名称为plf,点击确定,后选择一个空白文档。
2,点击做下角FileView。
显示如图1所示2.左上角文件—新建—文件—C++ Source File,输入名称为plf.,建立空白文档plf.cpp在其内输入代码如图2所示:3左上角文件—新建—文件—C++ Header File,输入名称为plf.,建立空白文档plf.h在其内输入代码如图3所示:4在plf文件夹中新件文本文档,里面输入如图4所示代码保存,改后缀名为def.名称为plf.def。
5 右击Source Files,选中添加文件到目录,对话框选中plf.def文件。
6点击组建(plf.dll)或者直接键盘F7。
7打开DEBUG文件夹中有两个文件为plf.dll和plf.lib文件,保留。
三验证1 使用vc验证建立vc源程序,输入代码为2 采用vb验证其中关键是语句Public Class Form1Private Declare Function sq Lib"D:\vcb\plf\plf.dll" (ByVal i As Integer) As IntegerPrivate Declare Function cub Lib"D:\vcb\plf\plf.dll" (ByVal j As Integer) AsInteger。
(完整版)vb调用vc的DLL

4.1 新建工程打开在VC++6.0,new一个Win32-Dynamic-Link Library工程dlltest。
4.2 在工程中添加代码4.2.1添加lib.h文件:#ifndef _LIB_H_#define _LIB_H_extern “C” int __stdcall add(int,int) ;extern “C” int __stdcall sub(int,int) ;/*__stdcall 约定如果通过VC++ 编写的DLL 欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall 方式,WINAPI 都采用这种方式,而C/C++缺省的调用方式却为__cdecl。
__stdcall 方式与__cdecl 对函数名最终生成符号的方式不同*/#endif4.2.2添加lib.cpp文件:#include “lib.h”int __stdcall add(int a,int b){return a+b ;}int __stdcall sub(int a,int b){return a-b ;}4.2.3添加lib.def文件:右击SOURCE FILE目录,添加一个文本文件(不能是word文档,一般是txt 格式的),将文档重命名为lib.def,点击打开该文档。
在文档中输入代码:LILBRARY dlltestEXPORTSadd @ 1sub @ 2说明:DLL函数的导出有两种方式。
一种是显式导出:在.h文件中在函数声明前加入如下语句:__declspec(dllexport)。
使用该方法是不用添加.def文档的。
该方法导出的函数,只能被C或C++调用,不能被其他语言调用。
一种是隐式导出:就是在SOURCE FILE目录中添加一个.def文档,在该文档中写入要导出函数的代码。
.def语法规定注释用分号(;),且注释不能与代码共享一行,代码说明如下:LIBRARY dlltest;该语句说明了相应的DLL工程。
VB调用DLL文件

VB调用DLL文件
VB默认的传递方式就是传指针(ByRef,也就是把变量的地址传递给所调用的函数)。
如果要传值(也就是把变量的值传递给所调用的函数)反要在参数声明前加ByVal。
1.如果你传递的参数是普通的数据类型,在参数前什么都不要加就行了。
如C语言声明为:
void __stdcall MyProc(short * nPara);
则VB声明为:
Declare Function MyProc Lib "MyDll.dll" (nPara As Integer) 调用时同普通函数。
2.如果C语言中的指针是字符串指针,那么在VB声明时需要加上ByVal,这是个例外。
如C语言声明为:
void __stdcall MyProc(char * sPara);
则VB声明为:
Declare Function MyProc Lib "MyDll.dll" (ByVal sPara As String)
调用时同普通函数。
3.如果C语言的指针是数组指针,则在VB中调用时应将数组的首元素传递给DLL。
如C语言声明为:
void __stdcall MyProc(int [] arrPara);
则VB声明为:
Declare Function MyProc Lib "MyDll.dll" (nPara As String)
调用时为MyProc A(0)。
注意:不能直接传递数组名,因为如果传递数组名,VB实际会传一个复杂的结构类型给DLL,这对编写C语言的DLL来说,处理这样的结构比较麻烦,所以通常都不支持这种方式。
vb6.0调用cdll文件总结

VB6.0调用C# Dll文件总结VB6.0调用C# Dll文件总结在工作中遇到了在VB6.0的程序里要调用C#的Dll的问题,显然这两个开发环境属于不同的平台。
在网上拜读了几位大师的文章后,在实际试验中还是会发生这样那样的问题,最后还是实现了预期效果,在此我把我的实验步骤和注意事项分享如下,希望对需要之人有所帮助:实验环境:C#dll的创建使用的是VS2008;VB6.0一、C#部分1.用C#创建一个ClassLibrary项目(VS2008);2.所有在VB6中要使用的方法都必须通过继承接口实现,并且为public的(非常重要,没有继承接口实现的方法,在VB6.0里面无法调用);3.接口和类都需要加入属性Guid;Guid通过VS2008自带的工具得到:4.在VS2008的DOS命令工具提示框中运行:sn -k C:\myKey.snk<回车>在C盘根目录下生成一个强名称文件:myKey.snk(注意这个强名称文件的名字可以自己定义,我暂定为myKey.snk)5. 右击项目,选择属性,打开并编辑项目的属性对话框在Application tab中,点击Assembly Information按钮,在打开的对话框中选中“make Assembly COM-Visible”(重要)在Build Tab中,最好用Release模式编译,确认选中“Make assembly COM-Visible”(重要)。
在Signing Tab中引入上一步创建的强名称文件myKey.snk6. 检查项目的AssemblyInfo文件,ComVisible应设为true,项目和文件版本不为1.0.*,应该是一个具体的值;7.编译这个项目,生成dll文件。
到此为止,C#的Dll部分已经准备完毕了。
二、VB6部分1. VB6调用环境必须安装.Net framework2.0或以上版本,最好是3.5(和VS2008相同的framework);2. 复制dll文件进入VB6环境的目标文件夹,例如D:根目录,D:\TestCom.dll3. 在Dos命令窗口用regasm命令注册这个dll文件生成.tlb 文件regasm D:\TestCom.dll /tlb:D:\TestCom.tlb /codebase在D:\将会生成一个TestCom.tlb文件4.在Dos命令窗口用gacutil命令添加Dll文件到GAC中(全局程序集缓存),这样这个Dll文件在这个PC中就可以随处使用gacutil /I D:\TestCom.dll5.在VB6项目中,把生成的.tlb文件加入到项目(References)6. VB6代码即可调用tlb文件Private Sub Command1_Click()Dim obj As New t0426a.Class1bel1.Caption = obj.GetString()End Sub注意:以上3,4步,需要在VB6环境的C:\WINDOWS\system32下面有相应的exe文件才可运行;第4步,可以省去;还要说明的是,当转移这个VB6生成的exe程序(这个VB6可执行文件引用了C#的dll)到另外一台电脑上的时候,需要把这个C# Dll文件一同Copy到那台电脑上,并且重新执行第3步的注册生成tlb文件的工作,否则这个exe程序无法运行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.1 新建工程
打开在VC++6.0,new一个Win32-Dynamic-Link Library工程dlltest。
4.2 在工程中添加代码
4.2.1添加lib.h文件:
#ifndef _LIB_H_
#define _LIB_H_
extern “C” int __stdcall add(int,int) ;
extern “C” int __stdcall sub(int,int) ;
/*
__stdcall 约定
如果通过VC++ 编写的DLL 欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall 方式,
WINAPI 都采用这种方式,而C/C++缺省的调用方式却为__cdecl。
__stdcall 方式与__cdecl 对函数名
最终生成符号的方式不同
*/
#endif
4.2.2添加lib.cpp文件:
#include “lib.h”
int __stdcall add(int a,int b)
{
return a+b ;
}
int __stdcall sub(int a,int b)
{
return a-b ;
}
4.2.3添加lib.def文件:
右击SOURCE FILE目录,添加一个文本文件(不能是word文档,一般是txt 格式的),将文档重命名为lib.def,点击打开该文档。
在文档中输入代码:
LILBRARY dlltest
EXPORTS
add @ 1
sub @ 2
说明:DLL函数的导出有两种方式。
一种是显式导出:在.h文件中在函数声明前加入如下语句:
__declspec(dllexport)。
使用该方法是不用添加.def文档的。
该方法导出的函数,只能被C或C++调用,不能被其他语言调用。
一种是隐式导出:就是在SOURCE FILE目录中添加一个.def文档,在该文档中写入要导出函数的代码。
.def语法规定注释用分号(;),且注释不能与代码共享一行,代码说明如下:LIBRARY dlltest
;该语句说明了相应的DLL工程。
EXPORTS
add @ 1
sub @ 2
;该语句声明了将DLL工程中导出的函数,只要写入
;函数名称即可,不用说明返回值以及函数参数。
其实@ 1
;和@ 2是为函数编号所使用的
在添加所有的工程文件后,编译生成dll文件后
4.3 用vc调用DLL
在vc中new一个Win32 Console Application 工程test
代码如下:
#include <windows.h>
#include <stdio.h>
typedef int (__stdcall *padd)(int,int) ;
typedef int (__stdcall *psub)(int,int) ;
int main()
{
HINSTANCE hd ;
hd = LoadLibrary(“填入要调用DLL的路径”) ;
if(!hd)
{
printf(“Load DLL err\n”) ;
return 0 ;
}
padd add = (padd)GetProcAddress(hd,“add”) ;
if(!add)
{
printf(“Get add err\n”) ;
FreeLibrary(hd) ;
return 0 ;
}
psub sub = (psub)GetProcAddress(hd,“sub”) ;
if(!sub)
{
printf(“Get sub err\n”) ;
FreeLibrary(hd) ;
return 0 ;
}
printf(“add=%d\nsub=%d\n”,add(1,2),sub(5,3)) ;
FreeLibrary(hd) ;
return 0 ;
}
4.4 用vb调用DLL
代码如下:
Public Declare Function add Lib "dlltest.dll" (ByVal a As Integer,ByVal b As Integer) As Integer
Private Sub Command1_Click()
Dim c As Integer
c = add(1, 2)
MsgBox c
End Sub。