描述:
华为得面试题目。
我得回答是:
当新版本得DLL发生了变化,那么以前程序引用DLL的LIB文件大小和格局就可能发生变化,这样以往的程序在使用这个DLL的时候就会出现错误,主要是地址访问越界。
他们说不对,即使大小发生变化也可以使用,我不明白了,请各位高手解释一下
解决方案1:
函数的地址发生改变??只要DLL中函数名和参数不改变,EXE就不必再编译连接了吧?
---------------
(4)DLL与EXE的依赖问题
我们一般都是用隐式连接的方式,就是编程的时侯指明用什么DLL,这种方式很简单,它在编译时就把EXE与DLL绑在一起了。如果DLL发行了一个新版本,我们很有必要重新链接一次,因为DLL里面函数的地址可能已经发生了改变。DLL的缺点就是COM的优点。
(1)函数重名问题
DLL里是一个一个的函数,我们通过函数名来调用函数,那如果两个DLL里有重名的函数怎么办?
(2)各编译器对C++函数的名称修饰不兼容问题
对于C++函数,编译器要根据函数的参数信息为它生成修饰名,DLL库里存的就是这个修饰名,但是不同的编译器产生修饰的方法不一样,所以你在VC里编写的DLL在BC里就可以用不了。不过也可以用extern "C";来强调使用标准的C函数特性,关闭修饰功能,但这样也丧失了C++的重载多态性功能。
(3)路径问题
放在自己的目录下面,别人的程序就找不到,放在系统目录下,就可能有重名的问题。而真正的组件应该可以放在任何地方甚至可以不在本机,用户根本不需考虑这个问题。
(4)DLL与EXE的依赖问题
我们一般都是用隐式连接的方式,就是编程的时侯指明用什么DLL,这种方式很简单,它在编译时就把EXE与DLL绑在一起了。如果DLL发行了一个新版本,我们很有必要重新链接一次,因为DLL里面函数的地址可能已经发生了改变。DLL的缺点就是COM的优点。
楼主回答的真业余,要是我也不会要你的
解决方案4:二进制标准
解决方案5:COM使程序之间的各部分的耦合性降低了,真正做到了各个组件独立开发,只通过接口通信,便于组件的开发和升级管理。
解决方案6: 精典呀!引入COM可以解决调用DLL时必须将其加载到调用进程地址空间的弊端,有利于进程间通信。重要的是COM是一个进程那服务程序
COM是使软件组件像对象一样彼此交互的一种二进制标准。引入COM可以解决调用DLL时
必须将其加载到调用进程地址空间的弊端,有利于进程间通信。
COM并不是一种实现方法,它只是一种接口标准:-) 使用COM的目的是通用化实例.是实例!! :-) 而不是对象.
解决方案9:《COM本质论》中第一章有详解!!
解决方案10:如果是在一个团队里,程序也不大,用dll也没有什么不可以,都有源程序,开发调试比com要好多了.com优点很多,缺点也一堆