制作vb dll的总结

前段时间,同学接了一个项目,在网页上显示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, 函数输出

QQ594363468

 

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中制作标准DLLAdd-Ins了,而且在网上也有对于写VB创建能作为输出函数的DLL的相关文章。今天,我再来讲讲这个话题——VB创建能作为输出函数的DLL

 

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

 

首先,“攘外必先安内”

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

 

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

 

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

 

编译器的编译技术可以分为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生成伪编译的可执行文件(EXEDLLOCX等)。

    而用自然编译时,每个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,写了一个PublicFunction,如下

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的值...修改...嘿嘿...我什么都没说

 

如果遇到不懂的地方...就来问我啊...QQ594363468

 

 

 

 

 

 

 

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

注册之后即可使用。

查看ProggId 的方法:

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

 

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[ASP,VB] - 利用ASP调用API COM接口实现开关机

来源:http://www.111cn.net/asp/3/35f5b04c0c9f40c9f03a1b56d641ac3f.htm 服务器脚本要控制些开关机命令模式的知都要调用win api接口来实现了,下面我们来看一个asp调用com实例开关机功能吧。ASP通过这个组件调用系统API,然后按照不同的重启和…

导致oracle 控制文件坏,异常断电导致ORACLE控制文件等受到破坏的处理

故障现象:客户某台WINDOWS服务器掉电,ORACLE数据库STARTUP提示控制文件CONTROL01.CTL、CONTROL02.CTL被破坏。一、处理控制文件异常故障方法:直接拷贝CONTROL0一、处理控制文件异常故障二、尝试启动SQL> startup;ORACLE例程已经启动。Tota…

softmax ce loss_手写softmax和cross entropy

import 解释下给定的数据,x假设是fc layer的输出,可以看到这里x是(3,3)的,也就是batch_size3,n_classes3。但是label给出了三个数,取值是0,1,因此这里必须要将label先变成one_hot的形式才能在cr…

ListView中加入Button后,Button的点击事件和ListView的点击事件冲突

1.在ItemView配置的xml文件里的根节点加入属性android:descendantFocusability"blocksDescendants" 2.在要加入事件的控件上加入android:focusable"false

asp.net Session丢失问题

首先了解一下asp.net Session的实现asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。原因1&#…

kafka php 0.8,php5.6 centos7 kafka0.8.1

# 首先在保证php已经正确安装的情况下:# 安装jdk(本人安装jdk7) 和 scala 因为kafka基于scala开发# 之后解压安装包 进入 运行命令 ./gradlew jar # 会下载一些包 # 首先运行 zookeeper ./bin/zookeeper-server-start.sh ./config/zookeeper.properties# 之后运行k…

day02(下)_运算符

首先了解java运算符的优先级和结合性: 常用转义字符表: 示例1 取余/字符串/转义字符: class operator1 {public static void main(String[] args){//取余System.out.println(-1%5);//-1System.out.println(1%-5);//1与左边的操作数同号System.out.println(3.1%2.5);//字符串:字…

activity 生命周期_如何理解安卓activity的生命周期(on-create篇)?

个人认为用类比的方式来学习新事物比较容易接受。我这里用蝴蝶的一生来做比喻。OnCreate阶段就像是蝴蝶的幼虫刚出卵里孵化出来,蝴蝶的一生只可能出生一次,oncreate只能被创建一次。蝴蝶刚出生的时候还不是蝴蝶,而是一只毛毛虫一样的东西&…

【十大经典数据挖掘算法】k-means

【十大经典数据挖掘算法】系列 C4.5K-MeansSVMAprioriEMPageRankAdaBoostkNNNave BayesCART1. 引言 k-means与kNN虽然都是以k打头,但却是两类算法——kNN为监督学习中的分类算法,而k-means则是非监督学习中的聚类算法;二者相同之处&#xff1…

php strstr 效率,PHP中的stristr(),strstr(),strpos()速度比较

测速代码:function getmicrotime(){list($usec, $sec) explode(" ",microtime());return ((float)$usec (float)$sec);}$time_start getmicrotime();$string"xxxddxx";$find"d";for ($i0;$i<300000;$i){if (stristr($string,$find))//if (…

ajax获取数据用弹窗显示_Vue之 点击返回弹出推荐商品弹窗

阅读本文约需要5分钟大家好&#xff0c;我是你们的导师&#xff0c;我每天都会在这里给大家分享一些干货内容(当然了&#xff0c;周末也要允许老师休息一下哈)。上次老师跟大家分享了VUE 之 v-on指令的知识&#xff0c;今天跟大家分享下Vue之 点击返回弹出推荐商品弹窗的知识。…

Navicat 编辑器自动完成代码功能讲解

2019独角兽企业重金招聘Python工程师标准>>> Navicat 提供广泛的编辑器高级功能&#xff0c;例如&#xff1a;编辑代码功能、智能自动完成代码、设置 SQL 格式及更多。本教程将介绍关于自动完成代码的操作。 Navicat下载地址&#xff1a;http://www.formysql.com/xi…

win2008的搜索功能就是个鸡肋

搜索文件名做得还好&#xff0c;搜索文本关键字连98都不如。 还有远程功能&#xff0c;一个终端登陆了&#xff0c;本地马上就注销了&#xff0c;还比不上WIN03转载于:https://www.cnblogs.com/LCX/archive/2010/04/19/1715698.html

DNN Experience

DNN Experience DNN编译导致异常。在做模块开发时&#xff0c;引用DNN原始Dll文件时&#xff0c;设置为不覆盖原有文件。不然容易导错误异常。 在开发DNN Schedule 或其他扩展功能时。因为此时不在站点的页面文件下&#xff0c;不能直接引用DNN命名空间下的很多全局变量。会造成…

oracle 导入excel时间格式,将.xls或者.excel格式的数据导入到Oracle中

本文档来自:[url]http://hi.baidu.com/wangbin_529/blog/item/6191d74b06b83c2b09f7efbd.html[/url]1、将xls格式另存为cvs(逗号隔开)。例如&#xff1a;左边为xls的表格;右边为转换成csv的文档,保存csv文档到E盘。[img]http://hiphotos.baidu.com/smile_%B1%B4/pic/item/a536c…

com 组件调用不起来_AwesomeGithub组件化探索之旅

阅读前请点击右上角“关注”&#xff0c;每天免费获取Android知识解析及面试解答。Android架构解析&#xff0c;只做职场干货&#xff0c;完全免费分享&#xff01;之前一直听说过组件化开发&#xff0c;而且面试也有这方面的提问&#xff0c;但都未曾有涉及具体的项目。所以就…

将团队迁移到可视化项目管理软件

自2000年代中期&#xff0c;“Scrum”项目管理&#xff08;PM&#xff09;一直统治着软件开发方法。它的迭代结构、频繁会议和清晰的层次结构使其成为受频繁变化的客户需求和条件管制的行业的明显选择。因此&#xff0c;大多数团队习惯基于 Scrum项目管理应用管理开发过程。 \\…

一步一步学Silverlight 2系列(3):界面布局_转载

概述 Silverlight 2 Beta 1版本发布了&#xff0c;无论从Runtime还是Tools都给我们带来了很多的惊喜&#xff0c;如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython&#xff0c;对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlig…

网址

Html5 &#xff1a; http://fff.cmiscm.com/#!/main 20个案例让你了解用HTML5可以做出什么作品转载于:https://www.cnblogs.com/wangdyy/archive/2013/01/21/2869545.html

Spring学习11-Spring管理各种数据源

Spring 完全可以不依赖容器,自己管理数据源,但是却依赖第三方的开源的数据源管理框架. Spring在第三方依赖包中包含了两个数据源的实现类包&#xff0c;其一是Apache的DBCP&#xff0c;其二是 C3P0。可以在Spring配置文件中利用这两者中任何一个配置数据源。 1、DBCP数据源…