VB封装DLL实例讲解(三)
VB封装Excel_VBA成DLL技巧

VB封装Excel_VBA成DLL技巧VB封装Excel_VBA成DLL技巧使用VB6.0在WinXP_sp2、Excel 2000环境下制作、测试通过。
一、启动VB6.0:执行:“文件夹(F)”——“新建(N)”——选择“ActiveX DLL”,如下图1:二、引用:VB 中对Excel的引用执行:“工程(P)”——“引用(N)”——选择所要引用的项目:如下图2Excel 2000中:Microsoft Excel 9.0 Object LibraryMicrosoft Office 9.0 Object LibraryExcel 2003中:Microsoft Excel 11.0 Object LibraryMicrosoft Office 11.0 Object Library三、编写代码:1、将工程默认名称“工程1”,改为“zygtest”,将类模块默认名称“Class1”,改为“zyg365”,2、在类模块的代码编辑区写入代码:如下图3模块名称为“hongtong”,代码如下在VB中编写代码时:要注意以下声名Dim XLAPP As ObjectSet XLAPP = GetObject(, "Excel.Application")代码中引用对象,如SHEET,Cell等,前面要加“XLAPP.”(或按照Sub hongtong() 中的格式编写。
)Sub hongtong()Dim excelApp As New Excel.ApplicationDim excelWorkBook As Excel.WorkbookDim excelWorksheet As Excel.WorksheetSet excelWorkBook = excelApp.Workbooks.Add '创建新工作簿Set excelWorksheet = excelWorkBook.Sheets(1) excelWorksheet.Cells(2, 3) = "宏通" '写入数据excelWorksheet.Cells(3, 4) = "zyg365" '写入数据excelApp.Visible = True '显示excel界面,用于调试excelWorkBook.PrintPreview '打印预览excelWorkBook.PrintOut '打印输出excelWorkBook.Saved = True'excelWorkBook.Close '关闭工作薄'excelApp.Quit '退出excelEnd Sub四、工程属性设置:(可以不设置,本步骤可以省略) 为了使自己开发的程序更规范,可以对本工程的属性加以描述:如下图4执行:“工程(P)”——“工程1属性(E)…”(当前工程中为:“zygtest属性(E)…”)五、保存工程、测试、打包生成Dll文件:1、保存:单击保存,保存到一个文件夹中;2、测试:执行工具栏上的“启动”(右向的三角图标)按钮,检查是否存在错误;3、打包生成Dll文件:执行:“文件(F)”——“生成工程1.dll(K)”(当前工程中为:“zygtest.dll”),重命名为“zyg.dll”,至此,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 库名步骤三:修改类名步骤四:在代码窗口输入如下代码。
发布DLL封装过程教程

在代码封装前,首先要完全确认,VBA代码的完全可行性。
1.1.打开EXCEL后,跳转到【VBA编辑器】界面。
操作:【工具】-【引用】查看,在VBA里面引用了那些工具和控件。
1.2.然后打开VB6.0,创建DLL。
操作:【工程】-【引用】将VBA里面的引用的工程都在VB里面引用。
说明:这一步是很重要的,也是基础。
很多时候就是在VB里面没有引用,造成封装后不能创建对象等等故障。
打开VB6.0的新建DLL!在CLASS(CODE)里面我们把在VBA里面的类模块复制过来!二、EXCEL VBA里面建立窗体!这个是我们在VBA里面建立的窗体!这个是我们建立的VBA窗体的代码!要求:在窗体的TETXBO1里面输入后按按钮后,将此保存在表"WO"的(1,1)单元格里面!所以我们建立了如下的代码:Private Sub CommandButton1_Click()Sheets("wo").Cells(1, 1) = TextBox1.TextEnd Sub接下来我们在VBA里面建立模块!输入如下代码Sub 窗体1()测试.ShowEnd Sub要求打开测试窗体!这样我们的VBA就建立完成了!三、DLL的制作!艾昨天讲到如何建立VBA!下面是昨天讲到的VBA建立的窗体!在TEXE里面输入内容按按钮后赋值到A1单元格[attach]202296[/attach]忙自己的软件了!接下来我们转到要加载DLL的EXCEL文件,进入VBA编辑,在thisworkbook里面建立加载DLL和卸载DLL的命令。
接下来我们新建一个类模块,主要用来调用窗体和DLL里面命令的。
DIM Fun As New 测试(在加载DLL后,输入“AS” 自动可以索引“NEW” 自动索引“测试”)DLL测试--是我们建立的DLL文件名称。
测试--是我们在DLL里面的模块,在这里要AS NEW (模块) 不是DLL了!这一句我们在上面将此设置为全局变量,方便下面的语句。
vb编写DLL学习

怎样用VB编写DLL文件???你先打开VB,然后先中“ActiveX Dll”工程,然后开始编辑。
编完后,保存一般是以“.cls”和“.vbw”保存。
这时你选择“文件”菜单,弹出下拉框,选中“生成.dll”选项,它就会在上面弹出一个进度条“正在生成.dll文件”。
生成以后是一个有好象齿轮状的图标。
如果你要引用,就开一个“标准EXE”工程,然后在“工程”选项中,单击“引用”,找到你刚才的“.dll”的文件名,在前面的复选框中打勾,就可以引用你刚才在那里面写的方法等。
在vb6里建新工程时选用建立dll 做好后用vb的引用就可以了VB中创建的DLL只是COM组件,无法作为输出函数的DLL,其实这只是个错误的说法。
其实MS 非常狡猾,如果你是个VB疯狂发烧友的话,应该早就狂试出这种可以创建输出函数的DLL的方法。
VB编译文件实际上采取了两次编译的方法,首先是调用C2.exe产生*.OBJ文件,然后调用Link.EXE连接。
如果在LINK的时候添加EXPORT选项,实际上是可以输出函数的。
但是,在VB的工程选项中将这些屏蔽了。
而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法手动通过Link来创建我们需要的DLL了。
不过我找到一个比较龌鹾的变通的方法,就是先创建一个Exe工程,在Form_Load事件里面写下面的语句:Sub MainIf MsgBox("哈哈", vbOKCancel) = vbOK ThenShell "link2.exe " & Command$End IfEnd Sub然后编译为LinkTemp.EXE,接下来将LINK.EXE改名为Link2.exe,将LinkTemp.EXE改名为Link.EXE。
这样在VB调用Link.EXE时会弹出对话框,处理就会中断。
这时就可以有机会将OBJ文件拷贝出来了。
然后我创建了一个ActiveX DLL工程,在这个工程里面添加一个Module并创建一个Public函数mathadd:Public Function mathadd(ByVal a As Long, ByVal b As Long) As Longmathadd = a + bEnd Function编译这个工程,在Link的时候就会中断。
VB操作Excel封装成DLL

VB操作Excel封装成DLL【前言】:网上由于封装的例子和教程太零散,故系统地揭开封装神秘的面纱。
【步骤】:1、启动VB6.0程序,新建“ActiveX DLL”。
2、勾选VB对Excel的引用:(1) Microsoft Excel x.0 Object Library ;(2) Microsoft Office x.0 Object Library 。
3、在VB中编写需封装的功能代码。
(1)将工程名“工程1”改为“符合功能的名字”——如“海纳百川测试”,将类模块名“Class1”也改为另一个“符合功能的名字”——如“删除重复项”。
(说明:符合命名规则任意改为某某名,改名主要是为了区别和方便调用)(2)编写功能代码。
Sub 删重()Dim dic As ObjectDim xlApp As Excel.Application '针对GetObject获取已打开的Excel对象'Dim xlApp As New Excel.Application '针对CreateObject创建新的Excel对象Dim exWb As Excel.WorkbookDim exSh As Excel.WorksheetDim r As LongSet xlApp = GetObject(,"excel.application") '获取已打开的Excel对象'Set xlApp = CreateObject("excel.application") '创建新的Excel对象Set exWb = xlApp.ActiveWorkbook '获取当前活动工作簿'Set exWb = xlApp.Workbooks.Add '创建新的工作簿Set exSh = exWb.ActiveSheet '获取当前活动工作表'Set exSh = exWb.WorkSheets(1) '设置第一个工作表Set dic = CreateObject("scripting.dictionary")Dor = r + 1dic(exSh.Cells(r, 1).Value) = ""Loop Until exSh.Cells(r, 1) = ""exSh.Cells(1, 3).Resize(dic.Count) =Application.Transpose(dic.keys)Set dic = NothingSet xlApp=NothingSet exWb=NothingSet exSh=NothingEnd Sub4、点击——“文件”——“生成海纳百川测试.dll”——保存到指定位置。
将VBA代码编译封装成为DLL动态链接库方法

将VBA代码编译封装成为DLL动态链接库方法在OFFICE中使用VBA虽然方便,并且功能强大,但是VBA在代码的保护上却存在着缺陷。
如果不对VBA工程设置密码保护,代码很容易被人浏览乃至窃取。
而且即使设置了密码保护,也很容易被人破解。
因此,要想真正保护VBA代码,要想让别人无法或难于破解您的VBA代码,那么,我们可以将VBA代码编译成为DLL动态链接库,也就是封装成为DLL的意思,下面是与此相关的方法,希望对您有所帮助。
一、为什么要编译成为DLL我们知道,Visual C++、Visual Basic和C++ Builder以及Delphi等编译器所编译出来的程序不容易被人破解(相对来说),这是因为代码被编译成了可执行文件或者动态链接库文件。
那么,我们是否可以将VBA代码封装到动态链接库文件中,然后用Word调用呢?回答是肯定的。
而且这样做还有一个好处,即可以加快代码的运行速度。
二、将VBA代码封装成动态链接库假如我们已经写好了一个VBA工程,而且运行无误。
①建立VB工程及一般性操作首先,我们需要两种工具,其中当然包括Microsoft Word,另外一种是Microsoft Basic 6.0。
打开Microsoft Basic 6.0,在“新建工程”中选取“ActiveX DLL”,新建一个工程。
在属性窗口中将工程名改为VBAPrj,类模块名改为VBACls。
然后在“工程”菜单下打开“引用”,选取“Microsoft Office 11.0 Object Library”——这一步很是关键,切不可遗漏,然后保存工程。
下面我们所做的是向工程内添加代码。
将VBA工程中的一个名为Test过程的代码选定后复制,然后切换到VB编辑器,选中VB的工程管理器中的类模块VBACls,将代码粘贴至代码编辑窗口中,于是这段代码便成了类模块VBACls一个方法,然后将工程编译生成dll文件(如果编译成功的话)。
在Word中,我们就可以通过类模块VBACls建立的对象来调用此方法(具体怎么调用,我们将后面介绍)。
vb和vc混合编程实例(ocx和dll)

vb和vc混合编程实例(ocx和dll)(转载)前⾔:由于以前⽤vb和vc++封装过dll和ocx⽂件. 或者在⽹上下的类;若重新编写和封装会很费时和费⼒. 如vb简单易⽤,对数据库操作通⽤类进⾏封装.现在vc中可以引⽤之。
另外由于vc执⾏效率⾼,某些较复杂算法或低层处理可在vc中进⾏封装. 这样经常要求混⽤.下⾯是实际中个例⼦记,分vb6.0,vc++各⾃创建和调⽤四个部分1: vb能封装ocx和active dll⽂件. 注意 active dll是⼀种动态,在被调⽤环境中不仅引⽤这个dll,⽽且还要引⽤这个dll所引⽤的其它⽂件,如 DBCommom.dll 是个数据库操作类封装,它引⽤了Ado 接⼝).其创建略,具体引⽤见后.2.vc中做dll时注意要提供接⼝,供其它程式调⽤.a>创建 win32 Dynamic-Link Library 如项⽬CMyTestDllb>加⼊成员function(在 .h中申明 .cpp中实现)//取电脑名称int CMyTestDll::GetComputerNameE(LPTSTR computer_name){DWORD buf=255;LPTSTR strname=new char[buf];if(GetComputerName(strname,&buf)!=0){strcpy(computer_name,strname);return 1;}return 0;}//计算两个值之和int CMyTestDll::Sum(int a, int b){return(a+b);}c.>⼀定要加上CMyTestDll.def ⽂件,并在在其中定义导出各个function及参数,否则不能被调⽤EXPORTSGetComputerNameE @1;Sum @2; @3;d.>编译成dll便可以.最好每个function定义int为返回值.3.vb引⽤vc中dll 和普通API函数⼀样.(vb的long对应 vc的int)'引⽤Private Declare Function GetComputerNameE Lib "⽬录\MyTestDll.dll" (ByVal strName As String) As LongPrivate Declare Function Sum Lib "⽬录\\MyTestDll.dll" (ByVal g As Long, ByVal b As Long) As Long'调⽤Dim str As String * 20 ' 注意对于传址,⼀定要定义其空间⼤⼩(数组可以不指定)dim a As Long, b As Longa=25 b=78result = GetComputerNameE(str)result=Sum(a, b)4.vc引⽤vb中ocx和dll如 C:\TestVb\DBCommon.dll 是个vb做的数据库通⽤类。
VB调用C#封装dll文件

第一步C# 封装dll文件1、创建TestVotedll工程,设置工程属性如下图2、编写程序using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;//提供各种各样支持 COM 互操作及平台调用服务的成员namespace TestVoteDll{//定义接口public interface ITestClass{void SetCom(string comid);//bool InitVote(string [,] voteinfo);string[,] GetVoteResult();}[ClassInterface(ClassInterfaceType.None)]//必须增加的一句话。
public class VoteCom : ITestClass //通过接口继承父类ITestClass{public string[,] myvoteInfo;public int lng1 = 0;public int lng2 =0;public string ComID = "COM1";public void SetCom(string comid){}public Boolean InitVote(string[,] voteinfo){lng1 = voteinfo.GetLength(0);lng2 = voteinfo.GetLength(1);myvoteInfo = new string[lng1, lng2];for (int k = 0; k < lng1; k++){for (int m = 0; m < lng2; m++){myvoteInfo[k, m] = voteinfo[k, m];}}return true;}public string [,] GetVoteResult(){int k = 1;for (int m = 0; m < lng2; m++){myvoteInfo[k, m] =System.Environment.TickCount.ToString();}return myvoteInfo;}}}编译生成时,查看Debug目录下有两个文件TestV oteDll.dll和TestV oteDll.tlb 3、建立VB工程引用TestVoteDll.tlb此文件,编写测试程序Dim a As ObjectSet a = CreateObject("TestV oteDll.Class1")Dim c() As StringReDim c(1, 1) As Stringc(0, 0) = 1c(0, 1) = 2c(1, 0) = ""c(1, 1) = ""Dim Res As BooleanRes = a.InitVote(c) //传入数组Call a.SetCom("COM2") 可以传入字符串Dim b() As Stringb = a.GetVoteResult() //获取dll文件的数组。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VB封装DLL实例讲解(三)
一、手动注册及引用
(一)手动注册及引用方法(参看实例:手动引用.mdb)
进入VBA编辑窗口,点菜单【工具】—【引用】,打开【引用】对话框,点【浏览】按钮,打开【添加引用】对话框,点选要引用的DLL(测试实例为:ClsFindString.dll),点【打开】—点【确定】,我们完成动态链接库的手动注册及引用。
4点确定按钮
1点浏览按钮2点选DLL
3点打开按钮
(二)手动注册及引用方法不足及问题
手动注册引用优点是不言而喻的,方便简捷,易于操作。
但在实际运用中,当我们在其他电脑上发布应用程序,或运行我们测试好的应用程序时,却会出现错误提示,程序无法正常运行。
错误(一):找不到工程或库(见下图)
错误的主要原因:DLL在当前运行的电脑系统中没有注册信息,而且引用不正确。
错误(二):引用的动态链接库(DLL)丢失(见下图)
进入到VBA编辑窗口,点菜单【工具】—【引用】,打开【引用】对话框,我们会看到之前引用的DLL动态链接库丢失。
错误的主要原因:系统无法找到原路径引用DLL。
错误(三):自动化错误(见下图)
错误的主要原因:我们在发布应用程序的电脑或系统中,虽然重新完成DLL手动注册和引用,但如果DLL路径再次改变,运行程序时就会出现“自动化错误”提示。
错误(四):ActiveX部件不能创建对象(见下图)
错误的主要原因:应用程序已正常引用DLL动态链接库,但其册注信息丢失或者没有正常注册,就会出现以下问题。
(三)解决上述错误方法
1、解决错误方法,当然是重新进行DLL的手动注册及引用,具体步骤参下图。
但这只是治标不治本的办法,不利于对外发布我们的应用程序,最好的办法还是通过VBA自动完成DLL的注册及引用。
1去除丢失DLL钩选
5点确定按钮
2点浏览按钮3点选DLL
4点打开按钮
我们可以将注册语句放在窗体的加载事件,自动完成DLL的注册,具体可以参看实例。
但如果我们有多个DLL需要批量注册时,可以考虑通过软件打包发布工具来完成DLL的注册工作;也可以事先编写BAT文件,让打包发布时将该BAT文件一并打包发布,安装时运行该BAT文件,来完成N个DLL的批量注册,在些就不多着笔墨,大家可以参看实例包中的BAT文件实例。
(二)DLL自动引用方法
2.1 通过References对象的AddFromFile方法实现自动引用
Dim ref As Reference '申明引用类对象
On Error Resume Next '避免因重复引用造成的错误提示
'实例化引用对象,完成DLL的引用
Set ref = References.AddFromFile(CurrentProject.Path & "\ClsFindString.dll")
为了避免因重复引用出现的错误,我们可以如上代码中加入Error语句,我们还可以在应用程序退出时,通过对References对象的Remove方法释放DLL或反引用。
Dim ref As Reference '申明引用类对象
'实例化反引用对象
Set ref = References("ClsFindString")
'移除引用指定类库
References.Remove ref
说明:根据本人实践,我个人倾向于使用Error语句,因为如果应用程序非正常退出,引用对
象没有反引用成功,启动时就难免出现重复引用的错误问题。
2.2 通过DLL唯一标识号实现自动引用
Dim ref As Reference'申明引用类对象
On Error Resume Next '避免因重复引用造成的错误提示
'唯一标识号完成注册,需要DLL标识号,主版本号,次版本
Set ref = References.AddFromGuid("{C5E340E2-C557-4852-AE83-5A0578B6863B}", 1, 0)
DLL的标识号是编译生成时就确定了的,这个标识号就是DLL的终生制身份证号,我们可以通过这个唯一标识号来完成DLL自动引用。
但此种方法必须具备两个条件,一是DLL已经成功注册,二是我们知道了该DLL的标识号、主版本号、次版本号。
2.2.1获取DLL标识号、主版本号、次版本号方法
Dim ref As Reference '申明引用类对象
'实例化引用类库对象
Set ref = References.AddFromFile(CurrentProject.Path & "\ClsFindString.dll")
Debug.Print ref.GUID '获得DLL唯一标识号
Debug.Print ref.Major '获得主版本号
Debug.Print ref.Minor '获得次版本号。