当前位置:文档之家› 将VBA代码编译封装成为DLL动态链接库方法

将VBA代码编译封装成为DLL动态链接库方法

将VBA代码编译封装成为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建立的对象来调

用此方法(具体怎么调用,我们将后面介绍)。当然,我们可以继续向工程里添加代码。

②修改代码

虽然VBA源于VB,但是两者毕竟存在着一些差异。因此,需要对转移到VB 中的VBA代码做一些必要的修改。

A、修改VBA代码中所特有类型的对象

如果我们所添加的代码里有VBA所特有类型——如Document、Rang、BookMark等所建立的对象,编译时会提示错误,因为VB不能够识别这些对象。此时修改的方法是,将这些对象作为过程或函数的参数进行传递。需要注意的是,这些参数的类型都一律设为Object。

例如,我们在过程Test中要访问对象ThisDocument,但是VB无法识别ThisDocument,于是我们就为过程test添加一个参数Doc来传递ThisDocument,即Test可定义为Test(Doc As Object)。

B、修改VBA所特有一般变量

VB也无法识别VBA特有的一般变量,如ProtectType,同样,我们也将其作为过程后函数的参数进行传递,不过其类型名都一律设为Variant。

C、修改VBA所特有常量

如果在VBA代码中出现了这样的语句:

ProtectionType = wdNoProtection

很明显,wdNoProtection是Word所独有的常量,不为VB所能识别,因而无法通过编译。怎样解决这个问题呢?当然,我们可以用修改变量的方法予以修改。但是聪明的读者会想到:如果我们知道了wdNoProtection的值,就可以直接将值赋给ProtectionType。但是接下来的一个问题是:我们怎样才能获得wdNoProtection的值呢?方法很简单,就是让Word“开口”告诉我们。

在Word一个事件中添加以下语句:

MsgBox CStr (wdNoProtection)

其中CStr是类型转换函数,返回参数相应的字符串。只要在Word中触发此事件,会弹出一个对话窗,显示“-1”,这就是Word所告诉我们的:

wdNoProtection 的值是-1。于是我们就可以将语句 ProtectionType = wdNoProtection 改为 ProtectionType = -1,问题到此就迎刃而解了。

三、封装用户窗体

我们也可以将用户窗体封装到动态链接库文件里。首先打开Word的VBA编辑器,选中工程资源管理器中的用户窗体,点击右键,选择“导出文件”,选定路径后,将窗体文件保存。然后切换到VB编辑器,在“工程”菜单中选择“添加文件”命令,添加保存的窗体文件。添加结束后,我们会发现VB编辑器中的工程资源管理器中的设计器出现了刚添加的窗体名,选中后双击,在窗体编辑器中就会显现所添加的用户窗体。

到了这里,读者会问:窗体还有代码呢,怎么办?先别急,试一试下面的操作,你就会明白,问题早已不再是问题了。选中工程资源管理器中的用户窗体,点击右键,选择“查看代码”,你就会高兴发现,在代码编辑框中出现了窗体所对应的代码。原来,在我们导入窗体文件的同时也导入了窗体的代码!当然高兴之余,不要忘了还要对这些代码按照我们上述的方法进行必要修改,以保证代码顺利地通过编译。这样Word就可以通过类模块VBACls间接地调用窗体。

四、在Word中引用动态链接库

假如经过我们编译已生成了一个动态链接库文件VBAPrj.dll,其中有一类模块VBACls,此类模块有一个方法Test(Doc As Object)。

接下来我们所要做的是用Word调用Test,有三种方法可供选择:

1.打开Word的VBA编辑器中ThisDocument代码窗口,点"工具"菜单下的"引用"命令,在引用对话框中引用该动态链接库。

调用代码如下:

Dim VBACls As New VBAPrj.VBACls

VBACls.Test(ThisDocument)

2.如果知道该动态链接库文件的位置,可以在ThisDocument代码窗口以代码形式引用, 代码如下:

Private Sub Document_Open()

On Error Resume Next

Me.VBProject.References.AddFromFile "D:\VBAPrj.dll"

End Sub

3.将动态链接库文件拷贝到Word文档同一目录下,可在ThisDocument代码窗口中建立如下引用函数:

Private Function GetProjectDoc() As Object

On Error Resume Next

Dim VBACls As Object

Set VBACls = CreateObject("VBAPrj.VBACls")

If VBACls Is Nothing Then

MsgBox "VBAPrj.dll必须和文档在同一目录下!"

Exit Function

End If

Set GetProjectDoc = VBACls

End Function

然后以以下代码形式调用Test:

Dim objPrjDoc As Object

Set objPrjDoc = GetProjectDoc

Call objPrjDoc.Test(ThisDocument)

Set objPrjDoc = Nothing

推荐您使用第三种方法,虽然这种方法相对麻烦,但是只要动态链接库与Word文档处于同一目录下,可保证程序的可移植性。

到目前为止,我们已完成了我们所要达的目的。此时,即便我们不对VBA 工程设置密码保护,别人也将很难窥视到我们的代码。

MATLAB2014aC++代码生成,并用VC2010生成dll供VBA或VB调用使用说明

MATLAB2014a生成C++代码,并用VC2010生成dll 供VBA或VB调用使用说明 一、过程概述 1、使用VC2010生成.dll文件,测试VC程序是否正常 2、使用VBA调用VC2010生成的.dll文件,测试.dll文件调用的VBA代码是否 正常,这里使用Excel VBA主要是为了以后输入输出数据更方便。 3、使用MATLAB编写脚本程序文件,使用MATLAB CODER功能编译成c++文件。 4、VC2010集成MATLAB生成的c++代码,并编译成.dll文件 5、使用步骤1,2验证MATLAB生成的代码 二、具体实施过程描述 1、使用VC2010生成.dll文件 1.1工程建立 首先打开VS 2010--> 新建工程 --> Win32 --> Win32项目 --> 输入工程名称(MakeDll),选择好保存工程的路径-->确定。 在弹出的“应用程序设置”--> "应用成程序型" --> 选择 "DLL(D)" --> 附加选项-> 选择"空项目(E)" ---->点击"完成"进入项目工作窗口

1.2开始创建DLL 第一步: 在头"解决方案资源管理器" --> 头文件 --> 右键 -->添加新建项 ---→选择"头文件(.h)" -->输入文件名称(max) --> 点击“添加(A)”,完成max.h文件的添加。

max.h头文件中的代码为: 1. #ifndef _MAX_H 2. #define _MAX_H_ 3. __declspec(dllexport) int __stdcall fmax(int a,int b); 4. #endif 代码说明: __declspec(dllexport) 的作用是指定导出该函数为DLL函数; __stdcall是函数调用约定,表示该DLL函数被C/C++以外的语言调用; 备注:使用时需要根据实际定义的主函数返回值类型和函数名称修改低3行红色而自体标记部分内容。这里需要修改的是int数据类型,fmax(int a,int b)的函数名称和变量名称和变量的类型,或者直接从第二步的主程序中复制过来。 第二步: 在头"解决方案资源管理器" --> 源文件 --> 右键 -->添加新建项 -->选择"C++文件(.cpp)" -->输入文件名称(max) --> 添加(A) max.c源文件中的代码为:

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)”——选择所要引用的项目:如下图2 Excel 2000中: Microsoft Excel 9.0 Object Library Microsoft Office 9.0 Object LibraryExcel 2003中:Microsoft Excel 11.0 Object Library Microsoft Office 11.0 Object Library三、编写代码: 1、将工程默认名称“工程1”,改为“zygtest”,将类模块默认名称“Class1”, 改为“zyg365”, 2、在类模块的代码编辑区写入代码:如下图3 模块名称为“hongtong”,代码如下在VB中编写代码时:要注意以下声名 Dim XLAPP As Object Set XLAPP = GetObject(, "Excel.Application") 代码中引用对象,如SHEET,Cell等,前面要加“XLAPP.”

(或按照Sub hongtong() 中的格式编写。)Sub hongtong() Dim excelApp As New Excel.Application Dim excelWorkBook As Excel.Workbook Dim excelWorksheet As Excel.Worksheet Set 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 '退出excel End Sub四、工程属性设置:(可以不设置,本步骤可以省略) 为了使自己开发的程序更规范,可以对本工程的属性加以描述:如下图4 执行:“工程(P)”——“工程1属性(E)…”(当前工程中为:“zygtest属性(E)…”)五、保存工程、测试、打包生成Dll文件:

VB封装VBA文件

VB中的类开发 对程序员和编程爱好者来说,VB中类的技术是学习中的一个难点,在大型软件的开发过程中,模块(Moudle)、控件(Active moudle)构成了系统化、高效化的软件工程,而类的技术是控件和链接库技术的基础,因此掌握类的理论和编程方法是非常有意义的。 (一)类的基本定义和应用概述; 类是包含了方法、属性、数据成员的高级代码模块,它既在模块的范畴之内,又是一个没有图形界面的Active ocx,程序员可以象使用控件一样使用它,但却不能看到它,值得注意的是,类是不能继承的。 类能够使我们高效的完成对某一个或者某几个特定的对象的复杂操作,对象的动作就是类的方法,对象的属性就是类的属性过程。相对而言,如果编程的对象是一组事物,那么,我们采用标准模块的方式是非常合适的,在下列两种情况下,应该使用类进行代码处理: (1)创建大量性质相近的对象; (2)提高代码的封装性。 类的创建非常简单,在进行代码编写的时候,在“工程”菜单中选择“添加类模块”项目,就可以添加一个空白的类。 类文件一般以.cls作为扩展名保存。 (二)类的方法的实现; 类的方法类似于动态链接库的接口函数,它能够接受其他窗体代码的指定类型参数,并且传递到类中。一般来说类的方法是能够指定是否有返回值的。它在类中通常是一个public过程。请看下面的代码示例,它使一个密码框拒绝非字母的输入: (1)类cls的代码; Option Explicit'变量检查 Private WithEvents mytxt As TextBox '本类中的方法接受和控制一个text密码框 Dim isNUM As Boolean '类的模块级变量 Public Sub Attach(itTEXT As TextBox) '接受外部变量到mytxt中 Set mytxt = itTEXT End Sub Private Sub mytxt_KeyUp(KeyCode As Integer, Shift As Integer) isNUM = (KeyCode > = 65) And (KeyCode < = 90) '测试密码框的键盘输入是否是英文字母

java调用C#封装的dll方法

Java调用C# DLL的方法简介 By 潘伟2012-8-7 关于java调用C# 封装的DLL文件的方法 第一种:java利用JNA进行调用 思路:C#源码生成COM组件(dll和tlb文件),再利用C++进行封装,java通过JNA调用C++封装的DLL。 第二种:java利用jacob进行调用 第一种java利用JNA调用C# DLL 需安装Visual Studio 2010 ,下载jna.jar(解压放置于jdk_home/jre/lib/ext目录下)。 第一步:利用C#写COM组件 1、新建一个类库项目(文件—新建—项目—类库;命名:COMTest);//根据实际需要取文件名 2、生成.cs主文件; COMTestClass.cs

3、右键点击工程->应用程序->程序集信息->使程序集com可见,打上勾

4、右键点击工程->生成->为com Interop注册打上勾 5、设置强签名 (由于.Net下编译的COM组件并等同于C编译的COM组件,所以存在必须在运行目标机器注册的情况,对此.Net下编译的COM组件必须为程序进行签名,即强命名密钥;) 打开Visual Studio Command Prompt 输入:sn -k MyKeyFire.snk 生成MyKeyFire.snk 文件,注意路径。(.snk文件可以随意取,但.snk后缀名别忘记了) 在签名标签中选中为程序集签名,选择刚刚生成的强名称文件MyKeyFire.snk 。

6、在“解决方案资源管理器”中找到节点“Properties”打开AssemblyInfo.cs文件 如下图 7、将[assem bly: Com Visible(false)]属性改成[assem bly: Com Visible(true)] 如下图 8、编译程序,\bin\Debug目录中会生成COMTest.dll 和COMTest.tlb文件。 第二步:利用C++进行再封装 1、创建C++ DLL项目,新建项目->VC++->Win32 项目(名称:COMTest_Bridge)->下一步->应用程 序类型:DLL 2、添加类,类名:COMTest_Bridge,.h名:COMTest_Bridge.h,.cpp名:COMTest_Bridge.cpp, 然后生成项目; 3、把第一步生成的COMTest.dll 和COMTest.tlb文件放入C++项目下的Debug文件夹下。 4、注册COM组件: 4.1打开Visual Studio Command Prompt进入Debug目录,运行命令注册:

使用NetBox简单实现ASP封装为EXE带图的详细教程

使用NetBox简单实现ASP封装为EXE带图的详细教程 NetBox是一个使用脚本语言进行应用软件开发与发布的开发环境和运行平台,使用 NetBox,可以完全使用脚本语言(比如 VBScript,Javascript) 创建出稳定高效的应用软件,并且可以平滑移植到从 Windows 98 到 Windows .NET Server 的全部操作系统上。适用范围对于 WEB 应用,可以迅速将已有的iis+asp 的应用平滑移植到NetBox应用中,除极少数高级编程外,代码不需要任何修改,同时NetBox还提供大量扩展部件,使得 WEB 应用更加方便。由于NetBox可以将全部代码最终发布成为应用程序,保护了开发人员的利益和代码的完整性。同时,NetBox还可以方便地编写更多的桌面应用、系统服务器应用、定制网络应用等等。 运行环境要求NetBox的基本运行环境要求很低,最低要求只需要 Windows 98 或者 Windows NT + IE4 即可运行。而如果需要使用系统其他部件(比如ado),则需要根据系统情况,如果系统本身未缺省安装,需要自行安装。下面列出的是经过测试的所有系统平台: Windows 98 Windows 98 SE Windows ME Windows NT+IE4 Windows 2000 Windows XP Windows .NET Server 以上为该软件的说明文件内的内容。 简单的形容就是把ASP文件打包成一个EXE文件,并且不需要在调试的机器上安装IIS即可正常调试。如果按照说明书来操作的话,观看比较繁琐,本人为方便大家使用,现制作一个简单的使用教程。 封装过程 1、首先安装NetBox,安装时全部是英文界面,默认安装。 2、准备步骤: 2.1、在任意(如D)盘根目录下建立web文件夹(在哪个盘符下建立都可以,根据自己的喜好变换位置。); 2.2、把需要封装的ASP文件拷贝至D盘web文件夹下的wwwroot文件夹内(是

c#数据库连接、操作、封装dll

c#数据库连接去sql server 为了简化数据库连接和操作,编写一个数据库dll文件也是比较有用的。只需要设置参数就可以完成数据库操作 属性 OUTPUTSTR 存储过程输出 CONSTR 数据库连接字符串 SQL_SLT 存储过程名或sql语句列表名 代码错误信息返回或连接关闭状态 public int sql_select(int cmdtype, int sqlst,int n) 数据库语句执行方法, cmdtype设置数据源执行的SQL语句或存储过程,即commandtype属性(0为text枚举,1为storedprocedure枚举,其他值为tabledirect枚举); sqlst设置执行SQL语句的方式,0为executenonquery方法执行,1为executereader 方法执行,其他为executescalar方法执行。设置存储过程参数个数。方法返回受 影响的行数 public Boolean Connopen() 打开数据库连接方法,返回bool值,true为打开,false 为未打开,并将未打开错误返回到EXSTR属性里 public void conn_close() 连接关闭方法,将关闭状态返回到EXSTR属性 public void sqlsp(string p1,string p2,string p3,int p4,int p5) 获取SqlParameter 对象参数,p1获取SqlParameter.ParameterName属性值,p2获取SqlParameter.sqldbtype属性值, p3获取SqlParameter.value属性值,p4获取SqlParameter.size属性值, p5设置SqlParameter.Directions属性值,0为ParameterDirection.Input、 1为ParameterDirection.InputOutput、2为ParameterDirection.Output、 大于3为ParameterDirection.ReturnValue public DataSet ds 返回查询结果集 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Data; using System.Collections; namespace connet { public class jdbccoonn { private string constr, exstr, sql_slt,outputstr; private static int q; public static int Q { get {

类封装成dll

如果你的工作长期与某个领域相关,比如说长期做直接体绘制 (DVR)方面的开发,那么你可能经常使用自己的传递函数类,如果每一个工程你都把传递函数类的.h和.cpp文件添加进去会比较麻烦,其实,我们可以像 使用opengl的库那样来用你自己的类,做法就是把你写好的类封装成dll,具体做法如下: 第一步:制作dll 利用VC6新建工程时选择win32 dynamic-Link Library(空的工程),然后添加头文件和cpp文件。假设你要封装的类的名成是TransferFunction,添加头文件 TransferFunction.h和TransferFunction.cpp到工程中。并将TransferFunction.h修改成: class __declspec(dllexport) TransferFunction { ... } 从而说明以后从dll要被导出的类是哪一个。这样编译完就会产生TransferFunction.dll和TransferFunction.lib两个文件。 第二步:如何使用这个dll 当已经生成dll后,有两种方法可以在其它程序中调用dll中的类和成员函数: 方法一: 1)把TransferFunction.dll和TransferFunction.lib复制到调用程序的执行路径下,注意不是debug路径下。 2)在project->setting->link里添加TransferFunction.lib(或者用 #pragma comment(lib, "TransferFunction.lib") ) 3)把TransferFunction.h中的__declspec(dllexport)改成 __declspec(dllimport) 然后复制到调用程序的执行路径下。 4)最后在主程序中就可以通过包含TransferFunction.h来使用TransferFunction类和它的成员函数。 方法二(推荐): 在方法一中,你每次建立一个工程都需要把 TransferFunction.dll,TransferFunction.lib,TransferFunction.h三个文件拷贝到工程里面 去,事实上这只发挥了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 Main If MsgBox("哈哈", vbOKCancel) = vbOK Then Shell "link2.exe " & Command$ End If End 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 Long mathadd = a + b End Function 编译这个工程,在Link的时候就会中断。然后把创建的Class1.obj、Module1.obj、Project1.obj备份出来。然后就可以调用Link2.exe连接OBJ到DLL了,我的连接代码是: Link2.exe "e:\vbdll\Class1.obj" "e:\vbdll\Module1.obj" "e:\vbdll\Project1.obj" "E:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mathadd /OUT:"e:\vbdll\ProjectOK.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS 注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。这样就大功告成了,可以被其他语言引入,例如在VB中,只需要: Private Declare Function mathadd Lib "e:\vbdll\ProjectOK.dll" (ByVal a As Long, ByVal b As Long) As Long

VB封装DLL实例讲解(三)

4 1 2点选DLL 3点打开按钮

5 2 3点选DLL 4点打开按钮

我们可以将注册语句放在窗体的加载事件,自动完成DLL的注册,具体可以参看实例。但如果我们有多个DLL需要批量注册时,可以考虑通过软件打包发布工具来完成DLL的注册工作;也可以事先编写BA T文件,让打包发布时将该BA T文件一并打包发布,安装时运行该BA T文件,来完成N个DLL的批量注册,在些就不多着笔墨,大家可以参看实例包中的BA T文件实例。 (二)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 '获得次版本号

c,,中的模板及函数怎么封装为dll

竭诚为您提供优质文档/双击可除c,,中的模板及函数怎么封装为dll 篇一:封装dll 基于Visualc++6.0的dll编程实现 一、前言 自从微软推出16位的windows操作系统起,此后每种版本的windows操作系统都非常依赖于动态链接库(dll)中的函数和数据,实际上windows操作系统中几乎所有的内容都由dll以一种或另外一种形式代表着,例如显示的字体和图标存储在gdidll中、显示windows桌面和处理用户的输入所需要的代码被存储在一个userdll中、windows编程所需要的大量的api函数也被包含在kerneldll中。 在windows操作系统中使用dll有很多优点,最主要的一点是多个应用程序、甚至是不同语言编写的应用程序可以共享一个dll文件,真正实现了资源"共享",大大缩小了应用程序的执行代码,更加有效的利用了内存;使用dll的另一个优点是dll文件作为一个单独的程序模块,封装性、独立性好,在软件需要升级的时候,开发人员只需要修改相应的dll文件就可以了,而且,当dll中的函数改变后,只要

不是参数的改变,程序代码并不需要重新编译。这在编程时 十分有用,大大提高了软件开发和维护的效率。 既然dll那么重要,所以搞清楚什么是dll、如何在windows操作系统中开发使用dll是程序开发人员不得不解 决的一个问题。本文针对这些问题,通过一个简单的例子,即在一个dll中实现比较最大、最小整数这两个简单函数,全面地解析了在Visualc++编译环境下编程实现dll的过程,文章中所用到的程序代码在windows98系统、Visualc++6.0编译环境下通过。 二、dll的概念 dll是建立在客户/服务器通信的概念上,包含若干函数、类或资源的库文件,函数和数据被存储在一个dll(服务器)上并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它的dll。dll库不同于静态库,在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.lib),Visualc++的编译器在处理程序代码时将从静态库 中恢复这些函数和数据并把他们和应用程序中的其他模块 组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。 在动态库的情况下,有两个文件,一个是引入库(.lib)文件,一个是dll文件,引入库文件包含被dll导出的函数

用VBA封装DLL

VBA封装为DLL及调用 2012-09-04 02:36:00| 分类:VB / VBA / EXCEL | 标签:|举报|字号大中小订阅 使用程序: 1、Microsoft Office Excel 2003 2、Microsoft Visual Basic 6.0 案例:在工作表的C1单元格得出A1单元格+B1单元格的值。 设计的VBA代码: Sub Test() On Error Resume Next Range("C1") = Cells(1, 1) + Cells(1, 2) End Sub 第一部分、使用VB6.0制作DLL文件 一、启动VB6.0,新建一个ActiveX DLL工程: 二、引用:在VB中对Excel的引用

不同版本的EXCEL在“引用”窗口里显示的版本号也不同:EXCEL2000(Microsoft Office 9.0) EXCEL2002(Microsoft Office 10.0),即ExcelXP EXCEL2003(Microsoft Office 11.0) EXCEL2007(Microsoft Office 12.0) EXCEL2010(Microsoft Office 14.0) EXCEL2013(Microsoft Office 15.0) 三、修改ActiveX DLL的工程名称和类模块名称

四、编写代码: 在代码窗口输入代码,过程名称为Test: Sub Test() On Error Resume Next Dim VBt, YB '定义变量VBt Set 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).Value End Sub 五、设置工程属性(为使开发的程序更规范,可以对工程属性加以描述【非必要设置,可以省略】):

VBA封装为DLL及调用

V B A封装为D L L及调用 使用程序: 1、MicrosoftOfficeExcel2003 2、 案例:在工作表的C1单元格得出A1单元格+B1单元格的值。 设计的VBA代码: SubTest() OnErrorResumeNext Range("C1")=Cells(1,1)+Cells(1,2) EndSub 第一部分、使用制作DLL文件 一、启动,新建一个ActiveXDLL工程: 二、引用:在VB中对Excel的引用 不同版本的EXCEL在“引用”窗口里显示的版本号也不同: EXCEL2000() EXCEL2002(),即ExcelXP EXCEL2003() EXCEL2007() EXCEL2010() EXCEL2013() 三、修改ActiveXDLL的工程名称和类模块名称 四、编写代码: 在代码窗口输入代码,过程名称为Test:

SubTest() OnErrorResumeNext DimVBt,YB'定义变量VBt SetVBt=GetObject(,"")'使VBt表示为EXCEL对象 SetYB='使YB表示为EXCEL的当前工作表 '注意要在对象前加上YB变量以表示是EXCEL当前工作表的对象 ("C1")=(1,1).Value+(1,2).Value EndSub 五、设置工程属性(为使开发的程序更规范,可以对工程属性加以描述【非必要设置,可以省略】): 六、保存工程、测试、生成DLL文件: 1、保存工程:保存本工程以作为将来修改代码和升级程序的需要; 2、测试工程:执行快捷工具栏上的“启动”按钮,检查是否存在错误; 3、生成DLL文件:制作DLL文件。 第二部分、调用DLL文件 一、在VBE中调用DLL文件 调用DLL文件,要分两步走:先注册DLL,再引用DLL。 1、注册DLL(使之放在可引用的列表上): 注册DLL也可以使用代码来做,但那样比较复杂,也存在很多问题,建议一般使用手工来注册。 (这里应该先设计好DLL文件放在硬盘的位置,因为后面引用DLL文件的代码也应该是指向这个位置的。)

ASP调用C#编写的DLL的方法

ASP 调用C#编写的DLL的方法 前一阵子一直在忙一个项目,其中要用到ASP调用C#的DLL,网上资历料不少,总结了一下,写个例子 出来 首先建立一个类库的项目 之后编写一个接口,ASP要调用的对象实现这个接口,代码如下(要有一个没有参数的构造函数) using System; using System.Runtime.InteropServices; namespace Test { [Guid("123AC4E1-BEB0-45a1-BE3F-91BDD16A117A")] public interface ITest { [DispId(0)] string TestString(); } public class Test : ITest { //从工具下的创建GUID取得 public Test() { } #region ITest 成员 public string TestString() { return "Test"; } #endregion } 之后对这个类进行强签名(如果这个DLL调用的其它DLL的话,也要进行强签名),运行Visual Studio 2003 .net 命令提示,执行sn -k 后加输出的DLL所在目录,如sn -k 文件路径\test.snk,之后会生 成test.SNK文件,打开AssemblyInfo.cs文件,在[assembly: AssemblyKeyFile("")]里填写生成

的SNK文件 的路径,如[assembly: AssemblyKeyFile("文件路径\\test.snk")],之后重新编译 使用regasm工具对程序集进行注册,运行Visual Studio 2003 .net 命令提示,执行regasm /tlb DLL文件 之后使用gacutil工具将DLL程序集安装到全局程序集缓存中,也是先运行Visual Studio 2003 .net 命令提示,再执行gacutil /i 要注册的DLL的路径 之后就可以asp里调用测试啦 sn.exe regasm.exe gacutil.exe 这三个工具都可以在Visual Studio .net 2003的安装目录下的SDK\v1.1\Bin目录下找到

用VB编写.DLL动态链接库文件

用VB编写.DLL动态链接库文件 作者:不详 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 Main If MsgBox("哈哈", vbOKCancel) = vbOK Then Shell "link2.exe " & Command$ End If End 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 Long mathadd = a + b End Function 编译这个工程,在Link的时候就会中断。然后把创建的Class1.obj、Module1.obj、Project1.obj备份出来。 然后就可以调用Link2.exe连接OBJ到DLL了,我的连接代码是: Link2.exe "e:\vbdll\Class1.obj" "e:\vbdll\Module1.obj" "e:\vbdll\Project1.obj" "E:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /EN TRY:__vbaS /EXPORT:mathadd /OUT:"e:\vbdll\ProjectOK.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERSION:1.0 /Dll /INCREMEN TAL:NO /OPT:REF /MERGE:.rdata=.text /IGNORE:4078 注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。这样就大功告成了,可以被其他语言引入,例如在VB中,只需要: Private Declare Function mathadd Lib "e:\vbdll\ProjectOK.dll" (ByVal a As Long, ByVal b As Long) As Long 经过变通,VB可以做出输出函数的标准动态链接库——其实,国外早已经有人做出了在VB中制作标准DLL的Add-Ins了,使用非常方便,我也做过测试,证明确实可行。详情请看这里: https://www.doczj.com/doc/e2235081.html,/vb/scripts/ShowCode.asp?txtCodeId=54190&lngWId=1

DELPHI封装对象到DLL

在Delphi中封装对象到DLL 方法一:基本封装 (1) 原型 (1) 原型说明 (1) 封装TCar到DLL中 (2) 在DLL中封装对象的限制 (2) 封装步骤 (2) 方法二:运用接口在DLL中封装对象 (3) 原型 (3) 封装步骤 (3) 方法三:用COM/COM+封装对象 (4) 方法一:基本封装 原型 原型说明 TForm1和TCar分别在不同的单元当中; TForm1中有一个按钮Button1,点击Button1执行TCar.Drive; TForm1单元uses了TCar单元; TForm1的处理过程如下:

var mycar:TCar; begin mycar:=TCar.Create; mycar.Drive; mycar.Free; 封装TCar到DLL中 在DLL中封装对象的限制 调用DLL的应用程序只能使用DLL中对象得动态绑定方法。也就是说方法后面必须有virtual关键字; 封装对象的实例只能在DLL中创建; 在DLL和调用DLL的应用程序中都需要对封装对象以及被调用的方法进行声明; 封装步骤 1、在Project Manager中添加新项目Add New Project,选择DLL Wizard,命名新项目 为DemoDll。 2、将TCar单元加入到DemoDll项目中,并从原项目DemoExe中删除TCar单元。 3、在TCar单元做以下修改:在Drive方法后面加上virtual关键字。 4、在Library DemoDll中做以下修改: 添加 uses ShareMem …… function CrtCar:TCar; begin result:=TCar.Create; end; exports CrtCar; 5、在Frm单元做以下修改: 添加 TCar=class(TObject) procedure Drive;virtual;abstract; end; …… var

[图文]6步学会VC封装DLL

6步学会简单DLL封装 ——浅影_Ashen 邮箱:nathanielwen@https://www.doczj.com/doc/e2235081.html, 开始之前感谢小侯童鞋,本人昨晚研究dll两个小时无果,与今天早上幸得点拨,遂有此文~希望可以帮助很多跟我一样的菜鸟入门。 首先,我们需要4个文件以及2项目,分别是 文件部分: 1、dll.h(用于函数声明等) 2、dllFunc.cpp(用于函数的具体实现) 3、dllMain.cpp(dll的主函数文件) 4、dlltest.cpp(测试dll是否封装成功) 项目部分: 1、dllcreate(项目名) 2、dlluse(项目名)

明白了大体框架之后,接下来是具体操作步骤: 一、新建一个win32控制台项目,输入路径,以及文件名(这里用dllcreate作为项 目名)之后,单击确定,选择下一步,并勾选“dll”、“空项目”,单击完成之后建立项目完毕。 (由于本人使用的是VS2012,如果使用VC 6.0可能略有不同)

二、为项目添加3个文件(右键单击某个文件夹,选择"添加->新建项")

三、为3个文件添上代码部分(具体代码详见文章末尾) dll.h作为头文件,负责声明函数原型,其中“extern"C"_declspec(dllexport) ”为固定格式,“extern"C"”表示用C语言描述,“_declspec(dllexport)”表示这将是一个导出函数。 函数的具体实现:注意需要把dll.h包括进来。其他部分和C或C++的格式完全一样。

dll的主函数,格式固定,具体参数如有疑问请找度娘~~ 四、编译运行 可能会提升无法启动,但是不要着急,打开项目的debug文件夹 有dllcreate.dll和dllcreate.lib说明生成dll文件已经成功。 五、以上操作,针对dll的封装已经完成,接下来我们需要调用它,以测试封装是否成 功。创建一个新的win32控制台项目,命名为dlluse,单击确定,选择下一步,勾选“控制台应用程序”和“空项目”,并为它添加一个dlltest.cpp文件

asp封装dll经验小结

asp封装dll经验小结 1、在封装asp代码的过程中应该根据需要来封装,不要所有的程序都封装起来,这样很容易造成一些无法预知的错误 2、在封装过程中一定要注意变量的声明,否则编译后的dll很可能会出现一些问题。比如在asp中使用的变量如rs、conn这样的变量很容易被我们忽视去声明她,所以在编写asp代码时要养成一个良好的习惯。 3、在封装代码的过程中一定要将包含文件里面的所有代码全部写到dll文件中,这在感开始学习编译dll 时很容易被我们所忽略。因为vb的编写和asp的编写思路时不一样的。 4、在封装过程中尽量不要封装和fso相关的代码。比如上传、自动生成html等等,我在封装的过程中上传功能始终不能正常运行。或许这时个人问题,希望又成功经验的人能就这个问题进行讨论。 以上四点时我在封装asp代码时的一些心得,很少,希望大家不要介意,欢迎有这方面经验的网友一起讨论。 我来说一下编写asp组件的大致过程吧: 1、启动VB的废话就不说了; 2、引用:把你平时写ASP用到的东东都要引用到当前工程里来,常用的如: com+ services type library microsoft active server pages object library(ASP内建对象就在里边) microsoft activeX data objects library(你的RS,CONN,CMD就在里边)其他的东东你根据自己的需要来引用了,引用之后只要new一个实例,就可以调用其中的方法了 3、写代码:就是你的FUNCTION/SUB 了,不过这里面可都要用response.write 输出HTML的(不用担心width=100%>;的错误了) ASP封装成DLL一些注意事项 虽然https://www.doczj.com/doc/e2235081.html,代码封装方案很好,完全可以取代ASP,但是用惯了ASP,而且对一些小项目也不想动用到.NET这个傍然大物,因为电脑性能跟不上,所以还是存在ASP封装的种种问题,经过多次试验,对转换成DLL的过程写下一些心得: 1、代码和DLL的区别 DLL代码前要加上以下一段,目的是引用ASP五大对象: Private Context As ScriptingContext Private Application As Application Private Response As Response Private Request As Request Private Session As Session

相关主题
文本预览
相关文档 最新文档