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

简介:
VB无所不能之五:建立“标准”DLL动态链接库文件(1)
 
——作者:钟声
 
 
        动态链接库经常被认为是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文件了。
 
       好,今天先写到这,明天再写后半部分。
 
      后半部分已经写完: http://useway.blog.51cto.com/736087/295700




 本文转自 useway 51CTO博客,原文链接:http://blog.51cto.com/useway/295201,如需转载请自行联系原作者

相关文章
|
4月前
|
C#
Delphi可不可以制作出像c#那样的dll类库?
在Delphi中,创建DLL项目(如dll.dpr)并定义一个类TMyCls后,在另一个项目(如test.dpr)中可以引入此DLL并直接实例化和调用类的方法。然而,Delphi目前主要支持两种DLL形式:动态链接库(需显式声明exports,仅支持函数调用)和ActiveX DLL(需定义IDL接口)。这两种方式都较为繁琐。相比之下,C# 的DLL类库更为便捷,编写并编译后即可在其他项目中直接使用。
|
9月前
|
搜索推荐 IDE 数据库连接
创建你的第一个Visual Basic程序:步步为营
【4月更文挑战第27天】探索Visual Basic编程,从安装Visual Studio开始,创建首个"HelloWorldApp"。在Form Designer中布局界面,添加Label和Button,设置属性。编写代码实现Button点击显示问候语。运行并调试程序,逐步学习更多控件和VB.NET高级概念,提升编程技能。享受编程旅程,创造无限可能!
72 0
|
存储 编译器 C++
《C++避坑神器·十五》动态库只有dll文件,没有.lib文件时动态调用dll的中类和成员函数
《C++避坑神器·十五》动态库只有dll文件,没有.lib文件时动态调用dll的中类和成员函数
523 0
|
NoSQL 编译器 vr&ar
嵌入式(十二)——库文件及静态库与动态库的制作与使用(附练习)
嵌入式(十二)——库文件及静态库与动态库的制作与使用(附练习)
246 0
嵌入式(十二)——库文件及静态库与动态库的制作与使用(附练习)
|
Linux 图形学 Android开发
Unity与 SO 交互 ☀️| .so文件(动态链接库 ) 基础知识科普
📢前言 因为最近用到了so文件相关内容 所以来学习一下.so文件相关的知识,正好来写博客也当是记录并分享一些知识 最终目的是在Unity中与so文件进行交互处理,但是本篇文章需要先对so文件有一个基本的认识 这样在后面交互流程中也能 加深一点理解
|
Linux 程序员 Windows
软件基本功:linux/windows的头文件互相包含,大哥你这是什么创新?
软件基本功:linux/windows的头文件互相包含,大哥你这是什么创新?
121 0
请使用Qt自带的宏来区分操作系统跨平台源码(★firecat推荐★)
请使用Qt自带的宏来区分操作系统跨平台源码(★firecat推荐★)
240 0
|
API C# C++
C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件
原文:C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件       这两天忙着把框架改为支持加载C++和Delphi的插件,来不及更新blog了。      原来的写的框架只支持c#插件,这个好做,直接用c#的反射功能便可。
1130 0