VB调用动态链接库(DLL)

合集下载

VB DLL实例分步讲解

VB DLL实例分步讲解

VB封装DLL实例讲解(一)一、DLL基本概念(一)概念DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。

DLL不是应用程序的组成部分,而是运行时链接到应用程序中。

(二)主要优点:1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;3、从ACCESS角度而言,还可以更好的确保核心代码的安全。

二、用VB封装VBA代码,构建自定义的DLL动态链接库(一)ACCESS中实例代码下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。

我将就这个实例演示如何将该实例VBA代码封装成为DLL。

按钮单击事件代码如下:Private Sub CmdFindnumber_Click()Dim strM As String '初始字符串Dim strOut As String '输出字符串变量Dim IstrM = Me.Text1'从第一个字符向最后一个字符循环,以提取每个字符For I = 1 To Len(strM)'判断是否为0到9字符,是则赋值输出If Mid(strM, I, 1) Like "[0-9]" ThenstrOut = strOut & Mid(strM, I, 1)End IfNext I'用MsgBox函数进行输出测试End Sub以上代码还不能直接用于封装,须将其修改成为公用函数(过程)(二)VB 封装实例中VBA 代码步骤一:在VB 编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口步骤二:修改工程名,这即生成的DLL 库名步骤三:修改类名步骤四:在代码窗口输入如下代码。

Excel VBA编程 使用动态链接库

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调用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调用C程序的方法—动态链接库法

VB调用C程序的方法—动态链接库法
Declare Function ADD Lib撫c:\ADD.dll敚―ByVal X AS Integer, ByVal Y AS Integer ,ByVal filein as string)AS Integer通过此声明语句将函数ADD声明到VB中,便可直接调用。 四、结束语 以上详细介绍了Borland C环境下制作动态链接库以及VB调用for dos动态链接库的方法、步骤,并通过实例说明VB调用C语言程序的方法。举例程序ADD经VB3.0编译,在486微机上调试通过。本文介绍的方法具有广泛的意义,也完全适用于C++ 语言程序。
fscanf(fp,"%d",&b);
temp1=x+a;
temp2=y+b;
temp1=temp1+temp2;
fclose(fp);
return(temp1);
}
/*退出函数*/
int FAR PASCAL WEP ( int/*SystemExit*/ )
{
return(1);
3.建立原形函数文件(.H)
原形函数的功能是进一步声明调用函数的函数名和传递的参数,其形式为:
/*************************************/
/* 文件名: example.H */
/*************************************/
}
2)ADD.DEF文件的程序清单:
/*************************************/
/* 文件名: ADD.H */
/*************************************/

【VB技巧】VB静态调用与动态调用dll详解

【VB技巧】VB静态调用与动态调用dll详解

【VB技巧】VB静态调⽤与动态调⽤dll详解摘⾃:【【请注意】】:在以下语法格式中,请注意 [函数名] 的【⼤⼩写】静态与动态⽐较:静态调⽤简单,动态调⽤⿇烦;静态调⽤占⽤资源多,动态调⽤占⽤资源少;正所谓鱼和熊掌不可兼得。

静态调⽤定义:就是常⽤的申明API,⼀个DLL库⾥有很多的函数可供调⽤,把要⽤的申明即可。

⽐如:Public/Private Declare Function [函数名] Lib "DLL⽂件名" [Alias "别名"] (参数变量表) [As 返回值的数据类型]⽰例:Private Declare Function Test Lib "dll.dll" (x As String) As String当程序结束的时候系统回⾃动释放DLL调⽤。

动态调⽤定义:使⽤LoadLibery(DLL名),系统会检查DLL是否调⼊内存。

如果调⼊了,可直接调⽤DLL⾥的所有函数,没有就会把DLL加⼊⽬标进程的进程空间。

通过函数GetProcAddress确定函数⼊⼝地址,然后调⽤,后⼀种⽅法VB⾥不常⽤的。

静态调⽤详解:制作好DLL之后,⾸先⽤Declare声明语句在窗体级或模块级或全局模块的代码声明段进⾏声明,将动态链接库中的函数声明到VB中,供VB程序调⽤。

语法格式1:Public/Private Declare Sub [函数名] Lib "DLL⽂件名" [Alias "别名"] (参数变量表)语法格式2:Public/Private Declare Function [函数名] Lib "DLL⽂件名" [Alias "别名"] (参数变量表) [As 返回值的数据类型]在声明中⾸先⽤Declare关键字表⽰声明DLL中的函数。

在C语⾔中有的函数类型为VOID,它表⽰不具有返回值,则必须⽤关键字Sub将其声明成过程。

VBA调用外部动态链接库的方法与示例

VBA调用外部动态链接库的方法与示例

VBA调用外部动态链接库的方法与示例VBA(Visual Basic for Applications)是微软的一种编程语言,广泛应用于Office套件中的各种应用程序,如Excel、Word和Access。

VBA允许用户通过编写宏来自动化任务、增强功能和定制用户界面。

有时候,我们可能需要调用外部的动态链接库(DLL)中的函数来扩展VBA 的功能。

本文将介绍VBA调用外部动态链接库的方法,并提供一些示例帮助读者更好地理解。

一、什么是动态链接库(DLL)?动态链接库(Dynamic Link Library,DLL)是一种微软Windows操作系统中的可执行文件。

DLL中包含可供其他程序调用的函数、数据和资源。

通过使用DLL,我们可以实现代码的共享和重复使用,提高程序的模块化程度和执行效率。

二、VBA中调用DLL的方法VBA提供了一组用于调用DLL函数的关键字和函数。

具体步骤如下:1. 声明DLL函数在VBA代码中,首先需要声明将要调用的DLL函数。

声明的语法如下:```Declare Function 函数名 Lib "动态链接库文件名" (参数列表) As 返回值类型```其中,函数名是DLL中的函数名,动态链接库文件名是DLL所在的路径和文件名,参数列表是函数的输入参数,返回值类型是函数的返回值类型。

2. 在VBA中调用DLL函数声明完DLL函数后,我们就可以在VBA代码中调用这些函数了。

调用的语法如下:```变量名 = 函数名(参数列表)```其中,变量名是接收函数返回值的变量,函数名是所声明的DLL函数的函数名,参数列表是函数的输入参数。

3. 注册和取消注册DLL在调用DLL函数之前,我们需要先将DLL注册到Windows系统中。

注册DLL可以使用Windows系统提供的regsvr32工具。

具体操作步骤如下:a. 打开命令提示符窗口。

b. 输入regsvr32命令,后面是DLL的完整路径和文件名。

vb动态库DLL调用

vb动态库DLL调用

一.dll内容1.dll中的函数声明extern "C" _declspec(dllexport) bool MakeMD5File(char *file,char *key);extern "C" _declspec(dllexport) int ValidateMD5File(char *file,char *key,char *object); extern "C" _declspec(dllexport) void EncryptString128(char *string,char *result); extern "C" _declspec(dllexport) bool DecryptString128(char *source,char *object); extern "C" _declspec(dllexport) int DecryptFile160(char *file,char *key,char *result); extern "C" _declspec(dllexport) bool EncryptFile160(char *file,char *key,char *result); extern "C" _declspec(dllexport) void Transfer40To20(char *str40, char *str20);extern "C" _declspec(dllexport) void Transfer20To40(char *str20, char *str40);extern "C" _declspec(dllexport) bool MakeMD5FileFrom40(char *str40, char *file); extern "C" _declspec(dllexport) void EncryptString160(char *string,char *key,char *resu lt);extern "C" _declspec(dllexport) bool DecryptString160(char *source,char *key,char *obj ect);2.dll的接口说明void EncryptString128(char *string,char *result)string:要被计算的串的指针,任意长度,以'\0'结束result:保存结果的缓冲区指针,>=33字节,结果保存在该缓冲区的前32个字节里功能:计算出由string指向的任意长度的串的128位MD5摘要串,摘要串为这128位的16进制形式,12 8共16字节,每字节表示为2位16进制数,故保存结果的串指针result指向的缓冲区必大于或等于(12 8/8)*2+1=33字节bool DecryptString128(char *source,char *object)source:要验证的串的指针,以'\0'结束object:16进制形式摘要串的指针,前32个字节为摘要串,长度必须>=33,object[32]='\0'功能:验证指针source指向的串的128位摘要串是否为object指向串的前32个字节是:返回true,否:返回false//////////////////将string串的160位(40字节)摘要串计算出来保存在result中,key为4个字节的密码extern "C" _declspec(dllexport) void EncryptString160(char *string,char *key,char *resu lt)注:输入参数result长度为>=41字节,16进制形式的摘要串保存在其前40个字节中,41字节为'\0'bool EncryptFile160(char *file,char *key,char *result)file:要计算摘要串的文件的路径名key:32位扰码,为前4个字节,>=5个字节,key[4]='\0'result:保存结果的缓冲区指针,>=41字节,结果保存在该缓冲区的前40个字节里,41字节为'\0'功能:计算出由file指向的文件的160位(128位+32位扰码)MD5摘要串,摘要串为这160位的16进制形式,128共20字节,每字节表示为2位16进制数,故保存结果的串指针result指向的缓冲区必大于或等于(160/8)*2+1=41字节计算成功返回true,出错返回falseint DecryptFile160(char *file,char *key,char *result)file:要验证摘要串的文件的路径名key:32位扰码,为前4个字节,>=4个字节result:摘要串指针,>=41字节,前40个字节为摘要串,41字节为'\0'功能:验证file指向的文件与扰码key计算得到的摘要串是否为result指向的串的前40个字节验证成功返回1,不成功返回-1,出错返回0bool MakeMD5File(char *file,char *key)file:输入要计算摘要文件的文件的路径名,输出时变为对应的MD5文件名key:32位扰码,为前4个字节,>=4个字节功能:用扰码key和文件file计算得到160位(40字节)摘要串,并将其扩展成512字节且保存在同一目录下,文件名相同扩展名为".MD5"成功返回true,出错返回falseint ValidateMD5File(char *file,char *key,char *object)file:要验证的文件key:32位扰码,为前4个字节,>=4个字节object:已存在的512字节摘要文件功能:验证由file指向的文件和key指向的扰码生成的512字节摘要文件是否与object指向的摘要文件一致一致:返回1,不一致:返回-1,出错返回0/////////////////将40字节的16进制形式摘要串转换为原来的形式:160位20字节extern "C" _declspec(dllexport) void Transfer40To20(char *str40, char *str20)str40[40]='\0',str20长度为21/////////////////将160位20字节形式转换为40字节的16进制形式摘要串extern "C" _declspec(dllexport) void Transfer20To40(char *str20, char *str40)str20[20]='\0',str40长度为41//////////////从40字节的摘要串str40创建512字节的MD5文件,file为MD5 文件的路径extern "C" _declspec(dllexport) bool MakeMD5FileFrom40(char *str40, char *file)str40[40]='\0',前40字节为摘要串的16进制形式二.如何使用该dll:使用DllImport这里只举ValidateMD5File、Transfer40To20、Transfer20To40、EncryptString160四个例子,其它的接口类似:1.声明先导入:Imports System.Runtime.InteropServices再声明:<DllImport("MD5_ENCODE.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConve ntion.Cdecl)> Public Shared Function ValidateMD5File(ByVal src As String, ByVal key As String, ByVal result As String) As IntegerEnd Function<DllImport("MD5_ENCODE.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConve ntion.Cdecl)> Public Shared Sub EncryptString160(ByVal src As String, ByVal key As St ring, ByRef result As Byte)End Sub<DllImport("MD5_ENCODE.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConve ntion.Cdecl)> Public Shared Sub Transfer40To20(ByVal src As Byte(), ByRef result As B yte)End Sub<DllImport("MD5_ENCODE.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConve ntion.Cdecl)> Public Shared Sub Transfer20To40(ByVal src As Byte(), ByRef result As B yte)End Sub2.接口使用例子为测试ValidateMD5File函数,先在程序目录下放入文件a.txt及其MD5文件a.MD5,测试代码为:' 测试ValidateMD5FileDim src As String = "a.txt"Dim key As String = "1234"Dim res As String = "a.MD5"Dim r As Integer = 3r = ValidateMD5File(src, key, res)bel1.Text = "测试ValidateMD5File(""a.txt"",""1234"",""a.MD5""): " _+ r.ToString测试得返回值r为1,改变一下a.txt内容,则返回-1过头来,测试成功为测试Transfer40To20、Transfer20To40、EncryptString160,加入测试代码:' 测试EncryptString128Dim code(41) As ByteEncryptString160(src, key, code(0))Dim t(41) As CharDim i As IntegerFor i = 0 To 40t(i) = ChrW(code(i))Nextbel2.Text = "测试EncryptString160: " + t'测试Transfer40To20和Transfer20To40'从40字节形式转为20字节形式Dim s20(21) As ByteTransfer40To20(code, s20(0))'从40字节形式转为20字节形式Dim s40(41) As ByteTransfer20To40(s20, s40(0))Dim c40(41) As CharFor i = 0 To 40c40(i) = ChrW(s40(i))Nextbel3.Text = "从40字节形式转为20字节形式,然后再转回40字节的结果:" _ + Chr(10) + Chr(13) + c40测试成功。

VBA调用外部DLL文件的高级技巧与应用

VBA调用外部DLL文件的高级技巧与应用

VBA调用外部DLL文件的高级技巧与应用VBA(Visual Basic for Applications)是一种流行的编程语言,广泛用于Microsoft Office套件中的应用程序如Excel、Word和Access。

VBA内置了许多功能,但有时候我们可能需要更高级的功能来实现我们的需求,这时候就可以借助外部DLL文件来扩展VBA的功能。

DLL(动态链接库)文件是包含可供多个程序共享和使用的代码和数据的文件。

VBA可以通过使用Declare语句来引用DLL文件中的函数和过程,从而实现对其功能的调用。

在本文中,我们将探讨一些VBA调用外部DLL文件的高级技巧和应用。

1. 理解DLL文件的结构与导出函数DLL文件包含了一组导出函数,通过这些函数可以实现对DLL提供的功能的调用。

在VBA中,我们需要了解DLL文件的结构以及导出函数的名称、参数和返回值类型。

2. 声明DLL函数在VBA中,通过使用Declare语句可以声明外部DLL函数的名称、参数和返回值类型。

声明外部函数的正确性对于调用DLL文件非常重要。

例如,下面是一个声明ShellExecute函数的示例:Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA"_(ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFileAs String, ByVal lpParameters As String, _ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long在这个示例中,我们声明了一个名为ShellExecute的函数,它位于shell32.dll文件中。

该函数用于执行操作系统的某些功能,例如打开文件或运行程序。

在VC实现可在VB中调用的DLL

在VC实现可在VB中调用的DLL
Dim a As Integer
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动态加载dll的一个类,实现vb动态加载dll并动态调用dll导出的函数的一个方便办法

vb动态加载dll的一个类,实现vb动态加载dll并动态调用dll导出的函数的一个方便办法

vb动态加载dll的一个类,实现vb动态加载dll并动态调用dll导出的函数的一个方便办法自从会vb用调用动态库函数以来,我一直在想:如何动态的调用dll 里的函数?网上有一个用CallWindowProc函数的方法,不过我还是喜欢自己有个办法.今天工夫不负有心人,我终于把我心中一直想的办法给实现了,干脆就往自己的空间上贴吧.错误的地方,希望可以得到有这方面的师傅给以指正,以求进步!对于系统api我没有尝试,如果调用约定相符,应该适用于对系统api的调用.我自己用c写个dll,然后在vb里写了这个类.以下代码只是我简单的实现,主要的是看实现的道理.vc代码:///'我把dll文件名命名为:dll#include <Windows.h>#include <stdlib.h>#include <string.h>#include 'stdafx.h'BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){return TRUE;}extern 'C' BOOL _declspec(dllexport) add(int a){MessageBoxA(NULL,'运行在dll里!','成功',MB_OK);return 1;}///vb代码:'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''类代码:Private 状态标志 As BooleanPrivate 模块句柄 As LongPrivate 本地函数地址备份(0 To 4) As BytePrivate 被替换函数的地址 As LongPublic Function 替换函数地址(模块名As String, 函数名As String, 本地函数地址 As Long) As BooleanIf 0 = 本地函数地址 Then替换函数地址 = 0Exit FunctionEnd If被替换函数的地址 = 替换函数地址Dim 函数地址 As LongDim a As LongDim 跳转指令(0 To 4) As Byte'加载模块模块句柄 = LoadLibrary(模块名)If 0 <> 模块句柄 Then'状态标志 = 1Else:替换函数地址 = 0Exit Function'检索函数地址函数地址 = GetProcAddress(ByVal 模块句柄, ByVal 函数名)If 0 <> 函数地址 Then'状态标志 = 1Else替换函数地址 = 0Exit FunctionEnd If'计算跳转地址a = 函数地址 - (本地函数地址 + 5)'构造跳转地址跳转指令(0) = 233a = WriteProcessMemory(-1, ByVal VarPtr(跳转指令(1)), ByVal VarPtr(a), 4, 0)If 0 = a Then替换函数地址 = 0Exit FunctionEnd If'先备份本地函数入口指令a = WriteProcessMemory(-1, ByVal VarPtr(本地函数地址备份(0)), ByVal 本地函数地址, 5, 0)If 0 = a Then替换函数地址 = 0Exit FunctionEnd If'写入跳转指令a = WriteProcessMemory(-1, ByVal 本地函数地址, ByVal VarPtr(跳转指令(0)), 5, 0)If 0 = a Then替换函数地址 = 0Exit FunctionElse:状态标志 = 1替换函数地址 = 1End IfEnd FunctionPublic Function 还原函数地址() As BooleanIf 0 = 状态标志 Then还原函数地址 = 0Exit FunctionEnd IfDim a As Longa = WriteProcessMemory(-1, ByVal 被替换函数的地址, ByVal VarPtr(本地函数地址备份(0)), 5, 0)If 0 = a Then还原函数地址 = 0Exit FunctionElse:状态标志 = 0还原函数地址 = 1End IfFreeLibrary 模块句柄End FunctionPublic Function 当前状态() As Boolean当前状态 = 状态标志End Function''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''vb普通模块代码:'读写内存的api函数Public Declare Function WriteProcessMemory Lib 'kernel32' (ByVal hProcess As Long, ByVal _lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long'加载模块的api函数Public Declare Function LoadLibrary Lib 'kernel32' Alias 'LoadLibraryA' (ByVal lpLibFileName As String) As Long '检索模块里函数地址的api函数Public Declare Function GetProcAddress Lib 'kernel32' (ByVal hModule As Long, ByVal lpProcName As String) As Long 'Public Declare Function FreeLibrary Lib 'kernel32' (ByVal hLibModule As Long) As Long'模拟一个函数与dll里,我们想调用函数类型和参数一致, 用类将函数的地址替换Public Function 测试函数(参数 As Long) As Boolean'我们随便给返回0,因为这个指令将不会被程序执行到测试函数 = 0End Function''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''vb窗口模块代码:Private Sub Form_Load()Dim 模块名 As String, 函数名 As String模块名 = App.Path + '/dll.dll''模块名现在可以自己定了,自由了!函数名 = 'add'Dim p As BooleanDim aa As New Class1p = aa.替换函数地址(模块名, 函数名, AddressOf 测试函数) If p Then测试函数 0'将会弹出对话筐:运行在dll里!aa.还原函数地址End IfEnd Sub'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''。

VB调用C程序的方法―动态链接库法

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编写的DLL

分享如何在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的名字。

VisualBasic中动态链接库的使用

VisualBasic中动态链接库的使用

Visual Basic中动态链接库的使用白古勒齐 轩兴涛(呼和浩特市职工大学)(内蒙古建材工业学校) 摘 要 该文介绍了在VB如何使用动态链接库(DLL),使用DLL时调用不同类型参数的声明方法,不同类型VB数据的DLL接收不同方式,VB中数组的DLL操作方法及过程。

关键词 Visual Basic 动态链接库(DLL) 动态链接库(Dy namic Link Libraries,简称DLL)是Microsoft Windo ws的重要特点之一。

程序设计人员利用它可以实现应用程序共享代码和资源,这不但可以提高程序的编写效率,而且可以在多任务环境下大大提高程序的执行效率。

DLL 的最大优点是:1.由于DLL与用户程序分开,用户可以更新DLL而不用更改已编译过的EXE文件。

2.DLL使得我们能够把用C语言编制的数据处理代码动态地链接到用VB开发的应用程序中去,从而可以极大地增强VB的数据处理能力。

1 在VB中使用DLL1.1 声明要使用的DLL子程序要使用的DLL子程序,可以在全局模块(Global Mo dule)中或表格阶层的声明部分(Dec-laratio n Section)中声明。

例1:Private Declare Function OpenProcess Lib “kernel32”(By Valdw DesiredAccess As Lo ng, By Val BinheritHandle A s Long,By Val dw Pro-cessId A s Lo ng)As LongPrivate Declare Functio n CloseHandle Lib “kernel32”(By Val hObject As Long)As Long 1.2 执行DLL子程序同通用函数的执行方式例2:Ret Val=Shell(“C:/WINDOWS/CALC. EXE”,vbNorm alFo cus)2 VB中各种参数的声明从上面的例如1中我们看出,在VB中声明DLL子程序时,函数参数的声明是一项很重要的内容。

(完整版)VB调用动态链接库(DLL)

(完整版)VB调用动态链接库(DLL)

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等,具体方法可以参见相关文档。

VBA调用DLL动态链接库

VBA调用DLL动态链接库

VBA调用DLL动态链接库1.打开VBA编辑器,点'工具'菜单下的'引用'命令,在引用对话框中引用该动态链接库。

调用代码如下:Dim VBACls As New VBAPrj.VBAClsVBACls.Test(ThisDocument)2.如果知道该动态链接库文件的位置,可以在ThisDocument代码窗口以代码形式引用, 代码如下:Private Sub Document_Open()On Error Resume NextMe.VBProject.References.AddFromFile 'D:\VBAPrj.dll'End Sub3.将动态链接库文件拷贝到文档同一目录下,可在ThisDocument代码窗口中建立如下引用函数:Private Function GetProjectDoc() As ObjectOn Error Resume NextDim VBACls As ObjectSet VBACls = CreateObject('VBAPrj.VBACls')If VBACls Is Nothing ThenMsgBox 'VBAPrj.dll必须和文档在同一目录下!'Exit FunctionEnd IfSet GetProjectDoc = VBAClsEnd Function然后以以下代码形式调用Test:Dim objPrjDoc As ObjectSet objPrjDoc = GetProjectDocCall objPrjDoc.T est(ThisDocument)Set objPrjDoc = Nothing使用第一种方法调试提示找不到类库,第二种方法我没试过,用了第三种方法调试成功。

我也觉得第三种还是蛮好的,除了多几行代码。

成功调用DLL后原来很多在VB下写的东东简单改一下就可以在VBA下用了,效率又高,保密性又好。

详解VB.net编写DLL(动态链接库、应用程序扩展)文件

详解VB.net编写DLL(动态链接库、应用程序扩展)文件

详解编写DLL(动态链接库、应⽤程序扩展)⽂件⾸先,我们启动VS(Visual-Studio简称),我使⽤的是VS2008版本。

新建⼀个项⽬-选择内裤(额...不好意思)→类库,名称就默认吧.编写类库没有窗体设计,因此我们不能使⽤⼯具箱中的控件..类库⽀持Function函数,Sub过程等等....完整代码如下:Imports System.IOImports System.Security.CryptographyPublic Class Class1Public Function MD5(ByVal Path As String) As StringDim fstream As New FileStream(Path, _FileMode.Open, _FileAccess.Read)Dim dataToHash(fstream.Length - 1) As Bytefstream.Read(dataToHash, 0, fstream.Length)fstream.Close()Dim hashvalue As Byte() = CType(CryptoConfig.CreateFromName("MD5"), HashAlgorithm).ComputeHash(dataToHash)Dim i As IntegerDim result As String = ""For i = 0 To hashvalue.Length - 1result += Hex(hashvalue(i)).ToLowerNextReturn resultEnd Function '返回MD5值End ClassPS:如果复制的格式不正确请⾃⾏修改。

我们保存之后,选择 “⽣成-⽣成ClassLibrary1"在对应的保存⽬录下找到"ClassLibrary1.dll",这就是你已经写好的DLL了.将其复制到Windows⽬录下,为了避免找不到⽂件。

DLL文件制作与在VBA调用初级进阶

DLL文件制作与在VBA调用初级进阶

DLL文件制作与在VBA调用初级进阶■作者:ldhyob 日期:2004.02本文用一简例来演示如何将一正常在VBA中运行的代码移植到VB制作的DLL中去,并介绍如何在VBA 中进行调用。

这仅仅是最初级的介绍,希望能对此内容想了解的版友们一些帮助,而已掌握该技术的FANS 们完全可以跳过本文。

先来了解一下什么是DLL:DLL是Dynamic Link Library的缩写,意为动态链接库。

在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。

当我们执行某一个程序时,相应的DLL文件就会被调用。

一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。

DLL文件一般被存放在C:\Windows\System目录下。

因此,DLL文件可以看作是一个程序扩展函数库,成为应用软件程序的外挂接口。

就象我们常在程序中用的WINDOWS API,就是如此,它是微软提供给程序员的函数宝库,用户只需了解函数功能与调用规则就可以拿来使用,而不用知道也不需要知道具体源码。

也正因为此,现在许多VBA开发者在保护其代码时也多采用此法来维护其合法权益。

现在开始。

假如我们要编这么一段代码:将工作表Sheet1的A1单元格的数值与B1单元格的数值相加填写到C1单元格去(嘿嘿,这是极简单的了,只是用来说明问题),在VBA模块我们可以编写这样的代码:Sub test()On Error Resume NextDim i, j As IntegerWith Worksheets("Sheet1")i = .Cells(1, 1).Valuej = .Cells(1, 2).Value.Cells(1, 3) = i + jEnd WithEnd Sub执行上面的宏,会发现C1单元格自动会出现A1+B1的结果了。

对VB调用DLL时参数传递的分析

对VB调用DLL时参数传递的分析

对VB调用DLL时参数传递的分析
刘复玉;孙洪涛
【期刊名称】《今日电子》
【年(卷),期】1997(000)012
【摘要】在Windows的编程中,为了扩展VB的功能,经常需要调用DLL库,本文比较详细地分析了在调用过程中参数的传递问题。

【总页数】2页(P68-69)
【作者】刘复玉;孙洪涛
【作者单位】华东石油大学自动化系;华东石油大学自动化系
【正文语种】中文
【中图分类】TP312VB
【相关文献】
1.VB过程调用中参数传递的深入分析 [J], 肖捷;祝庚;肖正新
2.动态链接库(DLL)的参数传递方式及其在VB6.0中的应用 [J], 胡文静;李外云;陈松
3.VB
4.0与OLE2.0技术(二)VB4.0与DLL间的参数传递 [J], 李海
4.VB4.0与DLL的参数传递及其性能优化 [J], 倪晓军;杨力斌
5.VB调用过程中的参数传递解析 [J], 刘新颖
因版权原因,仅展示原文概要,查看原文内容请购买。

轻松编写VB.NET.DLL动态链接库文件_开发平台子站_技巧_IT专家网

轻松编写VB.NET.DLL动态链接库文件_开发平台子站_技巧_IT专家网

轻松编写.DLL动态链接库文件_开发平台子站_技巧_IT专家网大家知道吗?VB一般可以生成两种特殊的DLL,一个是ActiveX DLL和ActiveX Control(*.ocx)。

这两种DLL都是VB支持的标准类型。

这里主要就怎样编写 .DLL动态链接库文件分析讲解。

NewViewStudio的意见:创建 .DLL只是COM组件,无法作为输出函数的DLL,其实这只是个错误的说法。

其实MS非常狡猾,如果你是个VB疯狂发烧友的话,应该早就狂试出这种可以创建输出函数的DLL的方法。

VB 编译文件实际上采取了两次编译的方法,首先是调用C2.exe产生*.OBJ文件,然后调用Link.EXE连接。

如果在LINK的时候添加EXPORT 选项,实际上是可以输出函数的。

但是,在VB的工程选项中将这些屏蔽了。

而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法手动通过 Link来创建我们需要的DLL了。

不过我找到一个比较龌鹾的变通的方法,就是先创建一个Exe工程,在Form_Load事件里面写下面的语句:复制内容到剪贴板 .DLL程序代码Sub Main If MsgBox("哈哈", vbOKCancel) = vbOK Then Shell "link2.exe " & Command$ End IfEnd Sub然后编译为LinkTemp.EXE,接下来将LINK.EXE改名为Link2.exe,将LinkT emp.EXE改名为Link.EXE。

这样在VB调用Link.EXE时会弹出对话框,处理就会中断。

这时就可以有机会将OBJ文件拷贝出来了。

然后我创建了一个ActiveX DLL工程,在这个工程里面添加一个Module并创建一个Public函数mathadd:复制内容到剪贴板程序代码Public Function mathadd(ByVal a As Long, ByVal b As Long) As Long mathadd = a + bEnd Function编译这个工程,在Link的时候就会中断。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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&amp; 或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。

相关文档
最新文档