DLL文件制作与在VBA调用初级进阶
■ 作者:ldhyob 日期:2004.02
本文用一简例来演示如何将一正常在VBA中运行的代码移植到VB制作的DLL中去,并介绍如何在VBA中进行调用。这仅仅是最初级的介绍,希望能对此内容想了解的版友们一些帮助,而已掌握该技术的FANS们完全可以跳过本文。
先来了解一下什么是DLL:DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。DLL文件一般被存放在C:/Windows/System目录下。
因此,DLL文件可以看作是一个程序扩展函数库,成为应用软件程序的外挂接口。就象我们常在程序中用的WINDOWS API,就是如此,它是微软提供给程序员的函数宝库,用户只需了解函数功能与调用规则就可以拿来使用,而不用知道也不需要知道具体源码。也正因为此,现在许多VBA开发者在保护其代码时也多采用此法来维护其合法权益。
现在开始。假如我们要编这么一段代码:将工作表Sheet1的A1单元格的数值与B1单元格的数值相加填写到C1单元格去(嘿嘿,这是极简单的了,只是用来说明问题),在VBA模块我们可以编写这样的代码:
-
Subtest()
-
OnErrorResumeNext
-
Dimi,jAsInteger
-
WithWorksheets("Sheet1")
- i=.Cells(1,1).Value
- j=.Cells(1,2).Value
- .Cells(1,3)=i+j
-
EndWith
-
EndSub
执行上面的宏,会发现C1单元格自动会出现A1+B1的结果了。
下面我们在VB中生成包含以上宏功能的函数(子程序)的DLL文件。打开VB,“文件”-“新建工程”-“ActiveX DLL”,此时会弹出class1模块代码窗口,将如下代码写入:
-
Subtest()
-
OnErrorResumeNext
-
Dimi,jAsInteger
-
DimEB
-
SetEB=GetObject(,"Excel.Application")
-
WithEB.ActiveSheet
- i=.Cells(1,1).Value
- j=.Cells(1,2).Value
- .Cells(1,3)=i+j
-
EndWith
-
SetEB=Nothing
-
EndSub
在生成DLL之前,注意确保VB里"工程"---"引用"里"Microsoft Excel 9.0 Object Library"前面的勾已打上,再就是正确设定好DLL描述与名称。菜单“工程”----“工程属性”---“工程描述”,里面可以写上你的DLL功能名称或简介或版本号。“视图”---“属性”,设定名称为你在其他开发环境中欲使用的引用名称,如“Mytest”。好,现在点击菜单“文件”---“生成…dll”,会弹出路径与文件取名窗,按你的意思选择与输入好路径和即将生成的DLL文件名,按确定就会完成DLL的生成工作。
此时DLL已生成在你指定的目录下了,当前工程保不保存就随便你自己了,如果以后还想再编辑修改的话,当然得取个文件名保存好:)。生成的DLL如果正确的话,VBA中只要引用后就可正常调用了。
现在回到EXCEL VBA开发环境中来,先对刚生成的DLL进行一下引用。关于引用,可以手工引用,也可以用代码来做。手工引用的步骤是:在VBE窗口中,菜单“工具”---“引用”,会弹出如下窗口:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" title="新窗口打开" style="WIDTH: 330pt; HEIGHT: 251.25pt" href="UploadFile/2004-2/200422901645889.gif" o:button="t" target="_blank" alt="" type="#_x0000_t75"><imagedata o:href="http://club.excelhome.net/UploadFile/2004-2/200422901645889.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.gif"></imagedata></shape>
“浏览”到刚才生成的DLL,选择打勾确定即可。代码引用: Shell "regsvr32 /s " & "…………..dll", vbHide,加s参数是防止出现确认窗口,影响界面。取消引用则使用/u参数。
然后在VBA中写调用的代码:
-
SubDLLtest()
-
DimabcAsNewMytest‘定义abc为新类,即在DLL文件中定义的
- abc.test‘调用DLL中提供的过程,来完成原来在VBA中的功能,起到隐藏代码的效果
-
Setabc=Nothing
-
EndSub
提供的示例中,将VBA方法与DLL调用放在了一起,便于大家进行比较。另外,DLL文件的制作远比我在这里介绍的复杂,还会涉及到类初始化、自定义属性与事件等内容,不过如果有时我们仅仅需要借助其来保护我们的VBA代码的话,掌握这部分也就足够了,呵呵。
分享到:
相关推荐
VBA调用dll是指定路径的,如果该路径下没有想调的dll怎么办,本文给出了一个解决方法
就是SAP 的ABAP语言调用 DLL文件中的函数实现一些功能, 例如可以用DLL文件连接外部数据库读取数据. 我在网上找了好久,都没有一个完整的答案, 也没有一个完整的实例, 根据网上的各种说法, 我整合到一起, 终于成功, ...
亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。
C# 调用DLL文件C# 调用DLL文件C# 调用DLL文件C# 调用DLL文件C# 调用DLL文件C# 调用DLL文件C# 调用DLL文件
DLL文件的制作与调用(上) 使用语言 C++ 编译器 VC 2005 作者 慢跑 QQ 46655550 前言 本问具体用VS.NET 2005 进行制作DLL的简单制作与调用 本人没啥编程经验 希望本文对大家有帮助! 需要基础 C++语言 面向对象...
Delphi创建Dll和调用Dll示例(包含Dll窗体调用) 网上介绍比较杂乱,特地整理了一份Demo代大家学习参考。 1.socketA_dll 为dll工程目录。 2.LoadDllDemo 为【静态调用】dll工程目录。 3.LoadDllDemo_动态调用 为...
封装https/http的get/post使用函数DLL文件,方便使用者调用,有调用示例程序;另外还有两个ansi与Utf8的转换, 调用示例: PostHttpsContext("current.sinaapp.com","/post.php","name=rain&age=12"); 调用示例: ...
需要三个文件,dll_demo.h、dll_demo.cpp、dll_dome.def 直接上代码: 头文件如下: #ifndef _DLL_DEMO_H_ #define _DLL_DEMO_H_ #ifdef DLLDEMO_EXPORTS #define DLL_DEMO extern "C" __declspec(dllexport) #else...
在工作中遇到了在VB6.0的程序里要调用C#的Dll的问题,显然这两个开发环境属于不同的平台。在网上拜读了几位大师的文章后,在实际试验中还是会发生这样那样的问题,最后还是实现了预期效果,在此我把我的实验步骤和...
Dll查看器,可查看各dll文件内函数代码及调用规则,方便实用
在C++中将Winsock2进一步封装,导出dll文件,在C#中调用dll 更多的是dll制作和调用练习。
隐式调用法: 将MyDll.lib和MyDll.h拷贝到需要应用该DLL的工程的目录下,将MyDll.dll拷贝到产生的应用程序的目录下,并在需要应用该DLL中的函数的CPP文件中添加如下几行: 3.A_Dll嵌套调用B_Dll,跟exe调用A_Dll是...
DLL调用DLL调用DLL调用DLL调用DLL调用DLL调用DLL调用DLL调用DLL调用DLL调用DLL调用DLL调用
使用方法是替换系统VBA执行库文件,使工程里设置的查看密码无效(输入任意密码即可) ...该文件在C:\Program Files\Common Files\microsoft shared\VBA\VBA6\VBE6.DLL 可用它破解过CAD、office2003以下vba
VB6.0生成的DLL文件制作成安装包和自动注册使用 本文是针对Excel VB6.0生成的DLL文件,使用第三方制作成安装文件,在用户电脑上进行安装注册,然后打Excel软件就可以使用DLL文件的功能,不用手动注册
1、Labview生成Dll文件 2、Java通过Jnative第三方Jar包调用Labview生成的DLL文件 3、Java在Windows系统调用Labview生成的Dll的说明 有JNative的使用说明 直接下载,根据使用说明可以直接使用。
LabVIEW中DLL文件的创建及调用方法
LoadRunner测试过程中调用dll文件的制作与使用 1、dll文件的制作 在Visual C++6.0开发环境下,打开File-New-Project选项,可以选择Win32 Dynamic-Link Library来创建一个名为dllfortest的空的dll工程(这只是方法...
这是VB的编程资料,如何编写自己的DLL文件,把他用在自己的程序中,这是VB的朋友们的困惑。只有了解了DLL的基本结构和编程技巧,才能为VB的程序服务好,本例只是一个简单的例子,用来说明DLL的进本结构。
正如大家看到的,我们在external语句中指定了所要调用的DLL文件的名称。没有写路径是因为该DLL文件和调用它的主程序在同一目录下。如果该DLL文件在C:\,则我们可将上面的引用语句写为external ’C:\Delphi.dll’。...