VB动态调用自己的ActiveX DLL
(原创)VS2019VB如何生成DLL文件,调用DLL
![(原创)VS2019VB如何生成DLL文件,调用DLL](https://img.taocdn.com/s3/m/cdf3e92e5627a5e9856a561252d380eb62942380.png)
(原创)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?](https://img.taocdn.com/s3/m/6ba30c04a200a6c30c22590102020740be1ecdb2.png)
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和C++调用VB编译的DLL,涉及参数传递
![vb和C++调用VB编译的DLL,涉及参数传递](https://img.taocdn.com/s3/m/1423fd70f5335a8102d22026.png)
if ( 0 != errorCode )
{
/* Retrieve the associated error message */
char message[133];
UF_get_fail_message( errorCode, message );
}
/* PrintErrorMessage
**
** Prints error messages to standard error and the Unigraphics status
** line. */
static void PrintErrorMessage( int errorCode )
PrintErrorMessage( errorCode );
}
//----------------------------------------------------------------------------
// Utilities
//----------------------------------------------------------------------------
vb和C++调用VB编译的DLL,涉及参数传递
在VC中调用VB编写的COM组件范例
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
#endif
#include "CC.h"
#include <string>
VB怎样动态加载ActiveX控件
![VB怎样动态加载ActiveX控件](https://img.taocdn.com/s3/m/d1c89aec4693daef5ef73d84.png)
VB怎样动态加载ActiveX控件熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程,但唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。
VB6.0已能够解决该问题,只是帮助中没有明确说明,并且没有描述到一些关键功能,由于以前的版本中可以动态创建进程外服务:如果对象是外部可创建的,可在Set 语句中用New 关键字、CreateObject 或GetObject 从部件外面将对象引用赋予变量。
如果对象是从属对象,则需使用高层对象的方法,在Set 语句中指定一个对象引用:Dim xlApp1 As Excel.ApplicationSet xlApp1 = New Excel.Application或Dim xlApp As Object '定义存放引用对象的变量。
Set xlApp = CreateObject("excel.application")xlApp.Visible = True这些语法很容易造成误导,以为动态加载ActiveX控件也是此方法,可能有朋友也象我一样利用CreateObject尝试了无数次,却无功而返,不知微软公司是出于何种考虑,动态加载ActiveX控件是扩展控件集合的方式实现,通过实际摸索,终于就如何实现动态ActiveX控件找出了一条切实可行的方法,下面以一个具体的实例来详细说明。
一、ActiveX控件ActiveX 控件是Visual Basic 工具箱的扩充部分。
使用ActiveX 控件的方法与使用其它标准内装的控件,如CheckBox 控件,完全一样。
在程序中加入ActiveX 控件后,它将成为开发和运行环境的一部分,并为应用程序提供新的功能。
ActiveX 部件通过客户端/服务器关系与应用程序—及与部件相互之间—交互作用。
客户端是使用部件功能的应用程序代码或部件。
服务器是部件及其关联的对象。
【VB技巧】VB静态调用与动态调用dll详解
![【VB技巧】VB静态调用与动态调用dll详解](https://img.taocdn.com/s3/m/b74d6b03bb1aa8114431b90d6c85ec3a87c28bf9.png)
【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调用外部动态链接库的方法与示例](https://img.taocdn.com/s3/m/6e6c92153d1ec5da50e2524de518964bcf84d2fb.png)
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动态链接库](https://img.taocdn.com/s3/m/efb95e0c6ad97f192279168884868762caaebb96.png)
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下用了,效率又高,保密性又好。
VBA封装为DLL及调用
![VBA封装为DLL及调用](https://img.taocdn.com/s3/m/76f0e95081c758f5f61f67e5.png)
VBA封装为DLL及调用使用程序:1、Microsoft Office Excel 20032、Microsoft Visual Basic 6.0案例:在工作表的C1单元格得出A1单元格+B1单元格的值。
设计的VBA弋码:Sub Test()On Error Resume NextRange("C1") = Cells(1, 1) + Cells(1, 2)End Sub第一部分、使用VB6.0制作DLL文件一、启动VB6.0,新建一个ActiveX DLL工程:二、引用:在VB中对Excel的引用不同版本的EXCEL S “引用”窗口里显示的版本号也不同:EXCEL200(0 Microsoft Office 9.0 )EXCEL200(2 Microsoft Office 10.0 ),即ExcelXPEXCEL200(3 Microsoft Office 11.0 )EXCEL200(7 Microsoft Office 12.0 )EXCEL201(0 Microsoft Office 14.0 )EXCEL201(3 Microsoft Office 15.0 )三、修改ActiveX DLL 的工程名称和类模块名称四、编写代码:在代码窗口输入代码,过程名称为Test :Sub Test()On Error Resume NextDim VBt, YB ' 定义变量VBtSet VBt = GetObject(, "Excel.Application")' 使VBt 表示为EXCEL寸象Set YB = VBt.ActiveSheet ' 使YB表示为EXCEL勺当前工作表'注意要在对象前加上YB变量以表示是EXCEL!前工作表的对象YB. Range("C1") = YB.Cells(1, 1).Value + YB.Cells(1, 2).ValueEnd Sub五、设置工程属性(为使开发的程序更规范,可以对工程属性加以描述【非必要设置,可以省略】):六、保存工程、测试、生成DLL 文件:1、保存工程:保存本工程以作为将来修改代码和升级程序的需要;2、测试工程:执行快捷工具栏上的“启动”按钮,检查是否存在错误;3、生成DLL文件:制作DLL文件。
VB调用DLL文件
![VB调用DLL文件](https://img.taocdn.com/s3/m/23ffa47849d7c1c708a1284ac850ad02de8007e8.png)
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的方法](https://img.taocdn.com/s3/m/81a0ec5a6ad97f192279168884868762caaebbba.png)
在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调用
![vb动态库DLL调用](https://img.taocdn.com/s3/m/a7444bdd7f1922791688e861.png)
一.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方法
![VB调用系统DLL方法](https://img.taocdn.com/s3/m/aab915d0b14e852458fb576a.png)
用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文件的高级技巧与应用](https://img.taocdn.com/s3/m/53285d4503020740be1e650e52ea551810a6c91f.png)
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文件,并调用其中的函数](https://img.taocdn.com/s3/m/7b9ed24dbf23482fb4daa58da0116c175f0e1e0c.png)
如何用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动态调用自己的ActiveXDLL
![VB动态调用自己的ActiveXDLL](https://img.taocdn.com/s3/m/669ecc81dc88d0d233d4b14e852458fb770b38da.png)
这⼏天在琢磨⾃⼰编写⼀个MS-OFFICE基础操作的阅卷系统,当然类似的系统已经有不少了:国家计算机等级⼀级辅助学习系统、各地⽅的计算机职称考试系统、各⾼校的计算机⽂化基础辅助学习系统以及⼀些商业的及个⼈的类似的系统。
那么我的阅卷系统要有什么特点呢?这类系统。
⽆⾮就是调⽤MS的OFFICE类库,然后使⽤其提供的各种对象来判断操作者的对错。
开发⼯具⾸选VB6.0,开发效率⾼,最重要的就是其和VBA本⾝就是⼀家。
系统框架采⽤主程序(exe)加ActiveX DLL。
优点是,系统开发好后,扩展⽐较⽅便。
可以随时增加⼀个阅卷功能,例如增加⼀个批阅WORD表格⽅便的功能。
并且,提供⼀个接⼝,⽤户也可以按照说明随时增加⾃⼰的批阅点(制作⾃⼰的ActiveX DLL)。
扩展的DLL名称⾃定义,但是要填写表格以告诉主程序,类名称统⼀。
例⼦:pclass.dll (ActiveX DLL ,类名称:class1)Public Function myFunction(ByVal i As Integer) As IntegermyFunction= iEnd Function主程序调⽤:Private Sub Command1_Click()On Error GoTo errorHandle:Dim obj As ObjectSet obj = CreateObject("pclass.class1")@#pclass是DLL名称,class1是pclass.dll中的类名称@#注意:不是模块名称MsgBox obj.myFunction(20)Set obj = NothingExit SuberrorHandle:MsgBox Err.Description & " -- 清检查DLL⽂件名称、类名称、是否注册等!"Err.ClearEnd Sub。
vb动态加载dll的一个类,实现vb动态加载dll并动态调用dll导出的函数的一个方便办法
![vb动态加载dll的一个类,实现vb动态加载dll并动态调用dll导出的函数的一个方便办法](https://img.taocdn.com/s3/m/87505b976429647d27284b73f242336c1eb93028.png)
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中调用DLL的方法
![在VB中调用DLL的方法](https://img.taocdn.com/s3/m/37e6f42b83c4bb4cf7ecd164.png)
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是被读出的卡机号,那么就是传址的了。
VB6.0动态加载ActiveX控件
![VB6.0动态加载ActiveX控件](https://img.taocdn.com/s3/m/f077a7dd80eb6294dd886c71.png)
熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程,但唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。
VB6.0已能够解决该问题,只是帮助中没有明确说明,并且没有描述到一些关键功能,由于以前的版本中可以动态创建进程外服务:如果对象是外部可创建的,可在Set 语句中用New 关键字、CreateObject 或GetObject 从部件外面将对象引用赋予变量。
如果对象是从属对象,则需使用高层对象的方法,在Set 语句中指定一个对象引用:Dim xlApp1 As Excel.ApplicationSet xlApp1 = New Excel.Application或Dim xlApp As Object '定义存放引用对象的变量。
Set xlApp = CreateObject("excel.application")xlApp.Visible = True这些语法很容易造成误导,以为动态加载ActiveX控件也是此方法,可能有朋友也象我一样利用CreateObject尝试了无数次,却无功而返,不知微软公司是出于何种考虑,动态加载ActiveX控件是扩展控件集合的方式实现,通过实际摸索,终于就如何实现动态ActiveX控件找出了一条切实可行的方法,下面以一个具体的实例来详细说明。
一、ActiveX控件ActiveX 控件是Visual Basic 工具箱的扩充部分。
使用ActiveX 控件的方法与使用其它标准内装的控件,如CheckBox 控件,完全一样。
在程序中加入ActiveX 控件后,它将成为开发和运行环境的一部分,并为应用程序提供新的功能。
ActiveX 部件通过客户端/服务器关系与应用程序—及与部件相互之间—交互作用。
客户端是使用部件功能的应用程序代码或部件。
服务器是部件及其关联的对象。
例如,假设应用程序使用ActiveX 控件来提供一个标准的雇员窗体,供公司的多种应用程序使用。
VBS调用VB编写的DLL
![VBS调用VB编写的DLL](https://img.taocdn.com/s3/m/5e549416227916888486d798.png)
VBS调用VB编写的DLL
下面以提取字符串中的数字为例
打开VB6.0
新建一个ActiveX DLL
将工程名称修改为GETNUMBER,类名修改为take
进行封装的代码如下:
新建一个叫GETNU的函数:
Public Function getnu(STRIN As String) As String
Dim k
For k = 1 To Len(STRIN)
If Mid(STRIN, k, 1) Like "[0-9]" Then
getnu = getnu & Mid(STRIN, k, 1)
End If
Next k
MsgBox getnu
End Function
文件—--生成GETNUMBER.DLL
在CMD中用REGSVR32命令注册DLL。
注册前将目录转换到保存GETNUMBER.DLL的文件夹下。
成功后会提示:
打开一个记事本,在记事本中输入如下代码:
Dim strin,strout
strin=InputBox("输入窗口","提取数字")
Set strout=CreateObject("getnumber.take")
strout.getnu(strin)
保存为.VBS后缀的文件。
双击该VBS文件,在弹出的输入框中输入数字和字母、中文的混合字符串,点击确定按钮,就可以看到弹出的消息窗中显示的提取结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
时间:2007-03-13 08:00 来源:网管之家 字体:[大 中 小] 这几天在琢磨自己编写一个MS-OFFICE基础操作的阅卷系统,当然类似的系统已经有不少了:国家计算机等级一级辅助学习系统、各地方的计算机职称考试系统、各高校的计算机文化基础辅助学习系统以及一些商业的及个人的类似的系统。那么我的阅卷系统要有什么特点呢?
文章转载自网管之家:/pdb/dotnet/200703/99884.html
这类系统。无非就是调用MS的OFFICE类库,然后使用其提供的各种对象来判断操作者的对错。开发工具首选VB6.0,开发效率高,最重要的就是其和VBA本身就是一家。系统框架采用主程序(exe)加ActiveX DLL。优点是,系统开发好后,扩展比较方便。可以随时增加一个阅卷功能,例如增加一个批阅WORD表格方便的功能。并且,提供一个接口,用户也可以按照说明随时增加自己的批阅点(制作自己的ActiveX DLL)。扩展的DLL名称自定义,但是要填写表格以告诉主程序,类名称统一。
MsgBox obj.myFunction(20)
Set obj = Nothing
Exit Sub
errorHandle:
MsgBox Err.Description & " -- 清检查DLL文件名称、类名称、是否注册等!"
Err.Clear
End Sub
例子:
pclass.dll (ActiveX DLL ,类名称:class1)
Public Function myFunction(ByVal i As Integer) As Integer
ቤተ መጻሕፍቲ ባይዱyFunction= i
End Function
主程序调用:
Private Sub Command1_Click()
On Error GoTo errorHandle:
Dim obj As Object
Set obj = CreateObject("pclass.class1")
@#pclass是DLL名称,class1是pclass.dll中的类名称
@#注意:不是模块名称