在VB 中调用动态连接库
VB调用API函数

VB调用API函数发表于2016/1/13 20:17:36 733人阅读分类: APIAPI函数快速入门--怎样在VB中声明和使用API函数--一、在VB中声明API函数有两种方法:如果我们只在某个窗体中使用API函数,我们可以在窗体代码的General部分声明它:声明的语法是:Private Declare Function ...Private Declare Sub.....这里必须采用Private声明,因为这个API函数只能被一个窗体内的程序所调用。
如果我们的程序有多个窗体构成,而且我们需要在多个窗体中使用同一个API函数,就需要在模块中声明了。
先添加一个模块(如图示),然后采用如下语法声明:Public Declare Function....Public Declare Sub....Public声明的含义是把API函数作为一个公共函数或过程,在一个工程中的任何位置(包括所有的窗体和模块)都能直接调用它。
声明完毕我们就能在程序中使用此API函数了。
二、可采用以下几种方式使用API函数,以SetWindowPos函数为例:(1)忽略函数返回值的调用:SetWindowPos Form1.hWnd, -2 ,0 ,0 ,0, 0, 3注意此时函数的参数是不加括号的。
(2)Call方法调用:Call SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)注意这里需要加上括号,但我们不取回函数的返回值。
(3)取得函数返回值的调用:MyLng = SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)此时需要加上括号,而且我们必须事先定义一个变量(变量的类型与函数返回值类型相同)来存储API函数的返回值。
三、几个问题的说明:(1)声明中的Lib 和Alias 是怎么回事一般情况下WIN32API函数总是包含在WINDOWS系统自带的或是其它公司提供的动态连接库DLL中,而Declare语句中的Lib关键字就用来指定DLL(动态连接库)文件的路径,这样VB才能找到这个DLL文件,然后才能使用其中的API函数。
组态王常见问题的解决方法

组态王常见问题的解决方法组态王虽然国内用的很多,但他的问题也很多,有时候弄起来真的很麻烦,比如一个简单的开机自动运行都要自己设置,下面是我在网上查到的一些内容。
组态王使用常见问题1、变量设定中最大(小)值及最大(小)原始值的意义?[最大(小)值是变量在现实中表达的工程值(如:温度、压力等)的大小,而最大(小)原始值是采集设备中[寄存器]数字量的最大(小)值(如板卡中的819-4095等)。
一般对于板卡设备此值为物理量经AD转换之后的值,如12BitAD此值范围0~4096、16BitAD为0~65535,对于PLC、智能仪表、变频器,其本身已将物理值转换为工程值所以此时最大(小)值与最大(小)原始值在设置时是一致的.2、为什么变量无法删除,如何删除变量?[在组态王中,只有未使用的变量才能被删除,因此在删除变量之前,必须去掉在画面或命令语言、控件引用处,等处与之有关的连接,如果还是无法删除,在工程浏览器中执行工具-更新变量计数命令,重新统计变量,在变量使用报告中可以查询变量是否还在某些地方使用,将其连接断开后,利用工具-删除未用变量将变量删除。
3、工程运行时,显示通讯协议组件失败?[将工程拷贝到硬盘上将属性改为存档即可5、如何在打开机器时自动进入组态王?[将touchview快捷方式拷贝到系统开始\\程序\\启动中6、怎样把工程文件变小?[可以删除某.AL2(报警信息文件),某.REC(历史记录文件),某.111文件(某.pic文件的备份文件)的文件。
7、如何在线增删用户及用户密码和权限?[使用edituer()函数(用户权限需大于900)]8、在定义变量的基本属性时状态栏中的保存数值、保存参数是什么意思?[保存参数:在系统运行时,修改变量的域的值(可读可写型),系统自动保存这些参数值,系统退出后,其参数值不会发生变化。
当系统再启动时,变量的域的参数值为上次系统运行时最后一次的设置值。
无需用户再去重新定义保存数值:系统运行时,当变量的值发生变化后,系统自动保存该值。
小议用VB让程序发声的方法

Wid wsMei ly 加 到 工具 栏 中进 行 n o da Pa e
调用 。除 了声音 外 ,还 可以播 放视 频文 件 。
4 .利 用 Vsa Bs 的多媒体 控件 i l ai u c
MCIV X .B
接 库文 件 中 。
2. 1 Ope ou nS nd. Cl s S nd. o e ou S W o c No e e ie t ,S rS u d 切 to n
MM o to 是一 个专用的多媒体控 C nrl 件 ,在 VB缺省状态的部件箱中并没有此 项 ,必 须进 行 手 工 填加 。使 用 M C . IVBX 是 Vi a ai 开发多媒体软件的主要方 s lB sc u 法 。用此控件控制 多媒体的基本步骤是指 定媒 体 对象 、 开 媒体 对 象 、 制 媒体 对 象 打 控 等。
维普资讯
卑
菱 怠 2娓 每募 乜 I -
|
弓 c l
缸
Q I O ,T N I/ I F  ̄A I
. 0 28 0
声音。
3 .调 用媒体 播放器控 件
在V . T中没有提供媒体播放 器的 . B NE
NE T组 件 ,但我 们 可 以把 以前 C r 组 件 o n
体会 。
5 .利 用 O E L
V s a B s 是第一个支持对象连接 iu l ai c 与嵌 入 ( L O E)的开发工具 ,利用 O E可 L 以简单地 在应 用程序中插入 声音文件。这 也是使用 V sa ai 开发多媒体软件常 i lB s u c 用 的 方法 。V B的 T oB x中就 有 OI 2 0 o lo . E
控 件 。当我 们双 击 O E .控 件 时 , 弹 出 L 20 会 “n r bet Is tO ] ”窗 口,在窗 口中选择对象 e c
VB动态调用外部函数的方法

VB动态调⽤外部函数的⽅法VB可以⽤Declare声明来调⽤标准DLL的外部函数,但是其局限性也很明显:利⽤Declare我们只能载⼊在设计时通过Lib和Alias字句指定的函数指针!⽽不能在运⾏时指定由我们⾃⼰动态载⼊的函数指针),不能⽤Declare语句来调⽤任意的函数指针。
当我们想动态调⽤外部函数的时候,就必须考虑采⽤其他的辅助⽅法,来完成这个任务了。
在⽂章《》、《》、《》等⽂献中对此问题都进⾏了⼀定程度上的讨论,但是头绪都很繁琐,对我这样的菜鸟还有点深奥,在资料搜索过程中,找到通过在VB中调⼊汇编程序,⽐较简便的实现了这个功能,下⾯就是实现原理:1)使⽤LoadLibrary加载DLL;2)GetProcAddress获得函数指针;以上两步得到了预加载函数的指针,但是VB中没有提供使⽤这个指针的⽅法。
我们可以通过⼀段汇编语⾔,来完成函数指针的调⽤!3)通过汇编语⾔,把函数的所有参数压⼊堆栈,然后⽤Call待⽤函数指针就可以了。
实现以上功能的主要程序:'加载DllLibAddr = LoadLibrary(ByVal "user32")'获得函数指针ProcAddr = GetProcAddress(LibAddr, ByVal "MessageBoxA")'原型为MessageBox(hWnd, lpText, lpCaption, uType)'---以下为Assembly部分---push uTypepush lpCaptionpush lpTextpush hWndcall ProcAddr'--------------------FreeLibrary LibAddr'释放空间嘿,够简单吧!下⾯是动态调⽤MessageBoxA的源代码,上⾯的步骤被封装到RunDll32函数中,可放到模块(CallAPIbyName.bas)中: Dim s1() As Byte, s2() As ByteDim ret As Longs1 = StrConv("Hello~World", vbFromUnicode)s2 = StrConv("VBNote", vbFromUnicode)ret = RunDll32("user32", "MessageBoxA", hwnd, VarPtr(s1(0)), VarPtr(s2(0)), 0&)CallAPIbyName.bas中的源代码:Option ExplicitPrivate Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPrivate Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As LongPrivate Declare Function CallWindowProc Lib "User32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPrivate Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As LongPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long) Public m_opIndex As Long '写⼊位置Private m_OpCode() As Byte 'Assembly 的OPCODEPublic Function RunDll32(LibFileName As String, ProcName As String, ParamArray Params()) As LongDim hProc As LongDim hModule As LongReDim m_OpCode(400 + 6 * UBound(Params)) '保留⽤来写m_OpCode'读取API库hModule = LoadLibrary(ByVal LibFileName)If hModule = 0 ThenMsgBox "Library读取失败!"Exit FunctionEnd If'取得函数地址hProc = GetProcAddress(hModule, ByVal ProcName)If hProc = 0 ThenMsgBox "函数读取失败!", vbCriticalFreeLibrary hModuleExit FunctionEnd If'执⾏Assembly Code部分RunDll32 = CallWindowProc(GetCodeStart(hProc, Params), 0, 1, 2, 3)FreeLibrary hModule '释放空间End FunctionPrivate Function GetCodeStart(ByVal lngProc As Long, ByVal arrParams As Variant) As Long '---以下为Assembly部分--'作⽤:将函数的参数压⼊堆栈Dim lngIndex As Long, lngCodeStart As Long'程序起始位址必须是16的倍数'VarPtr函数是⽤来取得变量的地址lngCodeStart = (VarPtr(m_OpCode(0)) Or &HF) + 1m_opIndex = lngCodeStart - VarPtr(m_OpCode(0)) '程序开始的元素的位置'前⾯部分以中断点添满For lngIndex = 0 To m_opIndex - 1m_OpCode(lngIndex) = &HCC 'int 3Next lngIndex'--------以下开始放⼊所需的程序----------'将参数push到堆栈'由于是STDCall CALL 参数由最后⼀个开始放到堆栈For lngIndex = UBound(arrParams) To 0 Step -1AddByteToCode &H68 'push的机器码为H68AddLongToCode CLng(arrParams(lngIndex)) '参数地址Next lngIndex'call hProcAddByteToCode &HE8 'call的机器码为HE8AddLongToCode lngProc - VarPtr(m_OpCode(m_opIndex)) - 4 '函数地址⽤call的定址'-----------结束所需的程序--------------bsp; '返回呼叫函數AddByteToCode &HC2 'ret 10hAddByteToCode &H10AddByteToCode &H0GetCodeStart = lngCodeStartEnd FunctionPrivate Sub AddLongToCode(lData As Long)'将Long类型的参数写到m_OpCode中CopyMemory m_OpCode(m_opIndex), lData, 4m_opIndex = m_opIndex + 4End SubPrivate Sub AddIntToCode(iData As Byte)'将Integer类型的参数写道m_OpCode中CopyMemory m_OpCode(m_opIndex), iData, 2m_opIndex = m_opIndex + 2End SubPrivate Sub AddByteToCode(bData As Byte)'将Byte类型的参数写道m_OpCode中m_OpCode(m_opIndex) = bData m_opIndex = m_opIndex + 1 End Sub。
在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程序的方法

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界面限定条件显示数据库表数据

vb界面限定条件显示数据库表数据VB界面限定条件显示数据库表数据一、引言在VB界面中,我们经常需要根据一定的条件来显示数据库表中的数据。
本文将介绍如何使用VB编程实现根据限定条件来显示数据库表数据的功能。
二、准备工作1. 安装并配置数据库:我们需要安装一个数据库管理系统,例如MySQL或SQL Server,并创建一个数据库。
在该数据库中创建一个表,用于存储我们要显示的数据。
2. 创建VB项目:打开Visual Studio,选择新建一个VB项目。
在项目中添加一个DataGridView控件和相关的文本框或下拉列表框等控件,用于输入限定条件。
3. 引用库:在VB项目中引用System.Data和System.Data.SqlClient两个命名空间,以便使用库进行数据库操作。
三、连接到数据库1. 创建连接字符串:在VB代码中定义一个连接字符串,用于连接到数据库。
连接字符串包含了数据库的信息,例如服务器地址、用户名、密码等。
2. 建立数据库连接:使用SqlConnection类创建一个新的数据库连接对象,并将之前定义的连接字符串作为参数传入。
调用Open方法打开连接。
四、查询数据1. 编写SQL语句:根据用户输入的限定条件,编写SQL语句来查询符合条件的数据。
可以使用SELECT语句,并通过WHERE子句指定限定条件。
2. 创建命令对象:使用SqlCommand类创建一个新的命令对象,并将之前建立的数据库连接对象作为参数传入。
将编写好的SQL语句赋值给命令对象的CommandText属性。
3. 执行查询:调用命令对象的ExecuteReader方法来执行查询,并将结果保存在一个DataReader对象中。
五、显示数据1. 绑定数据源:将DataReader对象作为DataGridView控件的数据源,通过调用DataGridView的DataSource属性进行绑定。
2. 显示数据:使用DataGridView控件自动根据绑定的数据源显示查询结果。
在VB6.0中实现微秒级定时和控制步进电机的资料

获得记时器震荡次数保存在lpPerformanceCount中。
显然,如果首先获得利用QueryPerformanceFrequency函数获得频率记数器的震荡频率,然后在执行某个程序段之前调用QueryPerformanceCounter函数获得频率记数器的震荡次数,在程序段结束再调用QueryPerformanceCounter函数获得频率记数器的震荡次数,将两次获得的震荡次数相减后再除以震荡频率就获得的了两次间隔之间的时间(以秒为单位)。如果在程序中建立一个循环,在循环中不停的调用QueryPerformanceCounter获得频率记数器的震荡次数并同先前的频率记数器的震荡次数相减,将结果除以频率记数器的震荡频率,如果达到一定的时间就执行某个任务,这样就实现了一个比较精确的记时器的功能。
Public Declare Function QueryPerformanceFrequency Lib "kernel32" _
(lpFrequency As LARGE_INTEGER) As Long
Public Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Long, ByVal _
Timer1.Interval = 10
Timer1.Enabled = False
End Sub
Private Sub Timer1_Timer()
TimerCount = TimerCount - 0.01
Text3.Text = Format$(TimerCount, "00.00")
Private Declare Function QueryPerformanceFrequency Lib "kernel32" _
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在VB 中调用动态连接库作为一种简单易用的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:\windows\lzexpand.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用户接口例程库V ersion.dll版本库Winmm.dllWindows多媒体库Winspool.drv后台打印接口,包含后台打印API调用。
对于Windows的系统API函数,可以利用VB提供的工具API Viewer查找某一函数及其相关数据结构和常数的声明,并复制到自己的程序中。
(二)、使用别名:Declare语句中的Alias子句是一个可选的部分,用户可以通过它所标识的别名对动态库中的函数进行引用。
例如,在下面的语句中,声明了一个在VB中名为MyFunction的函数,而它在动态库Mydll.dll中最初的名字是MyFunctionX。