VB创建能作为输出函数的DLL_第1页
VB创建能作为输出函数的DLL_第2页
VB创建能作为输出函数的DLL_第3页
VB创建能作为输出函数的DLL_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、转帖 VB创建能作为输出函数的DLLDLL, 函数, 输出QQ:DLL文件(即Dynamic Link Library,动态链接库)作为系统的一个重要的组成部分,除了一些小程序外,我们几乎能在所有软件中看到DLL文件,而且如果使用VB写的一些收费软件有一个DLL代替关键函数,想破解都难了。因此,我们就有必要来学习如何编写DLL。对于很多初学VB的网友来说,VB是一门比较简单的语言,而MicroSoft公司在开发VB时,也增添了很多功能。所以,我个人觉得VB除了部分不足之外还是挺不错的,当然我指的不足是主要是VB运行库方面的问题。对于很多VB初学者来说,都会有这么一个错误的认识VB中创建的DLL

2、只是COM组件,无法作为输出函数的DLL(即VB写的DLL是不完整的DLL)。然而,对于一些VB的高手来说,他们就知道应该如何写具有返回值的DLL。其实,国外早已经有人做出了在VB中制作标准DLL的Add-Ins了,而且在网上也有对于写VB创建能作为输出函数的DLL的相关文章。今天,我再来讲讲这个话题VB创建能作为输出函数的DLL对于VB编写DLL,按照我的经验,主要分为两步:一、“安内”,二、“攘外”首先,“攘外必先安内”我们要知道如何使DLL拥有一个能被调用的API函数。很简单,我不想多说,就是在Module里面写一个Public的Function接下来,我们就可以“攘外”了那么,先来介绍

3、一下编译技术编译器的编译技术可以分为Native Compile(自然编译)与P-Code Compile(伪编译)两种。 自然编译是编译器将高级语言转换为汇编代码,并经链接生成EXE程序的过程。 伪编译是编译器将高级语言转换为某种编码后,将能解释、执行此编码的一段程序一同链接,生成EXE程序。 伪代码P-Code,最早应该叫做Pascal-Code,其名称起源于一个Pascal编译器使用的“中间代码”编译技术。现在一般作为Pseudo-code(伪代码)或Packed-code(压缩代码)简称。采用伪代码编译时,每个VB源文件(包括.frm(窗体)、.bas(标准模块)、.cls(类模块)经

4、VB IDE编译后各自生成相应的.obj文件,交链接程序Link.exe生成伪编译的可执行文件(EXE、DLL、OCX等)。 而用自然编译时,每个VB源文件由C2.exe编译生成汇编代码,生成相应的obj文件,再由Link.exe链接成为完整的可执行文件。别看编译只有两步,其实,有大玄奥在里头。MicroSoft公司,可以说是十分的狡猾,因为在默认的方式下,VB编译的两步使用到的命令行都是他们设定好的,所以,跳过了很多有用的部分,包括我们今天讲的输出函数部分。如果在LINK的时候添加EXPORT选项,实际上是可以输出函数的。但是,在VBLinkd的命令行中将这个选项部分跳过了。而且过分的是:V

5、B在构造EXE后会将编译出来的OBJ文件删除,这样就无法手动通过Link来创建我们需要的DLL了。根据前人的方法,加上自己修改,用一个比较龌龊的方法来变通打开“VB6.0”,新建一个“标准EXE 工程”,把Form移除,添加一个Module在模块里输入一下代码: Sub Main() If Command = Then Exit Sub 命令行不为空 Dim intCMD As Integer Clipboard.Clear 清空剪贴板 Clipboard.SetText Command 将命令行复制到剪贴板 去掉 复制到剪贴板 LINK 速度会快些 intCMD = MsgBox(编译命令行

6、如下: & vbCrLf & Command & vbCrLf & 点击“是”继续编译,点击“否”编译DLL,点击“取消”中断编译, vbYesNoCancel + vbInformation, 编译) Select Case intCMD Case vbYes 选择“是” 继续编译 Shell VBLINK & Command, vbHide Case vbNo 选择“否” Dim FuncName As String, cmd As String, l As Integer FuncName = InputBox(请输入 输出的函数名称(对个函数 请用英文半角分号“;”分开), _ 非法操

7、作出错我不管) 模块内能编译出来的输出函数名 修改命令行 If FuncName = Then Exit Sub Do FuncName = Replace(FuncName, ;, /EXPORT:) Loop Until 0 = InStr(FuncName, ;) l = InStr(Command, vbaS) cmd = Left(Command, l + 4) & /EXPORT: & FuncName & Right(Command, Len(Command) - l - 3) Shell VBLINK & cmd, vbHide Case vbCancel 中断编译 Exit

8、Sub End Select End Sub 大家可能看出来了, 没错 就是在每个输出函数前加/EXPORT: 生成MyLink.exe,复制到VB的安装文件夹里,把安装文件夹的LINK.EXE改成VBLink.exe,把我们写的MyLink.exe改成Link.exe 到这一步,你应该懂了吧。 来做个示例我新建了一个ActiveX DLL的工程,添加了一个Module,写了一个Public的Function,如下Public Function Add(ByVal A As Long) As Long Add = A + AEnd Function生成“E:Math.dll”被截获的命令行(V

9、B默认命令行)如下:E:Class1.OBJ E:Module1.OBJ E:Math.OBJ C:Program FilesMicrosoft Visual StudioVB98VBAEXE6.LIB /ENTRY:_vbaS /OUT:E:Math.dll /BASE:0x /SUBSYSTEM:WINDOWS,4.0 /VERSION:1.0 /DLL /INCREMENTAL:NO /OPT:REF /MERGE:.rdata=.text /IGNORE:4078修改后命令行(修改后的命令行)如下:E:Class1.OBJ E:Module1.OBJ E:Math.OBJ C:Prog

10、ram FilesMicrosoft Visual StudioVB98VBAEXE6.LIB /ENTRY:_vbaS /EXPORT:Add /OUT:E:Math.dll /BASE:0x /SUBSYSTEM:WINDOWS,4.0 /VERSION:1.0 /DLL /INCREMENTAL:NO /OPT:REF /MERGE:.rdata=.text /IGNORE:4078 大家对比两行命令可以发现在/ENTRY:_vbaS后面,我增加了/EXPORT:Add,这就是关键所在现在,我又新建了一个EXE工程,加一个VB API声明,代码部分:Private Declare Function Add Lib E:Math.dll (ByVal A As Long) As Long API声明Private Sub Form_Load() MsgBox Add(2)End Sub看到效果没,成功了吧至于String型么,投递时StrConv(String,vbUnicode

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论