技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 985|回复: 12
收起左侧

【VB6】使用VB6写“标准DLL”

[复制链接]

995

主题

2207

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
197
威望
261 点
宅币
16461 个
贡献
32335 次
宅之契约
0 份
在线时间
1565 小时
注册时间
2014-1-26
发表于 2017-4-6 08:38:33 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
为啥要加双引号呢?因为DLL就是DLL,没啥标准不标准的说法。这里只不过有些人认为,带COM组建的DLL就不是“标准DLL”。
方法很简单,写个假的链接器,使用它来修改链接命令,然后插入想要导出的函数就可以了。
其实这就是一个简单的编译原理的知识,或者说是“链接器原理”。献给所有喜爱编程的初学者。

VB6导出“标准DLL”(也就是不带COM类的DLL)的方法无非就是把链接器的参数改一下就好。VB6本身生成的obj和VC6的格式差不多,因为都是nasm所说的“win32”格式,所以其实VB6使用的链接器和VC6的是一样的。链接器就负责将一堆obj或者lib组合起来,生成dll或者exe。所以VB6也能生成“标准DLL”。
因为VB6默认没有“标准DLL”工程,所以大家都以为VB6不能生成“标准DLL”。但其实我们自己修改VB6的链接器参数就可以实现生成“标准”DLL。
这个的解决方案很简单。自己写一个假的链接器,用于修改命令行参数,然后把修改了的命令行参数传达给真正的链接器即可。假的链接器的写法也可以很随意。反正实现了功能就好。

我这边写了一个。它的规则是:当你的工程里面有一个叫“DLL_Module”的模块(或frm、res、cls等都会被识别)的时候,就会把当前工程认定为DLL工程,然后查找工程目录下的Dll_Module.def(模块定义文件)。如果你没有这个文件的话,它就会提示你创建这个文件(它会创建给你并自动帮你用记事本打开这个文件)。

PseudoLinker(伪链接器)下载(包含工程和源码,还有编译好的BIN):
pseudolinker.zip (10.34 KB, 下载次数: 34)

本帖被以下淘专辑推荐:

0

主题

3

帖子

23

积分

用户组: 初·技术宅

UID
2307
精华
0
威望
0 点
宅币
20 个
贡献
0 次
宅之契约
0 份
在线时间
2 小时
注册时间
2017-3-7
发表于 2017-4-6 08:58:53 | 显示全部楼层
这个够详细 先顶 再试试

85

主题

263

帖子

3513

积分

用户组: 管理员

No. 418

UID
418
精华
13
威望
52 点
宅币
1969 个
贡献
1112 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
发表于 2017-4-6 13:30:15 | 显示全部楼层
不过话说回来,我们为啥要用VB6写DLL呢?

因为:“又能了解链接器原理啦,老开心的!”
In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.

34

主题

133

帖子

6938

积分

用户组: 管理员

UID
77
精华
11
威望
112 点
宅币
6397 个
贡献
129 次
宅之契约
0 份
在线时间
90 小时
注册时间
2014-2-22
发表于 2017-4-6 14:49:02 | 显示全部楼层
学习了!不过如果这种DLL里带界面,似乎就不能正常使用了。

995

主题

2207

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
197
威望
261 点
宅币
16461 个
贡献
32335 次
宅之契约
0 份
在线时间
1565 小时
注册时间
2014-1-26
 楼主| 发表于 2017-4-6 18:56:20 | 显示全部楼层
美俪女神 发表于 2017-4-6 14:49
学习了!不过如果这种DLL里带界面,似乎就不能正常使用了。

好像是,估计得找个机会跑一次__vbaS

2

主题

14

帖子

76

积分

用户组: 小·技术宅

UID
1432
精华
0
威望
2 点
宅币
58 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2016-1-21
发表于 2017-4-13 17:51:53 | 显示全部楼层
来支持 一下,连接器还能写C代码 汇编代码。只是VB 多变却兼容性不足罢了。。。

995

主题

2207

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
197
威望
261 点
宅币
16461 个
贡献
32335 次
宅之契约
0 份
在线时间
1565 小时
注册时间
2014-1-26
 楼主| 发表于 2017-4-14 14:09:40 | 显示全部楼层
0xAA66 发表于 2017-4-13 17:51
来支持 一下,连接器还能写C代码 汇编代码。只是VB 多变却兼容性不足罢了。。。
...

链接器并不能写代码,它只负责链接

2

主题

14

帖子

76

积分

用户组: 小·技术宅

UID
1432
精华
0
威望
2 点
宅币
58 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2016-1-21
发表于 2017-4-15 17:14:10 | 显示全部楼层
0xAA55 发表于 2017-4-14 14:09
链接器并不能写代码,它只负责链接

意思就是说,把连C的代码给连接起来。一起编译。这样就能伪C代码 写在VB中。

995

主题

2207

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
197
威望
261 点
宅币
16461 个
贡献
32335 次
宅之契约
0 份
在线时间
1565 小时
注册时间
2014-1-26
 楼主| 发表于 2017-4-15 19:26:50 | 显示全部楼层
0xAA66 发表于 2017-4-15 17:14
意思就是说,把连C的代码给连接起来。一起编译。这样就能伪C代码 写在VB中。 ...

那也不是“伪C代码”,那是组合语言编程

23

主题

63

帖子

1526

积分

用户组: 管理员

UID
1043
精华
7
威望
29 点
宅币
1343 个
贡献
27 次
宅之契约
0 份
在线时间
251 小时
注册时间
2015-8-15
发表于 2018-2-10 22:36:24 | 显示全部楼层
这样生成出来的lib文件应该也可以放进EXE的链接器参数里吧,然后直接在头上声明函数原型实现导入
flowers for Broken spirits - a woman turned into stake will hold the world in the basin of fire.

0

主题

14

帖子

43

积分

用户组: 初·技术宅

UID
3807
精华
0
威望
2 点
宅币
25 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2018-5-5
发表于 2018-5-6 07:31:24 | 显示全部楼层
要是加上导出后自动生成导出函数声明的.那就有方便

47

主题

67

帖子

590

积分

用户组: 大·技术宅

UID
3260
精华
7
威望
12 点
宅币
463 个
贡献
1 次
宅之契约
0 份
在线时间
19 小时
注册时间
2017-12-26
发表于 2018-6-10 19:10:20 | 显示全部楼层
QQ图片20180610190816.png

7

主题

63

帖子

392

积分

用户组: 中·技术宅

UID
3808
精华
0
威望
4 点
宅币
298 个
贡献
23 次
宅之契约
0 份
在线时间
55 小时
注册时间
2018-5-6
发表于 2018-6-11 09:00:30 | 显示全部楼层
tangptr@126.com 发表于 2018-2-10 22:36
这样生成出来的lib文件应该也可以放进EXE的链接器参数里吧,然后直接在头上声明函数原型实现导入 ...

应该也可以吧,这里运行时获取dll导出函数地址来调用可以,那导入lib再调用也可以应该
菜鸟一枚,直接指正,不必留情

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-9-20 08:33 , Processed in 0.126149 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表