在VB中调用DLL的方法
(原创)VS2019VB如何生成DLL文件,调用DLL
(原创)VS2019VB如何⽣成DLL⽂件,调⽤DLL ⼀。
⽣成DLL1.打开VS2019,--->"创建新项⽬"------>"类库(NET Framework)---->下⼀步2. 输⼊项⽬名称:bell,3. 输⼊保存位置:D:\4. 点击右下⽅“创建”5.输⼊如下代码:Public Class LearnDLLFunction ABC()ABC = "你好!我学学怎么建⽴DLL⽂件,并怎么调⽤。
"End FunctionEnd Class5.按F5或启动------> "确定"6.这时,在如下⽂件夹中就⽣成了:D:\BELL\bin\Debug\BELL.dll⼆.调⽤dll⽂件1.在vs2019中新建window窗体应⽤程序2. 输⼊项⽬名称:WindowsApp13. 输⼊保存位置:D:\4. 点击右下⽅“创建”5.在窗体Form1中,添加Textbox1控件:6.项⽬----添加引⽤7. 浏览 D:\BELL\bin\Debug\BELL.dll---->添加8.在BELL.DLL前打对号----->确定9.双击Form1窗体,在代码页输⼊⼀下代码:Public Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadDim Goodmood As New BELL.LearnDLLTextBox1.Text = goodmood.ABCEnd SubEnd Class10,编译运⾏。
VB6.0怎么调用带参数的DLL?
VB6.0怎么调用带参数的DLL?
vb6.0中可以创建DLL文件,也可以调用DLL文件,该怎么调用呢?下面我们就来看看详细的教程。
•软件名称:
•msdn for vb6.0(vb6 msdn) 精简中文版
•软件大小:
•20.6MB
•更新时间:
•2014-02-06立即下载
1、桌面上双击VB图标,打开Visual Basic。
2、打开的VB窗口中,选择文件---->新建工程选项。
3、新建工程窗口中,选择ActiveX DLL选项。
4、编辑窗口中,输入dll文件的代码,具体内容由个人决定。
5、单击文件---->保存工程,将dll工程保存。
6、单击文件---->生成dll,生成一个dll文件。
7、单击工程---->引用选项,如下图所示。
8、引用窗口中,单击浏览按钮。
9、选择要引用的DLL文件,单击打开按钮。
10、DLL文件就被引用到应用程序中了,单击确定按钮。
11、接下来就可以在应用程序中,插入组件,书写代码使用DLL
文件了。
以上就是VB6.0调用带参数的DLL的教程,希望大家喜欢,请继续关注脚本之家。
在vb中生成dll文件并且调用的方法.
在vb中生成dll文件并且调用的方法.一、DLL制作1.打开新建工程2.选择“Active DLL”,单击“打开”按钮。
3.单击打开按钮后,系统在工程中添加一类模块。
4.为方便对DLL的引用可以改一下名称,如将类模块的名称改为Fraction。
5.在本类模块中添加代码如下。
Option ExplicitPublic NumPublic DenPublic Sub Add(NUm2, Den2)Num = NUm2 + Den2End SubPublic Sub Sbt(NUm2, Den2)Num = NUm2 - Den2End SubPublic Sub Mul(NUm2, Den2)Num = NUm2 * Den2End SubPublic Sub Div(NUm2, Den2)Num = NUm2 / Den2End Sub6.为与其他工程相区别,可将本工程命名为“Math”。
7.生成DLL文件。
二、DLL引用1.建立一个普通窗体。
2.添加引用。
3.在程序中添加以下代码。
Option ExplicitPublic Frac As New Fraction Private Sub Command1_Click() Frac.Add Val(Text1.Text), Val(Text2.Text) Text3.Text = Frac.NumEnd SubPrivate Sub Command2_Click() Frac.Sbt Val(Text1.Text), Val(Text2.Text) Text3.Text = Frac.NumEnd SubPrivate Sub Command3_Click() Frac.Mul Val(Text1.Text), Val(Text2.Text) Text3.Text = Frac.NumEnd SubPrivate Sub Command4_Click() Frac.Div Val(Text1.Text), Val(Text2.Text) Text3.Text = Frac.NumEnd SubPrivate Sub Command5_Click()Text1 = ""Text2 = ""Text3 = ""End Sub 4.运行程序。
在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调用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调用大漠dll的3种方法!回复有源码有vb例子(解决占CPU高的问题..
VB调用大漠dll的3种方法! 回复有源码有vb例子(解决占CPU高的问题)=========================================================== ====================='/forum.php?mod=viewthread&tid=118 820&extra=page%3D1'大漠dll下载地址'1 大漠用VB dm = CreateObject(dm.dmsoft)'引用里选上dm.dllPrivate Sub Command1_Click()Dim dm As ObjectDim verSet dm = CreateObject("dm.dmsoft")ver = dm.ver()If Len(ver) = 0 ThenMsgBox "当前大漠插件未能正常调用"ElseMsgBox "当前大漠插件DM.dll版本是:" & verEnd IfEnd Sub' 第一种方法奇卡 cpu 占用高'========================================================== ======================'2 '在VB6里面新建一个对象:dmsoft对象' 引用里选上dm.dll' 通用里新建一个 dmsoft对象'其他插件也可以这样调用 Dim b As New dmsoft 只需要把dmsoft 换成别的插件的类名Dim b As New dmsoft'在VB6里面新建一个对象:dmsoft对象Private Sub Command1_Click()本帖隐藏的内容b.SetWindowText Me.hWnd, "你好" '修改VB的窗口标题b.MoveTo 100, 100End SubPrivate Sub Command2_Click()jb = b.GetForegroundWindow()MsgBox jbEnd SubPrivate Sub Command3_Click()Form1.Caption = "找图"'dm.FindPic 0, 0, 800, 600, App.Path + "\开始.bmp", 0, 0.9, 0, X, yCall b.FindPic(0, 0, 800, 600, "C:\开始.bmp", 0, 0.9, 0, x, y)If x >= 0 Thenb.MoveTo x, y '移动鼠标'dm.LeftClick '移动单击MsgBox "找图找到!"ElseMsgBox "找图没找到!"End IfEnd Sub'========================================================== ======================'3 建立个模块Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)'延时函数 sleepPublic Function Delay(DT As Long)For i = 0 To DT Step 2DoEvents '操作权交给系统否则程序会暂时无响应Sleep 1Next iEnd FunctionPublic Function 注册(dm As Object) As ObjectShell "regsvr32 dm.dll /s" '注册大漠插件到系统Delay 500Set dm = CreateObject("dm.dmsoft") '创建大漠插件End Function'窗体Dim dm As Object '声明 DM 为控件类型Private Sub 句柄_Click()Dim jb As Longjb = dm.GetForegroundWindow()MsgBox "句柄是:" & jbEnd SubPrivate Sub 版本_Click()Form1.Caption = "版本"ver = dm.ver()If Len(ver) = 0 ThenMsgBox "当前大漠插件未能正常调用"ElseMsgBox "当前大漠插件DM.dll版本是:" & verEnd IfEnd SubPrivate Sub 退出_Click()EndEnd SubPrivate Sub 移动_Click()Form1.Caption = "移动鼠标"dm.MoveTo 22, 22 '移动鼠标'dm_ret = dm.LeftClick '移动单击End SubPrivate Sub 找图_Click()Form1.Caption = "找图"'dm.FindPic 0, 0, 800, 600, App.Path + "\开始.bmp", 0, 0.9, 0, X, yCall dm.FindPic(0, 0, 800, 600, App.Path + "\开始.bmp", 0, 0.9, 0, X, y)If X >= 0 Thendm.MoveTo X, y '移动鼠标'dm.LeftClick '移动单击Delay 3000MsgBox "找图找到!"ElseMsgBox "找图没找到!"End IfEnd SubPrivate Sub 文字识别_Click()Form1.Caption = "文字识别"dm.SetDict 0, App.Path + "\DDDD.txt"s = dm.Ocr(0, 0, 200, 100, "ffffff-000000", 1#)MsgBox "识别结果是:" & sEnd SubPrivate Sub 找字_Click()Form1.Caption = "找字"dm.SetDict 0, App.Path + "\DDDD.txt"dm_ret = dm.FindStr(0, 0, 200, 100, "我", "ffffff-000000", 1#, intx, intY)If intx >= 0 Thendm.MoveTo intx, intYMsgBox "找字找到!"ElseMsgBox "找字没找到!"End IfEnd SubPrivate Sub Form_Load()On Error Resume Next '容错处理遇到错误直接执行下面的语句注册 dmEnd Sub。
VB调用.NETDLL(一)-skila的日志-网易博客
VB调用.NETDLL(一)-skila的日志-网易博客VB调用.NET DLL(一)学习 2009-07-14 21:38:57 阅读138 评论0 字号:大中小前段两个系统需要衔接,原有的Client端程序是用VB6开发的,需要调用Java开发的Web Service,开发时间BT的短,没有时间研究VB调用Web Service,故先用C#编写DLL文件做过渡调用,关于C#调用Web Service是非常简单的,在此也不做详细描述了。
现在主要解决VB调用.net的DLL。
我们先做了测试:(VS2005)1、先选择"文件"--> -->"新建"-->"项目"-->"类库"我在这取名T estVB,代码如下:using System;using System.Collections.Generic;using System.Text;namespace TestVB{public class Test{public string testEcho(){return "test1";}}}2、编译此项目前,先设置"项目"-->"TestVB属性"-->"生成"下的"为COM Interop 注册"打上勾,原有AssemblyInfo.cs文件中的"[assembly: ComVisible(false)]"修改为"[assembly: ComVisible(true)]"保存,编译即可3、把生成的DLL文件拷贝到VB开发机器上(该机器需安装相应的.NET框架),运行Regasm /tlb /codebase $DLL_DIR/T estVB.dll 命令注册该DLL文件,在VB新建项目中引用TestVB.tlb即可在vb中调用DLL中的函数。
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的完整路径和文件名。
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调用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来说,处理这样的结构比较麻烦,所以通常都不支持这种方式。
在VB中调用DLL的方法
在VB中调用DLL的方法方法一:使用Declare语句VB中可以使用Declare语句来声明DLL函数,然后直接调用该函数,具体步骤如下:1.确保DLL文件已经存在,并了解所要调用的DLL函数的名称、参数和返回值类型。
2. 在VB代码的模块级别上,使用Declare语句来声明DLL函数,语法如下:Declare Function functionName Lib "dllFileName" ([参数列表]) As 返回值类型其中,functionName是要调用的DLL函数的名称,dllFileName是DLL文件的名称(带有扩展名),[参数列表]是DLL函数的参数列表,如果没有参数,则可以省略;返回值类型是DLL函数的返回值类型。
3. 在需要调用DLL函数的地方,直接使用函数名进行调用,如:result = functionName([参数])其中,result是接收DLL函数返回值的变量。
4.运行程序,并检查结果是否正确。
方法二:使用COM组件如果DLL文件是使用COM组件进行编写的,可以使用VB的COM互操作性来调用DLL方法,具体步骤如下:1.确保DLL文件已经注册为COM组件,并了解所要调用的DLL方法的名称、参数和返回值类型。
2.在VB项目中添加对DLL文件的引用,方法是在“项目”->“引用”菜单下,选择“添加引用”,然后在“COM”选项卡中找到并选中DLL文件。
3. 创建一个COM对象,可以使用CreateObject或者New关键字,具体语法如下:Dim obj As ObjectSet obj = CreateObject("dllFileName.ClassName")'或者Dim obj As New dllFileName.ClassName其中,dllFileName是DLL文件的名称(不带扩展名),ClassName是DLL内部的类名。
VB调用系统DLL方法
用SYSTEM EXEC.VI可以实现的经典应用命令·命令列: rundll32.exe shell32.dll,Control_RunDLL功能: 显示控制面板·命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1 功能: 显示“控制面板-辅助选项-键盘”选项视窗·命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2 功能: 显示“控制面板-辅助选项-声音”选项视窗·命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3 功能: 显示“控制面板-辅助选项-显示”选项视窗·命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4 功能: 显示“控制面板-辅助选项-滑鼠”选项视窗·命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5 功能: 显示“控制面板-辅助选项-传统”选项视窗·命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @1功能: 执行“控制面板-添加新硬体”向导。
·命令列: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter 功能: 执行“控制面板-添加新印表机”向导。
·命令列: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1 功能: 显示“控制面板-添加/删除程式-安装/卸载” 面板。
·命令列: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2 功能: 显示“控制面板-添加/删除程式-安装Windows” 面板。
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文件中。
该函数用于执行操作系统的某些功能,例如打开文件或运行程序。
【转】vb调用dll函数声明方法
【转】vb调用dll函数声明方法用vc写的DLL的有__stdcall才可以被其他的调用,所以。
vb调用16 位DLL 调用方法与32 位DLL 调用方法类同。
语法:[Public | Private] Declare Fun Function name Lib "li bname" [Alias "aliasname"]ction [([arglist])] [As type]Declare 语句的语法包含下面部分:Public 可选的。
用于声明对所有模块中的所有其它过程都可以使用的函数。
Private 可选的。
用于声明只能在包含该声明的模块中使用的函数。
name 必需的。
任何合法的函数名。
动态链接库的入口处(entry points)区分大小写。
libname 必需的。
包含所声明的函数动态链接库名或代码资源名。
Alias 可选的。
表示将被调用的函数在动态链接库(DLL) 中还有另外的名称。
当外部函数名与某个函数重名时,就可以使用这个参数。
当动态链接库的函数与同一范围内的公用变量、常数或任何其它过程的名称相同时,也可以使用Alias。
如果该动态链接库函数中的某个字符不符合动态链接库的命名约定时,也可以使用Alias。
aliasname 可选的。
动态链接库。
如果首字符不是数字符号(#),则aliasname 是动态链接库中该函数的入口处的名称。
如果首字符是(#),则随后的字符必须指定该函数的入口处的顺序号。
arglist 可选的。
代表调用该函数时需要传递的参数的变量表。
type可选的。
Function 返回值的数据类型;可以是Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal (目前尚不支持)、Date、String(只支持变长)或Variant,用户定义类型,或对象类型。
arglist 参数的语法以及语法各个部分如下:[Optional] [ByVal | ByRe ByRef] [ParamArray] varnam e[( )] [As type] 部分描述:Optional可选的。
如何用VB编写自己的DLL文件,并调用其中的函数
如何用VB编写自己的DLL文件,并调用其中的函数一、VB编写自己的DLL文件1.新建一个VB工程,工程类型为ActiveX DLL类型。
2.设定工程的名字和类模块的名字。
这里我使用的工程的名字是DLLTest,类模块的名字是Class1。
3.在类模块中写入要封装的函数这里我写了一个计算长方体的体积的函数,代码如下:1.Function calVolume(ByVal a As Double, ByVal b As Double, ByVal c As Double) As Double2.calVolume = a * b * c3.End Function4.保存工程,并生成Dll文件。
通过选择”文件“->”生成DllT est.dll“,生成Dll文件。
至此,完成Dll文件的制作。
二、如何调用自己制作的Dll文件中的函数1.新建一个VB工程,工程类型为标准EXE类型。
2.注册制作的Dll文件。
注册命令格式为:regsvr32 dll文件的绝对地址名称举例说明:比如我把上面我生成的DllTest.dll放在了E盘的VbTest文件里面了,那么我的注册命令为:regsvr32 E:\VbTest\DllTest.dll。
如果注册成功,系统会有弹窗提示。
(测试发现,注册dll文件时,路径文件夹的名字不能有空格)3.在工程中添加相关引用。
”工程“->”引用“->”DllTest“,在DllTest前面打上对勾,即可。
4.编写调用Dll文件的相关代码。
这里我在主窗体中添加了一个按钮,在按钮里面写入了如下代码:Private Sub Command1_Click()Dim MyObj As DllT est.Class1 Set MyObj = New Class1Dim aa As DoubleDim bb As DoubleDi m cc As DoubleDim tempVolume As Doubleaa = 1.1bb = 2.2cc = 3.3tempVolume = MyObj.calVolume(aa, bb, cc)MsgBox temp VolumeEnd Sub另外,我添加了一个模块,在模块中写入了如下代码:Public Declare Function calVolume Lib 'DllTest.dll' (ByVal a As Double, ByVal b As Double, ByVal c As Double) As Double5.至此结束。
在VB中相对路径引用DLL
在VB中相对路径引用DLL在VB中通过相对路径引用标准DLL很长时间以来,都认为只能通过绝对路径引用标准DLL中的函数。
其实,你也可以用相对路径。
1)绝对路径方法比如你的DLL文件位于c:\testDLL\debug\testDLL.dll一般来说,你需要在VB中作如下声明Declare Sub mytest Lib "c:\testDLL\dubug\testDLL.dll" (ByVal x As Long)另外的一个变通方法是把testDLL.dll放在windows的系统目录下,这样,你就可以直接引用文件名了。
不过,需要把一个文件放到windows系统目录下,很是不爽!2)相对路径方法看看我们如何用相对路径,假设你的DLL文件位于c:\testDLL\debug\testDLL.dll,你的VB程序位于目录c:\testDLL\vbClient你可以在VB程序中作如下声明:Declare Sub mytest Lib "../dubug/testDLL.dll" (ByVal x As Long)如果直接运行你的VB程序,系统会提示错误:找不到../dubug/testDLL.dll.为了使上面的声明其作用,先暂时关闭你的VB工程。
然后用一个文本编辑器(notepad,editplus,etc)打开工程文件*.Vbp,通常vbp文件由几个部分组成,比如我的vbp有两部分:Type=ExeReference=*\G{00020430-0000-0000-C000-000000000046}#2.0 #0#..\..\..\..\WINDOWS\System32\stdole2.tlb#OLE AutomationForm=Form1.frmModule=Module1; Module1.basStartup="Form1"ExeName32="Project1.exe"Command32=""Name="Project1"HelpContextID="0"CompatibleMode="0"MajorVer=1MinorVer=0RevisionVer=0AutoIncrementVer=0ServerSupportFiles=0 VersionCompanyName="American Standard" CompilationType=0OptimizationType=0FavorPentiumPro(tm)=0 CodeViewDebugInfo=0NoAliasing=0BoundsCheck=0OverflowCheck=0FlPointCheck=0FDIVCheck=0UnroundedFP=0StartMode=0Unattended=0Retained=0ThreadPerObject=0 MaxNumberOfThreads=1[MS Transaction Server]AutoRefresh=1你要做的就是在第一部分MaxNumberofThreads=1后添加一行DebugStartupOption=0。
在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调用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中调用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的名字。
VB通过LoadLibrary调用自己的DLL
VB通过LoadLibrary调用自己的DLL当然,可以通过CreateObject或者直接引用的办法调用DLL,我这里想学习一下通过LoadLibrary等来调用DLLDll工程很简单,有一个Sub过程,代码如下:Public Sub SayHello(strMsg As String)MsgBox strMsg, vbInformationEnd Sub如果通过CreateObject方法调用如下:dim testObj as objectset testObj=CreateObject("TestLib.clsTest")工程名称为:TestLib,类名为clsTest我现在通过LoadLibrary方法调用,代码如下:Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As LongPrivate Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As LongPrivate Sub Form_Load()On Error GoTo errHdlDim lb As Long, pa As Longlb = LoadLibrary(App.Path & "\clsTest.dll") '这里能正确的调用clsTest.dll这个文件pa = GetProcAddress(lb, "SayHello") '而clsTest.dll里含有上面编写的SayHello这个过程,到这一步就不能返回了,请问如何解决?CallWindowProc pa, Me.hWnd, "Hello!", ByVal 0&, ByVal 0&FreeLibrary lberrHdl:Debug.Print Err.DescriptionEnd Sub昵称: luojiandan 时间: 2010-11-22 10:53:39vb 的dll是标准dll,但他的调用方式不是loadlibrary那种的那是一种专为com对象调用而设计的动态链接库文件昵称: PctGL 时间: 2010-11-23 21:34:10Windows DLL有两种类型,一种为标准DLL(从WINDOWS 1.0起就有),一种为ActiveX DLL(VB生成的DLL为ActiveX DLL),前者使用API函数LoadLibrary调入,后者使用CoCreateInstance (即VB的CreateObject)调入,二者不能混用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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中就可以声明为:Declare 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是被读出的卡机号,那么就是传址的了。
dim l as integerdim m as integerl=GetMacNo(m)if l=0thenlabel1.caption="卡机号:"&melseif l=2thenmsgbox"PC接收超时"elseif l=3thenmsgbox"应答错误"end ifWindows动态连接库是包含数据和函数的模块,可以被其它可执行文件(EXE、DLL、OCX等)调用。
动态连接库包含两种函数:输出(exported)函数和内部(internal)函数。
输出函数可以被其它模块调用,而内部函数则只能在动态连接库内部使用。
尽管动态连接库也能输出数据,但实际上它的数据通常是只在内部使用的。
使用动态连接库的优点是显而易见的。
将应用程序的一部分功能提取出来做成动态连接库,不但减小了主应用程序的大小,提高了程序运行效率,还使它更加易于升级。
多个应用程序共享一个动态连接库还能有效地节省系统资源。
正因为如此,在Windows系统中,动态连接库得到了大量的使用。
一般来说,动态连接库都是以DLL为扩展名的文件,如Kernel32.dll、commdlg.dll等。
但也有例外,如16位Windows的核心部件之一GDI.exe其实也是一个动态库。
编写动态连接库的工具很多,如VisualC++、BorlandC++、Delphi等,具体方法可以参见相关文档。
下面只以Visual C++6.0为例,介绍一下开发应用于VisualBasic6.0的动态连接库时应注意的问题(本文中所有涉及C/C++语言或编译环境的地方,都以VC为例;所有涉及Visual Basic 的地方都以VB为例)。
作为一种32位Windows应用程序的开发工具,VB生成的exe文件自然也都是32位的,通常情况下也只能调用32位的动态连接库。
但是,并不是所有的32位动态库都能被VB生成的exe文件正确地识别。
一般来说,自己编写用于VB应用程序调用的动态连接库时,应注意以下几个方面的问题:1、生成动态库时要使用__stdcall调用约定,而不能使用缺省的__cdecl调用约定;__stdcall约定通常用于32位API函数的调用。
2、在VC中的定义文件(.def)中,必须列出输出函数的函数名,以强制VC系统将输出函数的装饰名(decoratedname)改成普通函数名;所谓装饰名是VC的编译器在编译过程中生成的输出函数名,它包含了用户定义的函数名、函数参数及函数所在的类等多方面的信息。
由于在VC中定义文件不是必需的,因此工程不包含定义文件时VC就按自己的约定将用户定义的输出函数名修改成装饰名后放到输出函数列表中,这样的输出函数在VB生成的应用程序中是不能正确调用的(除非声明时使用Alias子句)。
因此需要增加一个.def文件,其中列出用户需要的函数名,以强制VC不按装饰名进行输出。
3、VC中的编译选项"结构成员对齐方式(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 ByVal0&或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环境变量中的目录下表中列出了常用的操作系统环境库文件。