1、标准DLL曾一度在VB/VBA的圈子里成为一道迈不过去的坎,让很多VB/VBA们在口水场合抬不起头。可什么叫标准DLL?难道VB/VBA造的DLL是非标产品?
2、DLL只是代码本地存储的方式之一,某种形式上与Word文档里存简历并没有什么区别。怎么到了VB/VBA这里,就有了标准与非标准之分了呢?DLL的存储格式均需遵循PE格式,无论C/C++写的,还是Python打包的,可不得都一样么!不然LoadLibrary会鸟你?
笔者深入分析了DLL在进程中的身份和地位。简单地说,DLL就是贯彻团队合作精神,是COM思维的实现(实例)之一。抽象点说,DLL名如其物,就是动态链接库,是存放资源的磁盘文件。当然里面除了字符串、图标等附件外,最主要的还是代码。
3、VB二进制编译后可不都是汇编指令了么,莫非VB用的CPU指令与C/C++之类的不一样?笔者对『标准DLL』这一概念也是百思不得其解,于是查了查,才发现争议点在于导出函数。更有奇人异士敲掉VB/VBA编译DLL中经典的4大导出函数,以此标榜DLL血统的纯正性。其实,大可不必,今天就来给大家分析下,为什么?
4、故事还得从『代码重用』开始讲起。一提到这个,很多圈圈(OO)就要按奈不住啦。没错,不要激动,OO就是为代码重用,为大型工程等一系列特色量身打造的。很多老码,想必手里都有一套毕生所学的代码树,抽象着代码对这个世界的认知。鼠标轻点犹如点兵遣将,可全天候空投到项目中,像海豹突击队一样,显示出强大的战斗力。
尤其是继承之类的特色,让广大OO作者们欲罢不能,各种对象信手捏来,这便是代码重用的魅力。在其上衍生的各种现代开发的组织管理等,数不胜数。甚至能与跨平台联系起来,代码重用核心在于消灭重复,节约人力啊,跨平台可不也这样吗!如果没有代码重用的场景,还跨个屁平台!有那整虚拟机的时间,手打代码早弄完了。所以说,OO和跨平台是俩好兄弟,有人反对么?
5、但是,无论是OO还是跨平台,他们都强调源码层面的重用。除此外,还有一种代码重用,那就是二进制机器码的重用。想想现代通用操作系统,动辄数千万行代码,要是没有二进制层面的代码重用,会是怎样的场景?
所以在机器层面的代码重用,也是异常重要的。若要追溯历史,其实是与硬件及系统一路发展的。早期的纸带,滚一卷执行一个函数,代码在不同卷纸上,重用是不可能的,因为没法同时塞2卷。直到后面的微程序长期驻留内存,一切接口(映)射内存,才让代码重用有了可能。
谁记得当年BASIC的GOTO么?那可不像今天的GoTo,只在1个函数代码块里有效,那可是带个行号就起飞,满世界乱窜,想到哪里到哪里的狠角色。其实和指针的核心含义一样,只要在内存里的代码,都是亲兄弟。只不过随着系统的发展,系统把持着硬件资源,缔造出一系列等级制度,有了权限体系,只有特定权限标识的内存,里面的代码才可执行。
为了更好地解决二进制代码的重用问题,必须要有一套规范的体系。而COM就是这类规范之一,核心无非就是二进制代码的重用。所以,一切皆接口的COM不仅跨语言,还能跨机器重用代码。看到这里,大家伙可以脑补,或者去查查COM与LoadLibrary机制,与现代操作系统之间究竟有何不可言说的关系?
6、很多人对COM不屑一顾,就如同看待VB/VBA一样,『古老过时』成为口头禅,甚至有人大言不惭地说Win10以后,就不再支持COM了。孰不知COM早已成了跨进程、跨机器的超级GOTO,关键是还很安全。很多时候,你都不知道它在哪儿,一个函数(CreateObject)呼叫乳名(ProgID),它就像你家的阿黄一样,摇首摆尾地出现在你面前。
作为COM的王者,BASIC衣钵的传承人,VB/VBA怎可能数典忘祖。更何况LoadLibrary也没长区别对待DLL的眼睛呀,如果说有也是校验类型版本之类的吧。既然都可以被LoadLibrary,为何还遭歧视?
所谓标准DLL,原来是想用Declare方式来使用代码,想用函数指针来直接GOTO。在追求结构化的今天,古老的GOTO早已被分支、循环等替代,COM组件也可被视为这种替代里的高级货。尽管如此,VB/VBA里也同样保留了原始的指针操弄,COM里也同样保留了指针操作的路径。
在VB/VBA里,COM有着神奇的作用,一句话:『.』给的智能提示和语法元素补全,难道不香么?非要去玩低效率的Declare,非要去玩复杂的指针,简简单单不好么!