b***i 发帖数: 3043 | 1 you have to understand how to write a correct code.. Then there will be no
problem |
|
x****u 发帖数: 44466 | 2 你和另一位同学一样,把事情想简单了。M$不是SB,这种实现是迫不得已的。 |
|
t****t 发帖数: 6806 | 3 两个不同来源的程序(DLL或者随便什么)通信, 本来就需要协议. 说.h不变就不需重新
编译当然是有一定common ground的. 你举的例子(cross dll boundary allocation)就
算是第一版也不会work, 跟我说的是两回事.
这就好象我说人要吃饭才能活下去, 你非要说人还得喝水才能, 那不是抬杠么. |
|
b***i 发帖数: 3043 | 4 the 'similar' implementation in linux, is exactly the correct coding I am
talking about. It is not about com, it is about intelligence to write a
correct code. Heroes will see the same thing. You can't claim you have to
use com to accomplish what you want. Com made it easy for non-smart
programmer because it standardizes the hero's way. Hero's are doing these
thing even before com exists.
xiaoju (可爱的龙猫) 的大作中提到: 】 |
|
|
x****u 发帖数: 44466 | 6 你说到这里,差不多就是COM的意义了。
任何二进制调用都需要协议,模块内这些细节隐藏在编译选项里了,不等于不存在。当
多模块同时存在时,此问题开始突出。COM就是为了解决标准C++中缺少二进制规范的问
题的。
就算全都不理解,真遇到了cross dll boundary allocation问题,解决方案还是COM实
现的一个子集。 |
|
b***i 发帖数: 3043 | 7 这不是谈天之功据为己有吗?解决cross dll boundary allocatio问题,靠的是正确的
逻辑,和对系统的正确理解。解决这些 问题其实也很简单,首先靠的是要有需求,然
后写代码,然后发现问题,调试,然后自然而然就解决了。
就象某人提出C比java慢,然后里面加入了一个循环。这能赖C语言吗?这得赖愚蠢的程
序员。聪明的程序员,是可以自己想明白COM要做的事情的。这就是我说的英雄所见略
同。
难道COM的实现跟长方形圆角一样独特? |
|
k**********g 发帖数: 989 | 8 COM本质论
C++初级阶段的矛盾论
Windows实践论
you need to read the other two too. |
|
|
a****n 发帖数: 1887 | 10 COM本质论 是DON BOX 经典书,也是最好的关于COM的书籍
这个是典型的DLL HELL 问题,本质是因为程序设计的时候没有设计接口(interface)
, 虽然C++本身并不是源生支持interface, 但是可以使用abstract class without
variables 来设计interface。
external client 如果只依赖于DLL的interface(没有member variables)的话,在其
子类中添加/修改/删除 变量,并不会影响 dll的调用, 因为interface的内存布局没
有改变(这种情况下使用factroy method来分离client和dll), client不需要重新编译
而当external client 直接依赖于DLL内具体类的时候,这个类的添加/修改/删除,都
会影响到client,而这种情况,client需要重新编译
COM在提供interface的基础上更进了一步,提供接口二进制布局规范,这样多语言设计
出来的接口具有相同的二进制布局, 从而在interface programming 基础上支持跨语
言... 阅读全帖 |
|
|
d******i 发帖数: 7160 | 12 放狗又搜了推荐的这三本。
只有矛盾论和持久战match到了老毛的著作。
所以说全没找到。
给个英文名或link? |
|
t****t 发帖数: 6806 | 13 他唧唧歪歪的说了半天就是说一件事: 如果把类放到DLL里并且准备把DLL做成可替换的
, 那么不能改.h. 如果改了.h, 那DLL就不是可替换的. 其实是一句废话, 但是考虑到
COM就是解决这类问题, 废话的程度还不算太高.
的? |
|
d******i 发帖数: 7160 | 14 FT。作者就是说:
"只换dll不改h的理想境界在引入com之前做不到"?
这个有什么说头呢?
我老可是抱着读圣书的态度细读的,看来不能希望太高:( |
|
|
d******i 发帖数: 7160 | 16 haha,看啥有用?
与其乱跟风,不如静下心看点说原理的东西。
不过老了点是真的。 |
|
|
|
|
|
x****u 发帖数: 44466 | 21 研究.NET或者Windows Runtime,如果不懂COM的话,基本就是扯淡。 |
|
x****u 发帖数: 44466 | 22 简单点说,就是由于C++的天然缺陷,大多数语言特性在跨编译器时行为都不可预测。
COM就是为了在不破坏C++语法的基础上将尽可能多的现代语言特性引入。没有必要机械
的理解任何COM的特性,从需求出发即可。
的? |
|
x****u 发帖数: 44466 | 23 关于COM比MSDN写的好的书,似乎真没有。很多所谓经典也在胡说八道。 |
|
|
x****u 发帖数: 44466 | 25 现在看什么不浪费时间呢?
觉得COM浪费时间的,还是C++基础学的不够好。把Inside the C++ Object Model仔细
读几遍后,理解ATL/MFC/COM轻而易举。厚书瞬间变成几页纸。 |
|
s***o 发帖数: 2191 | 26 不同意。照你这说法,研究COM不懂汇编还有机器码的话,也成扯淡了 |
|
x****u 发帖数: 44466 | 27 还真没关系。COM这一套搬到什么指令集上都能用,这不ARM上面的Windows RT也是基于
COM的。 |
|
t****t 发帖数: 6806 | 28 说白了COM就是微软搞的一套framework, 这种东西用的时候翻翻手册就好了, 没必要专
门花时间学.
作者写了这么多本来就都是给C++不熟的人看的, C++熟的人不就是我说的那一句话么?
我没学过COM也总结得出来. |
|
x****u 发帖数: 44466 | 29 你前面的话也有问题。设计COM的原因是因为C++本身有缺陷,即使不改.h,DLL还是相
当的不可靠。
比方说这个DLL A被DLL B和C调用,如果B和C都有不同的配置,那么就可能有麻烦。
? |
|
|
x****u 发帖数: 44466 | 31 简单例子,B里面new一个对象传给A后不管,让A释放掉。
是相 |
|
|
x****u 发帖数: 44466 | 33 因为DLL B里面创建的对象,DLL A也许无法正确释放。 |
|
t****t 发帖数: 6806 | 34 这个跟C++无关, 是windows的问题. 据我所知unix上没有这样的问题, 至少如果双方用
同样的libc(比如动态链接的libc)的话. |
|
x****u 发帖数: 44466 | 35 这个问题没那么容易解决,就算是同样的libc,具体怎么分配内存还是可以配置,也是
问题的源泉。
而且对于私有代码大多数时候不可能要求使用同样的C库。 |
|
t****t 发帖数: 6806 | 36 如果你使用私有的C库, 本来就不应该要求别人来释放, 这属于智商的问题. 而且这个
问题跟DLL替换也没有关系, 就算只用一个版本的DLL, 还是有同样的问题, 跟改没改.h
无关. |
|
b***i 发帖数: 3043 | 37 you have to understand how to write a correct code.. Then there will be no
problem |
|
x****u 发帖数: 44466 | 38 你和另一位同学一样,把事情想简单了。M$不是SB,这种实现是迫不得已的。 |
|
t****t 发帖数: 6806 | 39 两个不同来源的程序(DLL或者随便什么)通信, 本来就需要协议. 说.h不变就不需重新
编译当然是有一定common ground的. 你举的例子(cross dll boundary allocation)就
算是第一版也不会work, 跟我说的是两回事.
这就好象我说人要吃饭才能活下去, 你非要说人还得喝水才能, 那不是抬杠么. |
|
b***i 发帖数: 3043 | 40 the 'similar' implementation in linux, is exactly the correct coding I am
talking about. It is not about com, it is about intelligence to write a
correct code. Heroes will see the same thing. You can't claim you have to
use com to accomplish what you want. Com made it easy for non-smart
programmer because it standardizes the hero's way. Hero's are doing these
thing even before com exists.
xiaoju (可爱的龙猫) 的大作中提到: 】 |
|
|
x****u 发帖数: 44466 | 42 你说到这里,差不多就是COM的意义了。
任何二进制调用都需要协议,模块内这些细节隐藏在编译选项里了,不等于不存在。当
多模块同时存在时,此问题开始突出。COM就是为了解决标准C++中缺少二进制规范的问
题的。
就算全都不理解,真遇到了cross dll boundary allocation问题,解决方案还是COM实
现的一个子集。 |
|
b***i 发帖数: 3043 | 43 这不是谈天之功据为己有吗?解决cross dll boundary allocatio问题,靠的是正确的
逻辑,和对系统的正确理解。解决这些 问题其实也很简单,首先靠的是要有需求,然
后写代码,然后发现问题,调试,然后自然而然就解决了。
就象某人提出C比java慢,然后里面加入了一个循环。这能赖C语言吗?这得赖愚蠢的程
序员。聪明的程序员,是可以自己想明白COM要做的事情的。这就是我说的英雄所见略
同。
难道COM的实现跟长方形圆角一样独特? |
|
k**********g 发帖数: 989 | 44 COM本质论
C++初级阶段的矛盾论
Windows实践论
you need to read the other two too. |
|
|
a****n 发帖数: 1887 | 46 COM本质论 是DON BOX 经典书,也是最好的关于COM的书籍
这个是典型的DLL HELL 问题,本质是因为程序设计的时候没有设计接口(interface)
, 虽然C++本身并不是源生支持interface, 但是可以使用abstract class without
variables 来设计interface。
external client 如果只依赖于DLL的interface(没有member variables)的话,在其
子类中添加/修改/删除 变量,并不会影响 dll的调用, 因为interface的内存布局没
有改变(这种情况下使用factroy method来分离client和dll), client不需要重新编译
而当external client 直接依赖于DLL内具体类的时候,这个类的添加/修改/删除,都
会影响到client,而这种情况,client需要重新编译
COM在提供interface的基础上更进了一步,提供接口二进制布局规范,这样多语言设计
出来的接口具有相同的二进制布局, 从而在interface programming 基础上支持跨语
言... 阅读全帖 |
|
|
d******i 发帖数: 7160 | 48 放狗又搜了推荐的这三本。
只有矛盾论和持久战match到了老毛的著作。
所以说全没找到。
给个英文名或link? |
|
b*******s 发帖数: 5216 | 49 COM is dead,别在这个上面花精力了
的? |
|
S**I 发帖数: 15689 | 50 也不能说是死了,微软为驱动开发搞的WDF本质上就是COM。 |
|