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程序无法运行。
VB6中如何访问C#Dll中的方法、属性以及事件
VB6中如何访问C#Dll中的方法、属性以及事件一个简单的例子实现VB6中访问C# dll中的方法、属性以及事件。
C# DLL1) 要使得C# dll中的方法、属性以及事件在VB6中暴露出来,以便写代码方便,需要加入相应的接口- 方法和属性的接口,本例中为IComInterOpClass[Guid("12A7D9AE-B42F-4a91-9EEE-5E0951A552E2")][InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]public interface IComInterOpClass{//Methodstring SayHello();//Propertystring Name { get; set; }}- 事件的接口,本例中为IComInterOpEvent[Guid("868FD423-2504-4f5c-AB47-9F2B7DB8ED2C")][InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispat ch)]public interface IComInterOpEvent{void EventTest(string msg);}2) 实现部分,注意事件的接口不需要继承,它是以Attribute的方式加入的。
本例中的事件是用timer实现5秒钟触发一次。
namespace ComInterOpLibrary{public delegate void EventTestHandler(string message);[Guid("BA6DF62E-D59E-4e46-B2E6-F1CD990A1E18")][ClassInterface(ClassInterfaceType.None)][ComSourceInterfacesAttribute("ComInterOpLibrary.IComIn terOpEvent")][ProgId("ComInterOpClass")]public class ComInterOpClass : IComInterOpClass{private Timer myTimer = null;//Eventpublic event EventTestHandler EventTest;//Propertypublic string Name { get; set; }public ComInterOpClass(){myTimer = new Timer(5000);myTimer.AutoReset = true;myTimer.Enabled = true;myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);}void myTimer_Elapsed(object sender, ElapsedEventArgs e) {if (EventTest != null){EventTest("Good day!");}#region IComInterOpClass Members//Methodpublic string SayHello(){return"Hello " + Name;}#endregion}}3) 至此,C# dll部分就完成了,最后记得将项目的Register for COM InterOp选上。
在VC实现可在VB中调用的DLL
a = Compare(1, 2)
MsgBox a
End Sub
是不是很简单呢~,呵呵,因为这只是一个测试用的工程,所以我用了最简单的表达方式,本来想写一个运算量大些的函数的,无奈自己实在想不起来什么东西了,抱歉,当然大家看完会问为什么要这样做,为什么这样写的问题,不要着急,我把在VC写DLL需要看和注意的东西都放到下面了,这些都是我在学习写DLL的时候从网络中找到的资料,希望对大家也有帮助:)
如dll要输出如下两个函数:
extern "C" _declspec(dllexport) int _stdcall GetInt(char* name);
extern "C" _declspec(dllexport) char* _stdcall GetStr(int id);
则def文件书写如下(TEST为工程名):
2.文件--新建 新建三个文件 TextDll.cpp(C++代码文件)
TextDll.h(C++头文件)
TextDll.def(模块定义文件,这个文件我是新建的文本文件,在文件名的 地方直接写的TextDll.def,当然你也可以在菜单 工程--增加到工程--文 件 处添加也可以)
3.代码
TextDll.h:
#ifdef __cplusplus
extern "C" {
#endif
__stdcall int CALLBACK Compare (int, int) ;
#ifdef __cplusplus
}
#endif
TextDll.cpp:
VB调用C程序的方法―动态链接库法
VB调用C程序的方法―动态链接库法【摘要】本文将介绍VB调用C程序的方法―动态链接库法。
我们将解释动态链接库的概念以及如何在VB中使用动态链接库调用C程序。
接着我们会详细讲解如何创建动态链接库和在VB中调用动态链接库的步骤。
在最后的注意事项中,我们将强调一些需要注意的细节和技巧。
结论部分将强调VB调用C程序的方法的重要性,并讨论未来的发展方向。
通过本文,读者将了解如何利用动态链接库实现VB和C程序之间的无缝衔接,为软件开发提供更多可能性。
VB调用C程序的方法―动态链接库法在软件开发中扮演着重要的角色,其未来发展方向也值得我们深入探讨。
【关键词】VB调用C程序、动态链接库、概念、使用、创建、调用、注意事项、重要性、未来发展方向1. 引言1.1 VB调用C程序的方法―动态链接库法VB调用C程序的方法―动态链接库法是一种常见且高效的方法,用于实现不同编程语言之间的互操作性。
动态链接库(Dynamic Link Library,简称DLL)是一种共享库,其中包含了可被程序动态调用的函数和资源。
在VB中调用C程序,可以通过创建动态链接库来实现。
首先需要编写一个C程序,并将其编译为动态链接库。
然后在VB中通过声明函数的方式引用这个动态链接库,就可以直接调用其中的函数了。
这样可以充分利用C程序的高性能和灵活性,实现与VB的无缝集成。
需要注意的是,在使用动态链接库时要确保函数的参数和返回值的类型与VB中的数据类型兼容。
要避免内存泄漏等问题,需要注意内存的分配和释放。
VB调用C程序的方法―动态链接库法对于提高程序的性能和扩展功能具有重要意义。
未来可以进一步完善这种方法,提供更加方便快捷的方式实现跨语言调用,促进不同语言之间的交流和合作。
VB调用C 程序的方法―动态链接库法将在跨平台开发和系统集成方面发挥越来越重要的作用。
2. 正文2.1 动态链接库的概念动态链接库(Dynamic Link Library,简称DLL)是一种可被多个程序同时使用的程序代码和数据的集合,它可以在运行时被载入内存,并由多个进程共享。
如何实现VB和VC的联合调试
如何实现VB和VC的联合调试我用VC写了一个DLL,然后用VB写EXE。
我现在想调试我的DLL和EXE,在VB环境下调试,可是我无法跳入DLL函数的内部,无法在DLL内部调试。
有没有一个办法能让我实现VB和VC联调,当我在VB环境中需要跳入DLL函数时,进入VC环境,在VC中调试,这样我就可以查看变量值、设置断点,然后等函数返回时又回到VB环境下继续调试。
后来经过我自己的一番摸索,终于实现了VB、VC联调。
这个方法是以VC为主环境,VB为副环境,这是因为DLL是由VC编写的,而在调试DLL的时候一般会让我们指定一个EXE。
如果DLL是VB编写的,我想应该是以VB为主环境(没有测试过)。
1.建立一个VB Standard EXE工程project1.vbp,在这个工程中调用VC编写的动态连接库中的函数。
2.建立一个VC DLL工程TestDll,编写代码实现函数输出。
建议把整个工程目录放置到project1.vbp 所在的目录。
3.设置VC工程,这一步是非常重要的,是实现联调的关键。
a) 更改General选项卡中OutPut Files的路径,指定到project1.vbp所在的目录。
由于我把工程目录放在了project1.vbp目录下,因此我这里用相对路径“..\”(其实就是project1.vbp所在的目录)。
b) 更改Debug选项卡中Executable for debug session:为你电脑中VB6.exe;更改Working directory为project1.vbp所在的目录;在Program arguments:中填写project1.vbp,这个参数其实是传给VB的,让VB打开project1.vbp,如果增加参数”/r”,那么在VB启动后立即开始(相当于按F5),如果不增加参数”/r”,那么需要手动开始。
c) 确认你的Link选项卡中输出DLL的路径及DLL名称,把他设定到project1.vbp所在的目录:4.在你的DLL源程序(VC中)中设定断点,按F5, GO!怎么样,VB环境已经运行起来了,工程project1.vbp 已经打开了吧!如果你在3)b.的Program arguments:中指定了”/r”参数,那么这个时候程序已经开始运行了,如果你没有指定这个参数,那么你可以先在VB环境中设定断点,然后在调用DLL函数上设置断点,按F5,Start!如果在VB中遇到断点,程序就会停下,然后按F8,Step into! 发现什么了,哈哈,VC环境主动切换到前面,而且当前的箭头已经指向了被调用函数了,这个时候,已经进入VC环境了,你想怎么调试都可以!当被调用函数要结束时,请按F11,Step Out,否则会有一段汇编代码。
分享如何在VB中调用VC编写的DLL
分享如何在VB中调⽤VC编写的DLL⼀般来说,VB和VC共同编程有3种⽅式:⼀种是VC⽣成DLL,在VB中调⽤DLL;⼀种是VC⽣成ActiveX控件(.ocx),在VB中插⼊;还有⼀种是在VC中⽣成ActiveX Automation服务器,在VB中调⽤。
相对⽽⾔,第⼀种⽅法对VC编程者的要求最低,但要求你的伙伴进⾏配合,我推荐这种⽅法。
先说说VC++的编程。
⾸先在VC++中⽣成Win32 DLL⼯程。
在这个⼯程中添加⼏个函数供VB⽤户调⽤。
⼀个DLL中的函数要想被VB调⽤,必须满⾜两个条件:⼀是调⽤⽅式为stdcall,另⼀个是必须是export的。
要做到第⼀条,只须在函数声明前加上__stdcall关键字。
如:short __stdcall sample(short nLen, short *buffer)要做到第⼆条,需要在*.def⽂件中加上如下的⼏⾏:EXPORTSsample @1这⾥的sample是你要在VB中调⽤的函数名,@1表⽰该函数在DLL中的编号,每个函数都不⼀样。
注意这⾥的函数名是区分⼤⼩写的。
⾄于你说的需要传递⼤量数据,可以这样做,在VB中⽤⼀个数组存放数据,然后将该数组的⼤⼩和地址传给VC(⾄于如何在VB中编程我会在下⾯介绍)。
就象上⾯的例⼦,nLen是数组⼤⼩,buffer是数组地址,有了这两条,你可以象使⽤VC的数组⼀样进⾏处理了。
⾄于输出图形,可以⽣成WMF或BMP格式,让VB调⽤。
不过,我认为也可以直接输出到视窗,只要VB将窗⼝的句柄hWnd和hDC以及视窗的绘图位置(VB和VC采⽤的坐标系必须⼀致才⾏)传给VC就⾏了。
⽽VB的AutoRedraw属性必须为False,在Paint事件中调⽤VC的绘图程序。
再谈谈VB的编程。
VB调⽤DLL的⽅法和调⽤Windows API的⽅法是⼀样的,⼀般在VB的书中有介绍。
对于上⾯⼀个例⼦,先要声明VC函数:Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer这⾥mydll.dll是你的dll的名字。
一步一步教你用VC和VB挪用C_DLL
Step by Step: Calling C++ DLLs from VC++ and VB 一步一步教你用VC和VB挪用C++ DLL.本系列教程讨论了一般情形下4种利用DLL的方式从VC++应用程序调用C++ DLL的函数Part 1从VC++应用程序调用C++ DLL的类从VB应用程序调用C++ DLL的函数从VB应用程序调用C++ DLL的类从VC++应用程序动态的调用C++ DLL的函数从VC++应用程序挪用C++ DLL的函数Visual Studio 6 使创建包括函数或类的动态连接库(DLL) 变得超级容易。
第一步:打开Visual Studio 然后选择File | New菜单项:选择Win32 Dynamic Link Library, 输入工程名, 敲OK.选择A DLL that exports some symbols并单击Finish.在File View里你会看到如下的工程文件:第二步在里,你将看到如下代码:TEST_API int fnTest(void){return42;}果你此刻编译, 你将会取得一个能够被其他VC++应用程序直接挪用的DLL.许诺其他VC++程序挪用的关键机制?( key mechanism)就包括在中:All files within this DLL#ifdef TEST_EXPORTS#define TEST_API __declspec(dllexport)#else#define TEST_API __declspec(dllimport)#endif};extern TEST_API int nTest;TEST_API int fnTest(void);那个地址面发生了什么? #ifdef TEST_EXPORTS是什么意思? TEST_EXPORTS又是在哪概念的?TEST_EXPORTS若是被概念, 那么TEST_API将会被概念为__declspec(dllexport) (DLL导出),不然,将会被概念为__declspec(dllimport)(DLL导入). 这将阻碍到后边概念的Ctest 类是导出类仍是导入类. 这意味着若是咱们需要导出的时候,咱们就得概念TEST_EXPORTS.当一个VC++应用程序要访问那个DLL的时候,能够将链接进去,它包括了DLL的导出符号.第三步:TEST_EXPORTS在哪里被概念了呢? DLL wizard干了一件我讨厌的事,它把TEST_EXPORTS 放到了命令行里. 选择Project | Settings | C/C++ | General,你将看到工程选然了,那个方法是可行的. 可是它却容易让人忽计,而且可能致使保护上的麻烦. 我比较喜爱清楚明白的概念TEST_EXPORTS : 从项目选项里边去掉/D "TEST_EXPORTS",然后在里来概念它:..注意#define TEST_EXPORTS在#include ""前边. 因此,它概念要在头文件里.此刻,能够像先前那样从头编译咱们的, 咱们将取得一个能够被其他VC应用程序所挪用的DLL.第四步咱们如何挪用DLL里的函数呢? 举个例子吧, 我用VS创建一个例如. 选MFC AppWizard (exe),输入项目名字,然后点OK. 选择基于对话框. 然后点Finish.打开(XXX是你的工程名字.) 找到OnInitDialog()成员函数, 敲进去如下的代码:...The framework does this automatically..第六步若是你想赶时刻做一个演示的话, 你可能会尝试只是拷贝DLL的到你的项目目录里去,那么编译器会找到它. 但是当项目很大的时候,这可不是个好主意, 因为当你更新你的DLL文件时,可能会遇上危险.比如忘了拷贝它到你的exe的目录中去.这里有个简单的方法来解决这个问题: 选择Project | Settings | C/C++ | Settings | Preprocessor, 而且添加Additional include directories: (DLL工程的目录)提示:如此做事实上是假设DLL项目和EXE项目拥有同一个项目目录.此刻当我编译的时候, 我取得了一个linker errors!!Deleting intermediate files and output files for project 'TestExe - Win32 Debug'. --------------------Configuration: TestExe - Win32 Debug-------------------- Compiling resources...Compiling...Compiling...Generating Code...Linking...: error LNK2001: unresolved external symbol "__declspec(dllimport)public: __thiscall CTest::CTest(void)" (__imp_??0CTest@@QAE@XZ): error LNK2001: unresolved external symbol "__declspec(dllimport)int __cdecl fnTest(void)" (__imp_?fnTest@@YAHXZ)Debug/ : fatal error LNK1120: 2 unresolved externalsError executing .- 3 error(s), 0 warning(s)第七步尽管我已经告知编译器DLL符号啦,可是链接器还不明白. 因此咱们必需告知链接器.. 选择Project | Settings | Link,把DLL的lib文件加到Object/library modules里边去:第八步好啦,此刻编译通过. 在咱们运行程序前,别忘了一件事: 把拷贝到EXE的目录里去.第九步接下来,能够放一个断点到OnInitDialog()函数里去, 点GO(F5)调试运行:能够看到, fnTest返回了42, 和咱们预测的一样. CTest类也能够用类似的方式来测试.要点:•VS的工程向导为咱们创建VC++DLL提供了专门好的开始.••函数,类, 和变量能够从DLL中导出.••利用#define预处置器概念, 一个头文件将能够被DLL 和应用程序一起利用.••DLL导出它的符号,而且应用程序导入那个DLL符号. 当编译应用程序时,编译器通过头文件看到的DLL符号, 当链接应用程序时, 链接器通过导入库看到DLL符号.••当执行应用程序时,DLL必需放到和EXE相同的目录中去. DLL也能够放到windows或system目录中,如此也是可行的, 可是它常常引发某些问题, 因此应该幸免如此利用注释:再实际工作中,我很少用到第七步中的方式. 如此做的话,在大的工程中,DLL和Lib文件将常常变得很难治理.咱们会想到要成立一个lib目录和一个bin目录,在那个地址边放进去所有咱们要利用的lib文件, dll文件和exe文件. 若是如此做的话,咱们怎么告知链接器找到lib文件呢? 有两种方式来做:1.选择Tools | Options | Directories and set Show directories for为"Library files". 在下边添加上咱们工程所利用的Lib文件的途径.2. 另一种方法是,选择Project | Settings | Link, 选category为Input ,在下边的Additional library path 筐里输入工程利用的lib文件的所在途径.哪一种方式更好一点呢?这取决于你的开发环境. 第一种方式要求整个工程要共享的设置目录途径, 而且所有要求所有的开发者的VS都必需设置到这些途径.第二种方式许诺每一个工程定制自己的途径,而且在工程中被贮存,若是开发者的运算机上寄存了一样的目录,那么每一个开发者都能够签出工程而且设计. ,如此能够幸免在每台机械上都去设置一样的途径.到此刻,我尚未说如何指定要利用的LIB文件, 我的方法是在DLL的中添加两行,此刻它看起来像下边的样子:#ifdef TEST_EXPORTS#define TEST_API __declspec(dllexport)#else#define TEST_API __declspec(dllimport)#pragma message("automatic link to ")。
在vb中调用dll的方法
1 制作好DLL之后,就可以用VB调用它,实现VB调用C程序。
VB程序要使用DLL中的函数,首先必须要有特殊的声明,用Declare声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。
语句格式为:Declare Sub 过程名Lib [ Alias " 别名]([ByVal 参数AS类型]),或为Declare Function函数名Lib [Alias " 别名]([ByVal 参数AS类型])AS类型在声明中首先用Declare 关键字表示声明DLL中的函数。
在C语言中有的函数类型为VOID,它表示不具有返回值,则必须用关键字Sub将其声明成过程。
有的函数具有返回值,则必须用关键字Function将其声明成函数,并且在声明语句的最后要用AS关键字指明函数返回值的类型。
例如上面的ADD.DLL在VB中就可以声明为:Decl are Function ADD Lib “c:\ADD.dll” (ByVal X AS Integer, ByVal Y AS Integer ,ByVal filein asstring)AS Integer通过此声明语句将函数ADD声明到VB中,便可直接调用。
2、dll文件中的函数好像是C语言写的,// 函数名:int __stdcall GetMacNo(int *MacNo)// 功能:获取卡机的卡机号(单机时)// 参数: MacNo[0]-被读出的卡机号// 返回值:0-成功,// 2-PC接收超时,// 3-应答错误dll的文件名是COMM232.dll函数的形参int *MacNo是指针吗?在VB中应该怎么声明和调用该函数?VB里也可以定义指针吗?问题补充:vb调用dll文件中的函数我是会的,但这儿的形参有一个星号才不知是怎么一回事,我是这样声明的对吗?Public Declare Function GetMacNo Lib "COMM232.dll" (ByVal MacNo As Integer) As Integer又应该怎么调用呢?要先定义一个指针的变量再传给*MacNo还是要怎么做?都说了MacNo是被读出的卡机号,那么就是传址的了。
VB调用C#封装dll文件
第一步C# 封装dll文件1、创建TestVotedll工程,设置工程属性如下图2、编写程序using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;//提供各种各样支持 COM 互操作及平台调用服务的成员namespace TestVoteDll{//定义接口public interface ITestClass{void SetCom(string comid);//bool InitVote(string [,] voteinfo);string[,] GetVoteResult();}[ClassInterface(ClassInterfaceType.None)]//必须增加的一句话。
public class VoteCom : ITestClass //通过接口继承父类ITestClass{public string[,] myvoteInfo;public int lng1 = 0;public int lng2 =0;public string ComID = "COM1";public void SetCom(string comid){}public Boolean InitVote(string[,] voteinfo){lng1 = voteinfo.GetLength(0);lng2 = voteinfo.GetLength(1);myvoteInfo = new string[lng1, lng2];for (int k = 0; k < lng1; k++){for (int m = 0; m < lng2; m++){myvoteInfo[k, m] = voteinfo[k, m];}}return true;}public string [,] GetVoteResult(){int k = 1;for (int m = 0; m < lng2; m++){myvoteInfo[k, m] =System.Environment.TickCount.ToString();}return myvoteInfo;}}}编译生成时,查看Debug目录下有两个文件TestV oteDll.dll和TestV oteDll.tlb 3、建立VB工程引用TestVoteDll.tlb此文件,编写测试程序Dim a As ObjectSet a = CreateObject("TestV oteDll.Class1")Dim c() As StringReDim c(1, 1) As Stringc(0, 0) = 1c(0, 1) = 2c(1, 0) = ""c(1, 1) = ""Dim Res As BooleanRes = a.InitVote(c) //传入数组Call a.SetCom("COM2") 可以传入字符串Dim b() As Stringb = a.GetVoteResult() //获取dll文件的数组。
vba调用c#dll
vba调⽤c#dll本⽂阐述如何⽤C#创建COM组件,并能⽤VB6.0等调⽤。
附有完整测试通过的代码。
该功能总体看来很简单,实际值得注意的地⽅还是挺多。
因为很少有⼈写这类⽂章,有些代码也是转来转去的不全,有些甚⾄让⼈误⼊歧途。
后来在C# help上⾯看⼀个⽼外写的⽂章 (上⾯有⼀个完整的SQL SERVER实例),才完成该功能。
拿来分享。
开发⼯具:VS2008附:本⽂适⽤任何VS系列⼯具。
在⽤C#创建COM组件时,⼀定要记住以下⼏点:1。
所要导出的类必须为公有;2。
所有属性、⽅法也必须为公有;3。
要导出的属性、⽅法必须⽤接⼝⽅式;如果没有在接⼝中声明,即使该⽅法(属性)为公有,也不能正常导出到COM。
但他们可以被别的.NET程序所使⽤;4。
所有的事件也必须⽤接⼝⽅式;现在开始正题:⼀、新建⼀个Visual C#⼯程(习惯这种叫法了,现在应该叫解决⽅案),选择类型“类库”;就叫MyCom吧。
⼆、编写导出接⼝。
为了⼤家理解⽅便,仅以⼀加法操作举例。
如下:[Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]public interface MyCom_Interface{[DispId(1)]int Add(int a, int b);}Guid为全局唯⼀标识,可以⽤VS2008的命令提⽰符中输⼊:⽤guidgen⼯具(系统⾃带)可以产⽣guid,在⼏个复选框选择最后⼀个Registry Format,点击New Guid,然后COPY就⾏了(以下如有guid的字符串,可⽤同样操作产⽣)[DispId(1)]为函数的标识。
如果有多个函数可相应的在函数前⾯加[DispId(2)], [DispId(3)]…三、创建事件接⼝。
[Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]public interface MyCom_Events{}Guid同⼆,不多说InterfaceType表⽰向COM公开的⽅式,这⾥选择为以调度的⽅式向COM公开。
VB调用VC创建的Win32 DLL函数
VB调用VC创建的Win32 DLL函数
周振红;冯夏庭;杨国录;周洞汝
【期刊名称】《计算机工程》
【年(卷),期】2002(028)004
【摘要】探讨了Visual C++创建Win32DLL,Visual Basic对其函数实施调用过程中,命名修饰,调用约定、命名约定的匹配,数据类型对应以及参数传递一致性等问题,并给出了具体的应用实例.
【总页数】3页(P285-286,封三)
【作者】周振红;冯夏庭;杨国录;周洞汝
【作者单位】郑州大学水环学院,郑州,450002;中国科学院武汉岩土力学研究所,武汉,430071;武汉大学,武汉,430072;武汉大学,武汉,430072
【正文语种】中文
【中图分类】TP313
【相关文献】
1.VB调用VC创建的DLL及在控制领域中的应用 [J], 薛燕红
2.在VC中对Delphi所生成的DLLs的调用 [J], 李强;贾云霞
3.怎样在LabVIEW中调用Win32动态连接库(DLLs) [J], 陶以政;潘振显
4.PB调用VC创建的DLL在MIS中的设计与实现 [J], 陈建泗;商建云
5.在VB开发环境中调用由MATLAB函数转化的DLL [J], 冯旭
因版权原因,仅展示原文概要,查看原文内容请购买。
- 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。