前段时间,同学接了一个项目,在网页上显示autoCAD的图。在做项目的过程中,遇到一个棘手的问题。在使用vb语言开发的第三方插件中,有一个函数是地址传值的方式传参。想在js中调用该函数,但是,js不支持类似指针的概念。后来在网上百度,发现可以使用dll封装的方式解决该问题。即把这个ocx(插件)用Activex封装一层。 JavaScript –> ActiveX –> 第三方ocx。  做一个ActiveX来调用第三方ocx,给它来个引用传递就行了。详见:http://blog.sina.com.cn/s/blog_704d0c1c0100mft7.html

在制作该dll的过程中,遇到了很多问题。开发环境为vb。首先打开vb,选择新建AvtiveX dll。在出来的界面中编写代码。

dll是一个函数库,他不能独立运行,没有main函数。但是dll有一个dllMain函数,该该函数即为该dll的入口函数。如果缺少该入口函数,那么该dll在加载的时候即会报”找不到入口点

dllRegisterServer“的错误。

Public Function DllMain(ByVal hInst As Long, ByVal fdwReason As Long, ByVal lpvReserved As Long) As Boolean
Select Case fdwReason
Case DLL_PROCESS_DETACH
Case DLL_PROCESS_ATTACH
DllMain = True
Case DLL_THREAD_ATTACH
Case DLL_THREAD_DETACH
End Select
End Function

在添加了dllMain入口函数后,又出现了问题,即在调用dll中的函数时在js报“对象不支持此属性或方法的错误”。经过一番调试,找到了错误所在,DllMain函数没有处理线程加载的情况。修改DllMain函数

Public Function DllMain(ByVal hInst As Long, ByVal fdwReason As Long, ByVal lpvReserved As Long) As Boolean
Select Case fdwReason
Case DLL_PROCESS_DETACH
Case DLL_PROCESS_ATTACH
DllMain = True
Case DLL_THREAD_ATTACH

DllMain=True

Case DLL_THREAD_DETACH
End Select
End Function

至于dll文件的编译,参考:

转帖] VB创建能作为输出函数的DLL

DLL, 函数, 输出

QQ:594363468

DLL文件(即Dynamic Link Library,动态链接库)作为系统的一个重要的组成部分,除了一些小程序外,我们几乎能在所有软件中看到DLL文件,而且如果使用VB写的一些收费软件有一个DLL代替关键函数,想破解都难了。因此,我们就有必要来学习如何编写DLL。

对于很多初学VB的网友来说,VB是一门比较简单的语言,而MicroSoft公司在开发VB时,也增添了很多功能。所以,我个人觉得VB除了部分不足之外还是挺不错的,当然我指的不足是主要是VB运行库方面的问题。

对于很多VB初学者来说,都会有这么一个错误的认识——VB中创建的DLL只是COM组件,无法作为输出函数的DLL(即VB写的DLL是不完整的DLL)。然而,对于一些VB的高手来说,他们就知道应该如何写具有返回值的DLL。其实,国外早已经有人做出了在VB中制作标准DLL的Add-Ins了,而且在网上也有对于写VB创建能作为输出函数的DLL的相关文章。今天,我再来讲讲这个话题——VB创建能作为输出函数的DLL

对于VB编写DLL,按照我的经验,主要分为两步:一、“安内”,二、“攘外”

首先,“攘外必先安内”

我们要知道如何使DLL拥有一个能被调用的API函数。很简单,我不想多说,就是在Module里面写一个Public的Function

接下来,我们就可以“攘外”了

那么,先来介绍一下编译技术

编译器的编译技术可以分为Native Compile(自然编译)与P-Code Compile(伪编译)两种。

自然编译是编译器将高级语言转换为汇编代码,并经链接生成EXE程序的过程。

伪编译是编译器将高级语言转换为某种编码后,将能解释、执行此编码的一段程序一同链接,生成EXE程序。

伪代码P-Code,最早应该叫做Pascal-Code,其名称起源于一个Pascal编译器使用的“中间代码”编译技术。现在一般作为Pseudo-code(伪代码)或Packed-code(压缩代码)简称。

采用伪代码编译时,每个VB源文件(包括.frm(窗体)、.bas(标准模块)、.cls(类模块))经VB IDE编译后各自生成相应的.obj文件,交链接程序Link.exe生成伪编译的可执行文件(EXE、DLL、OCX等)。

而用自然编译时,每个VB源文件由C2.exe编译生成汇编代码,生成相应的obj文件,再由Link.exe链接成为完整的可执行文件。

别看编译只有两步,其实,有大玄奥在里头。。。

MicroSoft公司,可以说是十分的狡猾,因为在默认的方式下,VB编译的两步使用到的命令行都是他们设定好的,所以,跳过了很多有用的部分,包括我们今天讲的输出函数部分。如果在LINK的时候添加EXPORT选项,实际上是可以输出函数的。但是,在VBLinkd的命令行中将这个选项部分跳过了。而且过分的是:VB在构造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("编译命令行如下:" & 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("请输入 输出的函数名称(对个函数 请用英文半角分号“;”分开)", _

"非法操作出错我不管") '模块内能编译出来的输出函数名

'修改命令行

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 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 + A

End Function

生成“E:\Math.dll”

被截获的命令行(VB默认命令行)如下:

"E:\Class1.OBJ" "E:\Module1.OBJ" "E:\Math.OBJ" "C:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /OUT:"E:\Math.dll" /BASE:0x11000000 /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:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:Add /OUT:"E:\Math.dll" /BASE:0x11000000 /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 )返回时StrConv(String,vbFromUnicode )

学了这个,大家不知道有没有什么心得呢,当然这个要看个人悟性的问题。师父领进门,修行在个人嘛,何况还是被我这种半调子的菜鸟教呢

这个...天好蓝...水好清...外挂...Winsock...API...DLL...监视API的值...修改...嘿嘿...我什么都没说

如果遇到不懂的地方...就来问我啊...QQ:594363468

dll的注册:在cmd中执行Regsvr32 *.dll

注册之后即可使用。

查看ProggId 的方法:

在网上下载一个叫OLEVIEW的软件,在其中查找你的dll注册信息。一般来讲,你的dll应该在Automation  Objects中,名字和你做dll时的工程名一样

转载于:https://www.cnblogs.com/elnino/archive/2013/01/13/2858635.html

制作vb dll的总结相关推荐

  1. vb计算机怎么制作,教你如何制作VB的PCode调试器 -电脑资料

    P-Code简介 术语P-Code既不是一个新名词也不是Microsoft的发明,P-Code只是简单地被解释执行的伪指令, MSVBVM50.DLL MSVBVM60.DLL 文件名称清晰的表明是M ...

  2. vb安装向导已经在该计算机上运行,制作VB安装程序问答(一)

    制作VB安装程序问答(一) 制作安装程序往往是程序设计的最后一步,同时也是重要的一步,因为运行安装程序往往是用户的第一个操作.有不少读者询问这方面的问题,<答疑解惑>将分两期介绍一些制作V ...

  3. VB传统DLL生成插件安装版 VB DLL LINK .exe

    VB传统DLL生成插件安装版 VB DLL LINK .exe 用VB生成标准dll,让任何程序引用. ################################################ ...

  4. C++ 制作动态链接库.dll及.dll使用

    声明:IDE是Visual studio -version 2022 其制作的动态链接库dll里面实现简单的加减法,提供给其他项目调用. 一.动态链接库(DLL)创建 1.创建DLL工程 流程:文件 ...

  5. vb制作可输出函数的通用DLL---VB_DLL_Link用法

    vb制作可输出函数的通用DLL---VB_DLL_Link用法 论坛越来越多人关注dll,特分享一下vb制作可输出函数的通用DLL---VB_DLL_Link用法 大家知道,VB6只能制作Active ...

  6. 怎样用VB编写.DLL动态链接库文件 1

    怎样用VB编写.DLL动态链接库文件 编号: QA000507     建立日期: 1999年2月10日 最后修改日期: 2006年8月13日 所属类别: Visual Basic - 其他方面   ...

  7. VB静态调用与动态调用dll详解

    [[请注意]]:在以下语法格式中,请注意 [函数名] 的[大小写]!!! 静态与动态比较: 静态调用简单,动态调用麻烦:静态调用占用资源多,动态调用占用资源少:正所谓鱼和熊掌不可兼得. 静态调用定义: ...

  8. 【VB技巧】VB静态调用与动态调用dll详解

    [[请注意]]:在以下语法格式中,请注意 [函数名] 的[大小写]!!!静态与动态比较:静态调用简单,动态调用麻烦:静态调用占用资源多,动态调用占用资源少:正所谓鱼和熊掌不可兼得.静态调用定义:就是常 ...

  9. C++动态链接库dll及静态链接库lib制作及使用教程

    现需将C++函数封装成动态链接库dll,网上看了好多博客教程,说的都不够全面,现提供一个很有用的视频,亲测有效,启发很大,附上链接: 视频网址 下面自己根据视频记录下制作动态链接库dll过程,防止忘记 ...

最新文章

  1. http传输json文件_python
  2. php 复选框 单选 全选,复选框全选/不全选,选择结果提交
  3. Flex embed XML and Icon
  4. .net得到ip(引)
  5. 移动互联网+智能运营体系搭建=你家有金矿啊!
  6. python scatter 简书_写给 Pythonist 的 Spacemacs 入门指北
  7. Visual studio 2005 恢復默認設置的方法
  8. Kotlin入门(19)Android的基础布局
  9. Ubuntu下安装-有道词典
  10. [转载]Dorado中DataTable使用技巧汇总
  11. WSUS提示“内容文件下载失败”的修复方法
  12. 怎样运行python_怎样运行python
  13. SqlServer2012下载+安装+启动(资源+密钥)
  14. JAVA爬虫挖取CSDN博客文章(续)
  15. 腾讯元老上市公司CTO赚够钱后辞职,到安徽隐居,每天对着200亩地发呆
  16. RRD原理(转载的)
  17. android exchange同步日程,OPPO手机的日历怎么同步Exchange邮箱日程的方法
  18. 摄影构图学83年绝版_学摄影练实操 2020年昆明市统战系统宣传工作业务培训班继续进行...
  19. 本科课程【数据结构与算法】实验1——线性表的顺序表示及插入、删除操作(C++实现)
  20. 支持向量机原理(一) 线性支持向量机

热门文章

  1. 有些小银行利息高,非常受欢迎,为什么不在全国开网点?
  2. 数据管理 - 每天5分钟玩转 Docker 容器技术(147)
  3. 为什么别人有微粒贷,而你没有?
  4. 台湾印象之一:金马奖之夜
  5. 线性汇编总结和函数说明
  6. python语句解释_深入理解python with 语句
  7. qt做的接收串口数据并显示曲线_QT无人机地面站设计与制作
  8. python 多个列表合并_Python对两个有序列表进行合并和排序的例子
  9. c语言中bluetooth函数,C语言中的低功耗蓝牙-使用Bluez创建GATT服务器
  10. 工业机器人工具中心点标定的意义_一种利用平面标定板的机器人工具中心点标定方法_2015108676182_说明书_专利查询_专利网_钻瓜专利网...