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的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中的函数。
【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调用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调用
一.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测试成功。
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.至此结束。
一步一步教你用VC和VB调用C++ DLL
#include "stdafx.h" #include "TestExe.h" #include "TestExeDlg.h" #include "Test.h" . . .
// <=== ADD THIS LINE
第六步
如果你想赶时间做一个演示的话, 你可能会尝试只是拷贝 DLL 的 test.h 到你的项目目录里
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 的时候,可以将 Test.lib 链接进去,它包含了 DLL 的导 出符号.
Step by Step: Calling C++ DLLs from VC++ and VB
一步一步教你用 VC 和 VB 调用 C++ DLL.
本系列教程讨论了普通情况下 4 种使用 DLL 的方法
Part 1
从 VC++应用程序调用 C++ DLL 的函数 从 VC++应用程序调用 C++ 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'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''。
VB6.0调用DLL-16.12.10
VB6.0调用DLLHanford2016年12月10日目录目录第1章VB6.0调用DLL (1)1 VC++编写DLL (1)1.1 使用__stdcall (1)1.2 使用.DEF 文件 (1)2 简单数据类型 (2)2.1 传值(ByVal) (2)2.2 传址(ByRef) (3)2.3 传址(VarPtr) (4)2.4 转换为Variant (4)3 String (6)3.1 BSTR内存布局 (6)3.2 StrPtr、VarPtr (7)3.3 示例代码 (7)3.4 转换为Variant (12)3.5 小结 (13)4 结构 (14)4.1 定义 (14)4.2 示例代码 (14)5 数组 (17)5.1 简单数据类型数组 (17)5.2 转换为Variant (18)5.3 结构数组 (19)6 Object (21)7 函数 (21)II第1章VB6.0调用DLL1 VC++编写DLLVB6.0或VBA可以调用DLL里的导出函数。
可以使用VC++编写DLL,供VB6.0调用。
VC++编写DLL时,需要注意以下几点:1.1 使用__stdcallC函数在默认情况下,其调用约定为__cdecl。
为了让VB6.0调用此函数,文件1.2 使用.DEF。
此时,为了简化VB6.0里Test函数的声明,可使用DEF文件,具体如下:12 简单数据类型上表中,除了Decimal、String、Variant之外其它均为简单数据类型。
VB6.0传递简单数据类型给DLL时,分为传值和传址两种方式:2.1 传值(ByVal)2说明:1、VB6.0声明函数时,必须使用ByVal,表示把实参的数值传递给形参;2、因为传递的是数值,所以VC函数里改变形参的数值不会影响到实参。
2.2 传址(ByRef)3说明:1、VB6.0声明函数时,应使用ByRef,表示把实参的地址传递给形参;2、因为传递的是地址,所以VC函数里改变形参的数值将影响到实参。
分享如何在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中调用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中就可以声明为: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是被读出的卡机号,那么就是传址的了。
在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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VB如何调用dll函数
2008-01-10 17:17 開始習慣孤單 | 分类:VB| 浏览13089次
假如我有个DLL,名为 asdfg.dll
它里面有一个函数 zxc(参数1,参数2)
我要用这个函数,该怎么写?
请高手帮我写出脚本,有时间的话请再加上注释
谢谢!!
2008-01-10 19:50 提问者采纳
1.在工程-引用中将asdfg.dll引用过来
2.dim AAA as asdfg 'asdfg是类模块的名称
Private Sub Form_Load()
dim x
Set AAA = New asdfg
x = AAA.zxc(参数1,参数2)'参数1,2自己写
End Sub
建议你了解一下下面dll的制作方法,理解就更透彻了。
下面内容来自百度。
1.新建一个ActiveX Dll,工程名字为vbmytestdll,类模块
名字为mytestdll
2.类模块内容只有一个函数,主要返回DLL的HELLO WORLD Public Function dlltest1() As String
dlltest1 = "HELLO WORLD"
End Function
3.保存,生成DLL,名字为
vbmytestdll.dll
4.新建一个EXE工程,在菜单: 工程---引用---浏览里找到vbmytestdll.dll,把它引用进来
5.EXE工程代码如下:
Option Explicit
Dim testdll As mytestdll'类模块名字
Private Sub Form_Load()
Set testdll = New mytestdll 'DLL的一个新实例
Me.Caption = testdll.dlltest1 '我的标题=返回DLL的HELLO WORLD
End Sub
1、右击工程》添加引用把你的dll文件添加进去
2、然后你定义一个变量作为dll中函数类型的,将变量实例化,最后在调用方法。