VB6到底能不能做被其他程序直接调用的标准的DLL动态库

ekeo 2013-10-05 06:32:18
VB6到底能不能做被其他程序直接调用的标准的DLL动态库,看到网上有这么一篇文章,到底有没有用?

VB无所不能之五:建立“标准”DLL动态链接库文件

动态链接库经常被认为是VC或者Dephi的专利,DLL文件可以将你编写的函数动态的发布,并可以被其他程序很方便的调用。
有朋友会问了,在VB里面不是有一个叫做“ActiveX DLL”的项目类型吗,生成的文件最终也是“DLL”文件啊?
没错,最终文件确实是DLL文件,但其实严格意义上VB建立的DLL并不是像VC一样的动态链接库,VB建立的是ActiveX DLL,不能像kernel32.dll”那样通过“Declare Function .....”来调用的。
本文中将详细讲解用VB生成一个DLL动态链接库文件的方法,请注意,本文将详细讲述生成一个像VC的动态链接库文件,并且调用方法也是用“Declare Function .....”来调用。
好,那么我们来建立一个DLL吧。

原理讲述:
VB在编译文件的时候,采取的是两次编译的方法:
编译第一步,首先是调用c2.exe产生OBJ文件
“c2.exe”这个文件在“C:\Program Files\Microsoft Visual Studio\VB98”目录中,大家可以去找找看。“c2.exe”就是VB在编译的时候调用的命令。
编译第二步,调用Link.exe对OBJ文件进行链接
“link.exe”也在那个文件夹中,这个文件和上面的那个文件是一样的,都是一个命令行工具。用过命令行工具的朋友肯定知道,命令行工具一般都可以制定相应参数的,对于“link.exe”也一样,他也可以通过改变参数来调整其编译链接后的结果。
那么,其参数如下:
usage: LINK [options] [files] [@commandfile]
options:
/ALIGN:#
/BASE:{address|@filename,key}
/COMMENT:comment
/DEBUG
/DEBUGTYPE:{CV|COFF}
/DEF:filename
/DEFAULTLIB:library
/DELAY:{NOBIND|UNLOAD}
/DELAYLOAD:dll
/DLL
/DRIVER[:{UPONLY|WDM}]
/ENTRY:symbol
/EXETYPE:DYNAMIC
/EXPORT:symbol
/FIXED[:NO]
/FORCE[:{MULTIPLE|UNRESOLVED}]
/GPSIZE:#
/HEAP:reserve[,commit]
/IMPLIB:filename
/INCLUDE:symbol
/INCREMENTAL:{YES|NO}
/LARGEADDRESSAWARE[:NO]
/LIBPATH:dir
/LINK50COMPAT
/MACHINE:{ALPHA|ARM|IX86|MIPS|MIPS16|MIPSR41XX|PPC|SH3|S
/MAP[:filename]
/MAPINFO:{EXPORTS|FIXUPS|LINES}
/MERGE:from=to
/NODEFAULTLIB[:library]
/NOENTRY
/NOLOGO
/OPT:{ICF[,iterations]|NOICF|NOREF|NOWIN98|REF|WIN98}
/ORDER:@filename
/OUT:filename
/PDB:{filename|NONE}
/PDBTYPE:{CON[SOLIDATE]|SEPT[YPES]}
/PROFILE
/RELEASE
/SECTION:name,[E][R][W][S][D][K][L][P][X]
/STACK:reserve[,commit]
/STUB:filename
/SUBSYSTEM:{NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX}[,#[.
/SWAPRUN:{CD|NET}
/VERBOSE[:LIB]
/VERSION:#[.#]
/VXD
/WARN[:warninglevel]
/WINDOWSCE:{CONVERT|EMULATION}
/WS:AGGRESSIVE

显然有点茫然,那么多参数啊?不用茫然,我们只要关心一个参数即可——“/EXPORT”。
加入这个参数,就是让你生成的DLL具有输出函数的功能的选项!!呵呵,明白了吧?
VB在编译后直接链接时,并没有加入这个选项,所以,用VB提供的编译菜单编译时根本就不能输出函数。
那么怎么办??还需要问我吗??当然是手工编译VB工程了!!
呵呵,那就手工编译吧!!哈哈哈,等等吧先,你看好了,每次编译的时候我们都看不到生成的那个OBJ文件,怎么调用Link.exe进行链接啊??!!
是的,那么我们只有两个选择,要么研究一下c2.exe怎么使用,要么就在其删除OBJ文件前将其截获。
研究c2.exe的使用方法我觉得就省了吧,当然有兴趣的朋友可以去研究,我就不想研究了,现在专攻截获这个问题。
如何截获,呵呵,很简单,——把link.exe改一下名,让系统找不到link.exe这样就直接可以得到OBJ文件了。
上面讲到,如何通过特殊方法获取OBJ文件,下面我们继续讲如何进行编译连接。
一、首先我们看看这种特殊方法的操作准备步骤:
步骤一:建立一个假的“Link.exe”;
建立一个新的项目,在那个项目中建立一个“Form”,然后,在“Form”中加入如下代码:
Sub Form_Load()
MsgBox "现在可以拷贝OBJ文件了!!"
End
End Sub

编译为:Link.exe
步骤二:将“C:\Program Files\Microsoft Visual Studio\VB98\Link.exe”改名为“Link2.exe”;
步骤三:将假的那个Link.exe复制到“C:\Program Files\Microsoft Visual Studio\VB98\”中;
二、建立一个ActiveX DLL
步骤一:建立一个新项目,选择“ActiveX DLL”,然后建立一个“Module”在代码中加入如下代码:
Function fun1(ByVal a As Long, ByVal b As Long) As Long
fun1 = a + b
End Function

Function fun2() As Long
fun2 = 1
End Function

步骤二:建立一个空的“Class” ;
步骤三:用VB菜单编译;
步骤四:复制出OBJ文件;
当编译的时候会弹出一个对话框:

步骤五:迅速将这个文件夹中新出现的三个文件复制出来;
三个文件分别为:Class1.OBJ,Module1.OBJ,Project1.OBJ
将这三个文件复制到:“c:\abc”这个文件夹。
三、进行编译连接工作
步骤一:建立一个Bat文件,内容如下:
cd c:\Program Files\Microsoft Visual Studio\VB98
link2.exe "c:\abc\Class1.obj" "c:\abc\Module1.obj" "c:\abc\Project1.obj" "d:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mm /EXPORT:mathadd /EXPORT:rit /OUT:"c:\abc\ProjectOK.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS
步骤二:将这个bat文件复制到“C:\abc”
步骤三:在c:\abc中执行bat文件,生成DLL文件在文件夹中
四、好了,现在我们测试一下
建立一个新的项目,再建立一个“Form”,加入两个按钮,在“Form”中粘贴如下代码:
Declare Function fun1 Lib "ProjectOK.dll" (ByVal a As Long, ByVal b As Long) As Long
Declare Function fun2 Lib "ProjectOK.dll" () As Long
Sub Command1_Click()
MsgBox fun1(100, 200)
End Sub
Sub Command2_Click()
MsgBox fun2()
End Sub
然后,测试一下,呵呵,成功!
...全文
465 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
littset50 2013-10-07
  • 打赏
  • 举报
回复
不能的。 这个问题已经讨论了十多年了,建议大家放弃吧。 除非你是比尔盖茨。
舉杯邀明月 2013-10-06
  • 打赏
  • 举报
回复
引用 6 楼 u012285055 的回复:
为什么我按照上面的资料介绍的,最终将生成不了DLL文件,具体错误信息如下:
你看看这个贴子吧: http://bbs.csdn.net/topics/390589259 你们是相同的问题。
ekeo 2013-10-06
  • 打赏
  • 举报
回复
为什么我按照上面的资料介绍的,最终将生成不了DLL文件,具体错误信息如下: C:\Program Files\Microsoft Visual Studio\VB98>link2.exe "c:\abc\Class1.OBJ" "c:\ abc\Module1.OBJ" "c:\abc\Project1.OBJ " "C:\Program Files\Microsoft Visual Studi o\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mm /EXPORT:mathadd /EXPORT:rit /OUT:"c :\abc\ProjectOK.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS Microsoft (R) Incremental Linker Version 6.00.8447 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. LINK2 : warning LNK4044: unrecognized option "VERS"; ignored Project1.OBJ : warning LNK4104: export of symbol "DllUnregisterServer" should be PRIVATE Project1.OBJ : warning LNK4104: export of symbol "DllGetClassObject" should be P RIVATE Project1.OBJ : warning LNK4104: export of symbol "DllRegisterServer" should be P RIVATE Project1.OBJ : warning LNK4104: export of symbol "DllCanUnloadNow" should be PRI VATE Project1.OBJ : error LNK2001: unresolved external symbol mathadd Project1.OBJ : error LNK2001: unresolved external symbol mm Project1.OBJ : error LNK2001: unresolved external symbol rit c:\abc\ProjectOK.lib : fatal error LNK1120: 3 unresolved externals LINK2 : fatal error LNK1141: failure during build of exports file
ekeo 2013-10-06
  • 打赏
  • 举报
回复
为什么我按照上面的资料介绍的,最终将生成不了DLL文件,具体错误信息如下:
ekeo 2013-10-06
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
这就是传说中的VB标准dll的生成方法,但那又何必呢?使用c来写运行效率更高,也方便
我就会VB,VC不会,哈哈
ekeo 2013-10-06
  • 打赏
  • 举报
回复
引用 3 楼 Chen8013 的回复:
这样做出来的,其实还是 ActiveX DLL 。 你看它不是还有一个Class文件在工程中吗………… 如果你把Class文件移除,则不能编译。 还有,他这种做法,不方便操作的。 我这几天正在弄一个工具,让VB6.0做出来的DLL,不再是 ActiveX DLL 了。
大师们就是大师们,真是高山仰止呀,我什么时候才能也有点成就感呢
舉杯邀明月 2013-10-05
  • 打赏
  • 举报
回复
这样做出来的,其实还是 ActiveX DLL 。 你看它不是还有一个Class文件在工程中吗………… 如果你把Class文件移除,则不能编译。 还有,他这种做法,不方便操作的。 我这几天正在弄一个工具,让VB6.0做出来的DLL,不再是 ActiveX DLL 了。
raindrop110 2013-10-05
  • 打赏
  • 举报
回复
vb 可以生成 标准的 DLL,其他可访问DLL的开发工具访问的DLL,但在.net时代,vb6 生成的DLL访问时,如果有变化,你所有的引用要重新做一遍。除用API的方式直接访问。
worldy 2013-10-05
  • 打赏
  • 举报
回复
这就是传说中的VB标准dll的生成方法,但那又何必呢?使用c来写运行效率更高,也方便

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧