VB调用动态链接库
VB, VC, CSharp混合编程-动态库相互调用

如何在VS2008下开发跨开发平台的程序为继承和使用在不同开发平台(VC++6.0, C++Builder, , C#.NET, )下的已有代码和程序,允许多开发人员合作且分工开发,允许各开发人员使用自己擅长的开发平台,但最终会集合到VS2008开发环境中,这需要在VS2008开发环境下,能够实现代码或程序的共享。
为跨平台/多人员协作模式提供良好的途径,是大型软件开发之必需。
变量类型对照表.xls1.VC++.NET 如何生成VC++ Win32 DLL (*.dll)VC++ Win32 DLL即VC++6.0环境下的DLL。
●File->New Project…●Other Languages->Visual C++->Win32 Project,在Name框内输入Win32 DLL名称,比如“DLLTray”->OK●Next选择DLL->Finish。
一个动态库框架形成。
●为确保能被外部程序调用,VC动态库函数需要设置成__stdcall。
头文件(*.h)中加入该函数的声明语句(DLLTray.h)。
#include<windows.h>int__declspec (dllexport) __stdcall SearchNum_Win32(int number);●可执行文件(*.cpp)中加入执行实现代码(DLLTray.cpp)int__declspec (dllexport) __stdcall SearchNum_Win32(int number){return number + 10;}●Def文件中加入(DLLTray.def)LIBRARY "DLLTray"EX PORTSSearchNum_Win32DLLTray.DLL源代码-2.如何生成,C#.NET,VC++.NET可执行程序(*.exe)或类库(*.dll)File->New Project…->Windows Forms Application (or Class Library, Console Application)3.如何调用Windows API或VC++ Win32 DLL在的可执行程序里重新声明该函数,声明后即可作为自己的函数进行调用。
VB6.0与VC++接口说明

Double double
Integer short
Long
long
Single String
float BSTR
在 Win32 平台下是窄字符串 在 WinCE 平台下是宽字符串
Variant VARIANT
1.2 ByVal 和 ByRef
1
第 1 章 动态链接库
ByVal 和 ByRef 一般用于 VB6.0 里 C 函数的声明。请参考下表
(ByRef s As Variant)
VB 代码如下:
Private Declare Sub TestV Lib "Test.dll" (ByVal s As Variant) Private Declare Sub TestR Lib "Test.dll" (ByRef s As Variant)
II
第 1 章 动态链接库
第 1 章 动态链接库
VB6.0 可以调用由 VC++编写的动态链接库文件。
1.1 数据类型
VB6.0 的数据类型与 C/C++的数据类型对照表如下所示:
VB
C
说明
Boolean short
VARIANT_BOOL 0 表示 FALSE -1 表示 TRUE
Byte
unsigned char
void WINAPI Test(short*a); 给 C 函数传址,允许修改参数
(ByRef a As Integer) 调用代码
Dim n as Integer
call Test(n) 声明代码
Private Declare Sub Test Lib "Test.dll" _
动态链接库在Visual Basic编程中的应用

动态链接库在Visual Basic编程中的应用
洪百会
【期刊名称】《辽宁大学学报(自然科学版)》
【年(卷),期】2002(029)002
【摘要】阐述了动态链接库在Visual Basic编程中的重要作用,对如何应用DLL作了详细的叙述.它提供了与多种语言的接口,以及对Windows API的调用,其特点是方便灵活,易于掌握,使编程工作效率大大提高.
【总页数】3页(P144-146)
【作者】洪百会
【作者单位】沈阳计算机技术研究设计院,辽宁,沈阳,110036
【正文语种】中文
【中图分类】TP311
【相关文献】
1.项目教学在应用型本科《Visual Basic 程序设计》课程中应用研究 [J], 李德雄;齐会娟;王渝
2.如何在Visual Basic应用程序中调用动态链接库 [J], 王向阳
3.翻转课堂在Visual Basic课程中的应用研究 [J], 杨爱琴
4.如何在Visual Basic应用程序中调用动态链接库 [J], 王向阳
5.基于Visual Basic的CAD二次开发在接触网工程中的应用 [J], 徐天文
因版权原因,仅展示原文概要,查看原文内容请购买。
vs2010创建和使用动态链接库(dll)

vs2010创建和使用动态链接库(dll)1、打开Microsoft Visual Studio 2010,选择File->New->Project。
2、在New Project中选择Installed Templates->VisualC++->Win32。
3、选择Win32 Console Application,设置名称:simpledll,设置解决方案名:zdddll。
4、单击OK,在出现的Win32 Application Wizard的Overview 对话框中点击Next。
5、在Application Settings中,选择Application type下的DLL。
6、勾选Additional options下的Empty project。
7、单击Finish创建项目。
向动态链接库添加类:1、添加新类头文件。
右键单击simpledll项目,Add->New Item,选择Header File(.h),设置名称为simpledll,单击Add。
2、添加新类源文件。
右键单击simpledll项目,Add->New Item,选择C++ File(.cpp),设置名称为simpledll,单击Add。
3、为新类添加内容。
内容如下:头文件simpledll.h:[html] view plain copy print?//------------------ simpledll.h---------------- #pragma once; //该宏完成在dll项目内部使用__declspec(dllexport)导出//在dll项目外部使用时,用__declspec(dllimport)导入//宏DLL_IMPLEMENT在simpledll.cpp中定义#ifdef DLL_IMPLEMENT #define DLL_API __declspec(dllexport) #else #define DLL_API__declspec(dllimport) #endif namespace zdd { //导出类class DLL_API SimpleDll { public: SimpleDll(); ~SimpleDll(); int add(int x, int y); //简单方法}; }源文件simpledll.cpp:[cpp] view plain copy print?//------------------ simpledll.cpp---------------- //注意此处的宏定义需要写在#include "simpledll.h"之前//以完成在dll项目内部使用__declspec(dllexport)导出//在dll项目外部使用时,用__declspec(dllimport)导入#define DLL_IMPLEMENT#include "simpledll.h" namespace zdd{ SimpleDll::SimpleDll() { } SimpleDll::~SimpleDll() { } intSimpleDll::add(int x, int y) { returnx+y; } } 4、完成后点击Build->Build Solution,生成解决方案。
建立支持VB进行IO端口操作的动态链接库

VC VB
int Integer
unsigned short Integer
unsigned long Long
可以看出,在VB中用带符号的数据类型和VC中的无符号数据类型相对应。在VB调用DLL函数时,只要将这些类型的数据用十六进制表示,就可以做到和VC完全对应(因为十六进制数转换成内部的二进制表示仅是一种简单的展开,其结果和无符号数的内部表示相同)。如果采用十进制表示,则需在调用DLL函数之前进行预处理。例如对16位数,若小于等于32 767,则取本身,否则取其16位补码,即取该值与65 536的差,为一负数(实际做时,应是两次减去32 768)。
DATAPRELOAD MOVEABLE SINGLE
HEAPSIZE 1024
EXPORTS WEP @1
inportb @2
inportw @3
inportd @4 Fra bibliotek outportb @5
outportw @6
Command1 上单击。
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook
As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As
Long) As Long
Key words:dynamic link library,I/O-port,VB,VC
目前VB是深受工程技术人员欢迎的编程语言之一,编写测控程序尤为方便。但当系统中要增加某种非标准设备或自行开发一些接口板时,就有些为难,因为VB本身不支持I/O端口操作。解决这个问题的简便方法是建立用户自己的动态链接库(DLL)。从编程角度看,和外设打交道实际是和外设端口打交道。只要编写出能实现I/O端口操作的DLL,就可以驱动设备进行各种动作。本文介绍编写VB能调用的实现I/O端口操作的DLL的一些关键问题。
Excel VBA编程 使用动态链接库

Excel VBA编程使用动态链接库通过上面介绍的方法保护工程,非授权用户不能查看工程的源码。
但是,仅仅设置密码保护是不够的,通过Internet可以搜索到多种方法对其进行破解。
对源码安全性较高的保护方式是把VBA核心代码封装到动态链接库(DLL)文件中,然后用VBA代码访问动态链接库提供的过程或函数来完成工作。
动态链接库很难被反编译,非常安全。
DLL是Dynamic Link Library的缩写,意为动态链接库。
在Windows中,许多应用程序并不是一个完整的或执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。
在VBE中,调用DLL文件时其运行速度是非常快的。
用户可以通过Microsoft Basic 6.0将VBA 代码封装到动态链接库(DLL)文件中。
1.将VBA代码封装成动态链接库打开Microsoft Basic 6.0,在【新建工程】中选取“ActiveX DLL”,新建一个工程。
在【属性】窗口中将工程名改为VBAPrj,类模块名改为VBACls。
然后执行【工程】|【引用】命令,在对话框中选取【Microsoft Office 11.0 Object Library】,然后保存工程。
将VBA工程中,将要封装的过程(如Test)的代码复制到VB的工程管理器中类模块VBACls 的【代码】编辑窗口中。
这个过程成为类模块VBACls的一个方法,然后将工程编译生成DLL 文件。
提示可以将多个过程复制到VB的类模块中,从而使用DLL文件中包含多个方法。
在Excel中,通过类模块VBACls建立的对象来调用这些方法。
2.修改代码虽然VBA源于VB,但是两者毕竟存在着一些差异。
因此,需要对转移到VB中的VBA代码做一些必要的修改。
●修改VBA代码中所特有类型的对象。
如果所添加的代码里有VBA所特有类型——如WorkBook、WorkSheet、Rang等所建立的对象,编译时会提示错误,因为VB不能够识别这些对象。
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入口点定义和其它有用的参数信息。
在vb中调用dll的方法

在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.d ll” (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是被读出的卡机号,那么就是传址的了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VB调用动态链接库-[Dll编程]作为一种简单易用的Windows开发环境,Visual Basic从一推出就受到了广大编程人员的欢迎。
它使程序员不必再直接面对纷繁复杂的Windows消息,而可以将精力主要集中在程序功能的实现上,大大提高了编程效率。
但凡事有利必有弊。
VB中高度的封装和模块化减轻了编程者的负担,同时也使开发人员失去了许多访问低层API函数和直接与Windows交互的机会。
因此,相比而言,VB应用程序的执行效率和功能比C/C++或Delphi生成的程序要差。
为了解决这个问题,在一个大型的VB开发应用中,直接调用Windows API函数几乎是不可避免的;同时,还有可能需要程序员自己用C/C++等开发一些动态连接库,用于在VB中调用。
本文主要讨论在32位开发环境Visual Basic 5.0中直接调用Windows 95 API函数或用户生成的32位动态连接库的方法与规则。
Windows动态连接库是包含数据和函数的模块,可以被其它可执行文件(EXE、DLL、OCX 等)调用。
动态连接库包含两种函数:输出(exported)函数和内部(internal)函数。
输出函数可以被其它模块调用,而内部函数则只能在动态连接库内部使用。
尽管动态连接库也能输出数据,但实际上它的数据通常是只在内部使用的。
使用动态连接库的优点是显而易见的。
将应用程序的一部分功能提取出来做成动态连接库,不但减小了主应用程序的大小,提高了程序运行效率,还使它更加易于升级。
多个应用程序共享一个动态连接库还能有效地节省系统资源。
正因为如此,在Windows系统中,动态连接库得到了大量的使用。
一般来说,动态连接库都是以DLL为扩展名的文件,如Kernel32.dll、commdlg.dll 等。
但也有例外,如16位Windows的核心部件之一GDI.exe其实也是一个动态库。
编写动态连接库的工具很多,如VisualC++、BorlandC++、Delphi等,具体方法可以参见相关文档。
下面只以Visual C++5.0为例,介绍一下开发应用于VisualBasic5.0的动态连接库时应注意的问题(本文中所有涉及C/C++语言或编译环境的地方,都以VC5为例;所有涉及VisualBasic的地方都以VB5 为例)。
作为一种32位Windows应用程序的开发工具,VB5生成的exe文件自然也都是32位的,通常情况下也只能调用32位的动态连接库。
但是,并不是所有的32位动态库都能被VB生成的exe 文件正确地识别。
一般来说,自己编写用于VB应用程序调用的动态连接库时,应注意以下几个方面的问题:1、生成动态库时要使用__stdcall调用约定,而不能使用缺省的__cdecl调用约定;__stdcall 约定通常用于32位API函数的调用。
2、在VC5中的定义文件(.def)中,必须列出输出函数的函数名,以强制VC5系统将输出函数的装饰名(decoratedname)改成普通函数名;所谓装饰名是VC的编译器在编译过程中生成的输出函数名,它包含了用户定义的函数名、函数参数及函数所在的类等多方面的信息。
由于在VC5中定义文件不是必需的,因此工程不包含定义文件时VC5就按自己的约定将用户定义的输出函数名修改成装饰名后放到输出函数列表中,这样的输出函数在VB生成的应用程序中是不能正确调用的(除非声明时使用Alias子句)。
因此需要增加一个.def文件,其中列出用户需要的函数名,以强制VC5不按装饰名进行输出。
3、VC5中的编译选项"结构成员对齐方式(structure member alignment)" 应设成4字节,其原因将在后文详细介绍。
4、由于在C中整型变量是4个字节,而VB中的整型变量依然只有2个字节,因此在C中声明的整型(int)变量在VB中调用时要声明为长整型(long),而C中的短整型(short)在VB中则要声明成整型(integer);下表针对最常用的C语言数据类型列出了与之等价的Visual Basic 类型(用于32位版本的Windows)。
C语言数据类型在VisualBasic中声明为调用时使用的表达式ATOM ByVal variable As Integer 结果为Integer 类型的表达式BOOL ByVal variable As Long 结果为Long 类型的表达式BYTE ByVal variable As Byte 结果为Byte 类型的表达式CHAR ByVal variable As Byte 结果为Byte 类型的表达式COLORREF ByVal variable As Long 结果为Long 类型的表达式DWORD ByVal variable As Long 结果为Long 类型的表达式HWND, HDC, HMENU ByVal variable As Long 结果为Long 类型的表达式等Windows 句柄INT, UINT ByVal variable As Long 结果为Long 类型的表达式LONG ByVal variable As Long 结果为Long 类型的表达式LPARAM ByVal variable As Long 结果为Long 类型的表达式LPDWORD variable As Long 结果为Long 类型的表达式LPINT, LPUINT variable As Long 结果为Long 类型的表达式LPRECT variable As type 自定义类型的任意变量LPSTR, LPCSTR ByVal variable As String 结果为String 类型的表达式LPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal)LPWORD variable As Integer 结果为Integer 类型的表达式LRESULT ByVal variable As Long 结果为Long 类型的表达式NULL As Any 或ByVal Nothing 或ByVal variable As Long ByVal 0& 或VBNullStringSHORT ByVal variable As Integer 结果为Integer 类型的表达式VOID Sub procedure 不可用WORD ByVal variable As Integer 结果为Integer 类型的表达式WPARAM ByVal variable As Long 结果为Long 类型的表达式5、VB中进行32位动态库的声明时,函数名是大小写敏感的。
在获得了需要的动态连接库之后,就可以在VB中进行调用了。
但是,由于VB不能验证应用程序传递到动态连接库中的参数值是否正确,因此VB程序中大量的API调用可能会降低整个应用程序的稳定性,也会增加以后维护的难度。
所以,决定在VB程序中直接调用API函数时要慎重,但适当的使用API调用确实能够有效地提高VB程序的性能。
这之间的平衡需要编程人员根据实际情况来掌握。
下面就具体介绍一下在VB中调用API函数时需要做的工作。
要声明一个DLL过程,首先需要在代码窗口的"通用(General)"部分增加一个Declare 语句。
如果该过程返回一个值,应将其声明为Function:Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type如果过程没有返回值,可将其声明为Sub:Declare Sub publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])]缺省情况下,在标准模块中声明的DLL过程,可以在应用程序的任何地方调用它。
在其它类型的模块中定义的DLL过程则是模块私有的,必须在它们前面声明Private关键字,以示区分。
下面分别介绍声明语句的各个组成部分。
(一)、指定动态库:Declare语句中的Lib子句用来告诉Visual Basic如何找到包含过程的.dll文件。
如果引用的过程属于Windows核心库(User32、Kernel32或GDI32),则可以不包含文件扩展名,如:Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long对于其它动态连接库,可以在Lib子句指定文件的路径:Declare Function lzCopy Lib "c:windowslzexpand.dll" _(ByVal S As Integer, ByVal D As Integer) As Long如果未指定libname的路径,Visual Basic将按照下列顺序查找该文件:①.exe文件所在的目录②当前目录③Windows系统目录④Windows目录⑤Path环境变量中的目录下表中列出了常用的操作系统环境库文件。
动态链接库描述Advapi32.dll高级API服务,支持大量的API(其中包括许多安全与注册方面的调用)Comdlg32.dll通用对话框API库Gdi32.dll图形设备接口API库Kernel32.dllWindows32位核心的API支持Lz32.dll32位压缩例程Mpr.dll多接口路由器库Netapi32.dll32位网络API库Shell32.dll32位ShellAPI库User32.dll用户接口例程库Version.dll版本库Winmm.dllWindows多媒体库Winspool.drv后台打印接口,包含后台打印API调用。
对于Windows的系统API函数,可以利用VB提供的工具API Viewer查找某一函数及其相关数据结构和常数的声明,并复制到自己的程序中。
(二)、使用别名:Declare语句中的Alias子句是一个可选的部分,用户可以通过它所标识的别名对动态库中的函数进行引用。
例如,在下面的语句中,声明了一个在VB中名为MyFunction的函数,而它在动态库Mydll.dll中最初的名字是MyFunctionX。