d******i 发帖数: 7160 | 1 近日细读,发现认识差得太远,还请大大们解惑。
第9页开始:
从“针对1.0版本类定义编写的客户分配4个字节的内存,并传给类的构造函数...”
到段末。
背景在前几页交待了,大意是把fastString类做成DLL便于独立更新。客户程序运行时
才从DLL里面load方法。
我不明白的地方是“针对1.0版本类定义编写的客户”是怎么得到"4个字节"这种信息的?
我推测只能是让一份1.0版的.h参与编译的结果吧?
而这已经假设了客户需要一份新的.h重做编译,而不是简单地保留旧版的客户程序,去
透明地调用新版的DLL了。
那么这段论述的point到底是什么呢(读完本页会更不明白)?完全独立发布DLL的
solution不存在? 还是...
特附5-10页。请指教。
谢谢! |
t****t 发帖数: 6806 | 2 他唧唧歪歪的说了半天就是说一件事: 如果把类放到DLL里并且准备把DLL做成可替换的
, 那么不能改.h. 如果改了.h, 那DLL就不是可替换的. 其实是一句废话, 但是考虑到
COM就是解决这类问题, 废话的程度还不算太高.
的?
【在 d******i 的大作中提到】 : 近日细读,发现认识差得太远,还请大大们解惑。 : 第9页开始: : 从“针对1.0版本类定义编写的客户分配4个字节的内存,并传给类的构造函数...” : 到段末。 : 背景在前几页交待了,大意是把fastString类做成DLL便于独立更新。客户程序运行时 : 才从DLL里面load方法。 : 我不明白的地方是“针对1.0版本类定义编写的客户”是怎么得到"4个字节"这种信息的? : 我推测只能是让一份1.0版的.h参与编译的结果吧? : 而这已经假设了客户需要一份新的.h重做编译,而不是简单地保留旧版的客户程序,去 : 透明地调用新版的DLL了。
|
d******i 发帖数: 7160 | 3 FT。作者就是说:
"只换dll不改h的理想境界在引入com之前做不到"?
这个有什么说头呢?
我老可是抱着读圣书的态度细读的,看来不能希望太高:(
【在 t****t 的大作中提到】 : 他唧唧歪歪的说了半天就是说一件事: 如果把类放到DLL里并且准备把DLL做成可替换的 : , 那么不能改.h. 如果改了.h, 那DLL就不是可替换的. 其实是一句废话, 但是考虑到 : COM就是解决这类问题, 废话的程度还不算太高. : : 的?
|
t****t 发帖数: 6806 | 4 现在看这个有什么用? 浪费时间.
【在 d******i 的大作中提到】 : FT。作者就是说: : "只换dll不改h的理想境界在引入com之前做不到"? : 这个有什么说头呢? : 我老可是抱着读圣书的态度细读的,看来不能希望太高:(
|
d******i 发帖数: 7160 | 5 haha,看啥有用?
与其乱跟风,不如静下心看点说原理的东西。
不过老了点是真的。
【在 t****t 的大作中提到】 : 现在看这个有什么用? 浪费时间.
|
k**********g 发帖数: 989 | |
s***o 发帖数: 2191 | 7 现在研究COM颇有点隐入深山苦练秘笈的感觉
【在 d******i 的大作中提到】 : haha,看啥有用? : 与其乱跟风,不如静下心看点说原理的东西。 : 不过老了点是真的。
|
b***i 发帖数: 3043 | 8 然后出来和人单挑,被人一枪干掉.
【在 s***o 的大作中提到】 : 现在研究COM颇有点隐入深山苦练秘笈的感觉
|
d**********x 发帖数: 4083 | 9 haha
re
【在 b***i 的大作中提到】 : 然后出来和人单挑,被人一枪干掉.
|
x****u 发帖数: 44466 | 10 研究.NET或者Windows Runtime,如果不懂COM的话,基本就是扯淡。
【在 s***o 的大作中提到】 : 现在研究COM颇有点隐入深山苦练秘笈的感觉
|
|
|
x****u 发帖数: 44466 | 11 简单点说,就是由于C++的天然缺陷,大多数语言特性在跨编译器时行为都不可预测。
COM就是为了在不破坏C++语法的基础上将尽可能多的现代语言特性引入。没有必要机械
的理解任何COM的特性,从需求出发即可。
的?
【在 d******i 的大作中提到】 : 近日细读,发现认识差得太远,还请大大们解惑。 : 第9页开始: : 从“针对1.0版本类定义编写的客户分配4个字节的内存,并传给类的构造函数...” : 到段末。 : 背景在前几页交待了,大意是把fastString类做成DLL便于独立更新。客户程序运行时 : 才从DLL里面load方法。 : 我不明白的地方是“针对1.0版本类定义编写的客户”是怎么得到"4个字节"这种信息的? : 我推测只能是让一份1.0版的.h参与编译的结果吧? : 而这已经假设了客户需要一份新的.h重做编译,而不是简单地保留旧版的客户程序,去 : 透明地调用新版的DLL了。
|
x****u 发帖数: 44466 | 12 关于COM比MSDN写的好的书,似乎真没有。很多所谓经典也在胡说八道。
【在 d******i 的大作中提到】 : FT。作者就是说: : "只换dll不改h的理想境界在引入com之前做不到"? : 这个有什么说头呢? : 我老可是抱着读圣书的态度细读的,看来不能希望太高:(
|
p*a 发帖数: 592 | 13 Windows RT别名COM3
【在 x****u 的大作中提到】 : 研究.NET或者Windows Runtime,如果不懂COM的话,基本就是扯淡。
|
x****u 发帖数: 44466 | 14 现在看什么不浪费时间呢?
觉得COM浪费时间的,还是C++基础学的不够好。把Inside the C++ Object Model仔细
读几遍后,理解ATL/MFC/COM轻而易举。厚书瞬间变成几页纸。
【在 t****t 的大作中提到】 : 现在看这个有什么用? 浪费时间.
|
s***o 发帖数: 2191 | 15 不同意。照你这说法,研究COM不懂汇编还有机器码的话,也成扯淡了
【在 x****u 的大作中提到】 : 研究.NET或者Windows Runtime,如果不懂COM的话,基本就是扯淡。
|
x****u 发帖数: 44466 | 16 还真没关系。COM这一套搬到什么指令集上都能用,这不ARM上面的Windows RT也是基于
COM的。
【在 s***o 的大作中提到】 : 不同意。照你这说法,研究COM不懂汇编还有机器码的话,也成扯淡了
|
t****t 发帖数: 6806 | 17 说白了COM就是微软搞的一套framework, 这种东西用的时候翻翻手册就好了, 没必要专
门花时间学.
作者写了这么多本来就都是给C++不熟的人看的, C++熟的人不就是我说的那一句话么?
我没学过COM也总结得出来.
【在 x****u 的大作中提到】 : 现在看什么不浪费时间呢? : 觉得COM浪费时间的,还是C++基础学的不够好。把Inside the C++ Object Model仔细 : 读几遍后,理解ATL/MFC/COM轻而易举。厚书瞬间变成几页纸。
|
x****u 发帖数: 44466 | 18 你前面的话也有问题。设计COM的原因是因为C++本身有缺陷,即使不改.h,DLL还是相
当的不可靠。
比方说这个DLL A被DLL B和C调用,如果B和C都有不同的配置,那么就可能有麻烦。
?
【在 t****t 的大作中提到】 : 说白了COM就是微软搞的一套framework, 这种东西用的时候翻翻手册就好了, 没必要专 : 门花时间学. : 作者写了这么多本来就都是给C++不熟的人看的, C++熟的人不就是我说的那一句话么? : 我没学过COM也总结得出来.
|
t****t 发帖数: 6806 | 19 举个例子来看看不改.h还需要重新编译的?
【在 x****u 的大作中提到】 : 你前面的话也有问题。设计COM的原因是因为C++本身有缺陷,即使不改.h,DLL还是相 : 当的不可靠。 : 比方说这个DLL A被DLL B和C调用,如果B和C都有不同的配置,那么就可能有麻烦。 : : ?
|
x****u 发帖数: 44466 | 20 简单例子,B里面new一个对象传给A后不管,让A释放掉。
是相
【在 t****t 的大作中提到】 : 举个例子来看看不改.h还需要重新编译的?
|
|
|
t****t 发帖数: 6806 | 21 为什么这个会有问题呢?
【在 x****u 的大作中提到】 : 简单例子,B里面new一个对象传给A后不管,让A释放掉。 : : 是相
|
x****u 发帖数: 44466 | 22 因为DLL B里面创建的对象,DLL A也许无法正确释放。
【在 t****t 的大作中提到】 : 为什么这个会有问题呢?
|
t****t 发帖数: 6806 | 23 这个跟C++无关, 是windows的问题. 据我所知unix上没有这样的问题, 至少如果双方用
同样的libc(比如动态链接的libc)的话.
【在 x****u 的大作中提到】 : 因为DLL B里面创建的对象,DLL A也许无法正确释放。
|
x****u 发帖数: 44466 | 24 这个问题没那么容易解决,就算是同样的libc,具体怎么分配内存还是可以配置,也是
问题的源泉。
而且对于私有代码大多数时候不可能要求使用同样的C库。
【在 t****t 的大作中提到】 : 这个跟C++无关, 是windows的问题. 据我所知unix上没有这样的问题, 至少如果双方用 : 同样的libc(比如动态链接的libc)的话.
|
t****t 发帖数: 6806 | 25 如果你使用私有的C库, 本来就不应该要求别人来释放, 这属于智商的问题. 而且这个
问题跟DLL替换也没有关系, 就算只用一个版本的DLL, 还是有同样的问题, 跟改没改.h
无关.
【在 x****u 的大作中提到】 : 这个问题没那么容易解决,就算是同样的libc,具体怎么分配内存还是可以配置,也是 : 问题的源泉。 : 而且对于私有代码大多数时候不可能要求使用同样的C库。
|
b***i 发帖数: 3043 | 26 you have to understand how to write a correct code.. Then there will be no
problem
【在 x****u 的大作中提到】 : 这个问题没那么容易解决,就算是同样的libc,具体怎么分配内存还是可以配置,也是 : 问题的源泉。 : 而且对于私有代码大多数时候不可能要求使用同样的C库。
|
x****u 发帖数: 44466 | 27 这事和私有不私有没半点关系,关键问题是C++没对语法特性跨模块给出个规范来。所
以只要不能随意rebuild world的平台,类似技术就必不可少。
COM的基础就是把一切特性都包含到函数指针表里面,然后进一步重新通过这个指针表
实现对象的各种特性。即使在Linux下的很多子系统内,类似的实现也很多。
.h
【在 t****t 的大作中提到】 : 如果你使用私有的C库, 本来就不应该要求别人来释放, 这属于智商的问题. 而且这个 : 问题跟DLL替换也没有关系, 就算只用一个版本的DLL, 还是有同样的问题, 跟改没改.h : 无关.
|
x****u 发帖数: 44466 | 28 你和另一位同学一样,把事情想简单了。M$不是SB,这种实现是迫不得已的。
【在 b***i 的大作中提到】 : you have to understand how to write a correct code.. Then there will be no : problem
|
t****t 发帖数: 6806 | 29 两个不同来源的程序(DLL或者随便什么)通信, 本来就需要协议. 说.h不变就不需重新
编译当然是有一定common ground的. 你举的例子(cross dll boundary allocation)就
算是第一版也不会work, 跟我说的是两回事.
这就好象我说人要吃饭才能活下去, 你非要说人还得喝水才能, 那不是抬杠么.
【在 x****u 的大作中提到】 : 这事和私有不私有没半点关系,关键问题是C++没对语法特性跨模块给出个规范来。所 : 以只要不能随意rebuild world的平台,类似技术就必不可少。 : COM的基础就是把一切特性都包含到函数指针表里面,然后进一步重新通过这个指针表 : 实现对象的各种特性。即使在Linux下的很多子系统内,类似的实现也很多。 : : .h
|
b***i 发帖数: 3043 | 30 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 (可爱的龙猫) 的大作中提到: 】 |
|
|
L***n 发帖数: 6727 | 31 what Hero?
to
【在 b***i 的大作中提到】 : 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 | 32 你说到这里,差不多就是COM的意义了。
任何二进制调用都需要协议,模块内这些细节隐藏在编译选项里了,不等于不存在。当
多模块同时存在时,此问题开始突出。COM就是为了解决标准C++中缺少二进制规范的问
题的。
就算全都不理解,真遇到了cross dll boundary allocation问题,解决方案还是COM实
现的一个子集。
【在 t****t 的大作中提到】 : 两个不同来源的程序(DLL或者随便什么)通信, 本来就需要协议. 说.h不变就不需重新 : 编译当然是有一定common ground的. 你举的例子(cross dll boundary allocation)就 : 算是第一版也不会work, 跟我说的是两回事. : 这就好象我说人要吃饭才能活下去, 你非要说人还得喝水才能, 那不是抬杠么.
|
b***i 发帖数: 3043 | 33 这不是谈天之功据为己有吗?解决cross dll boundary allocatio问题,靠的是正确的
逻辑,和对系统的正确理解。解决这些 问题其实也很简单,首先靠的是要有需求,然
后写代码,然后发现问题,调试,然后自然而然就解决了。
就象某人提出C比java慢,然后里面加入了一个循环。这能赖C语言吗?这得赖愚蠢的程
序员。聪明的程序员,是可以自己想明白COM要做的事情的。这就是我说的英雄所见略
同。
难道COM的实现跟长方形圆角一样独特?
【在 x****u 的大作中提到】 : 你说到这里,差不多就是COM的意义了。 : 任何二进制调用都需要协议,模块内这些细节隐藏在编译选项里了,不等于不存在。当 : 多模块同时存在时,此问题开始突出。COM就是为了解决标准C++中缺少二进制规范的问 : 题的。 : 就算全都不理解,真遇到了cross dll boundary allocation问题,解决方案还是COM实 : 现的一个子集。
|
k**********g 发帖数: 989 | 34 COM本质论
C++初级阶段的矛盾论
Windows实践论
you need to read the other two too. |
m*******l 发帖数: 12782 | 35 还有"论编程的持久战"
【在 k**********g 的大作中提到】 : COM本质论 : C++初级阶段的矛盾论 : Windows实践论 : you need to read the other two too.
|
a****n 发帖数: 1887 | 36 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 基础上支持跨语
言。
记得.NET 本质论中DON BOX, 有一句经典的话COM和Design Pattern 讲述的其实是同一
个东西,就是interface programming
的?
【在 d******i 的大作中提到】 : 近日细读,发现认识差得太远,还请大大们解惑。 : 第9页开始: : 从“针对1.0版本类定义编写的客户分配4个字节的内存,并传给类的构造函数...” : 到段末。 : 背景在前几页交待了,大意是把fastString类做成DLL便于独立更新。客户程序运行时 : 才从DLL里面load方法。 : 我不明白的地方是“针对1.0版本类定义编写的客户”是怎么得到"4个字节"这种信息的? : 我推测只能是让一份1.0版的.h参与编译的结果吧? : 而这已经假设了客户需要一份新的.h重做编译,而不是简单地保留旧版的客户程序,去 : 透明地调用新版的DLL了。
|
d******i 发帖数: 7160 | 37 说的好!
编译
【在 a****n 的大作中提到】 : 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的基础上更进了一步,提供接口二进制布局规范,这样多语言设计
|
d******i 发帖数: 7160 | 38 放狗又搜了推荐的这三本。
只有矛盾论和持久战match到了老毛的著作。
所以说全没找到。
给个英文名或link?
【在 m*******l 的大作中提到】 : 还有"论编程的持久战"
|
d******i 发帖数: 7160 | 39 近日细读,发现认识差得太远,还请大大们解惑。
第9页开始:
从“针对1.0版本类定义编写的客户分配4个字节的内存,并传给类的构造函数...”
到段末。
背景在前几页交待了,大意是把fastString类做成DLL便于独立更新。客户程序运行时
才从DLL里面load方法。
我不明白的地方是“针对1.0版本类定义编写的客户”是怎么得到"4个字节"这种信息的?
我推测只能是让一份1.0版的.h参与编译的结果吧?
而这已经假设了客户需要一份新的.h重做编译,而不是简单地保留旧版的客户程序,去
透明地调用新版的DLL了。
那么这段论述的point到底是什么呢(读完本页会更不明白)?完全独立发布DLL的
solution不存在? 还是...
特附5-10页。请指教。
谢谢! |
t****t 发帖数: 6806 | 40 他唧唧歪歪的说了半天就是说一件事: 如果把类放到DLL里并且准备把DLL做成可替换的
, 那么不能改.h. 如果改了.h, 那DLL就不是可替换的. 其实是一句废话, 但是考虑到
COM就是解决这类问题, 废话的程度还不算太高.
的?
【在 d******i 的大作中提到】 : 近日细读,发现认识差得太远,还请大大们解惑。 : 第9页开始: : 从“针对1.0版本类定义编写的客户分配4个字节的内存,并传给类的构造函数...” : 到段末。 : 背景在前几页交待了,大意是把fastString类做成DLL便于独立更新。客户程序运行时 : 才从DLL里面load方法。 : 我不明白的地方是“针对1.0版本类定义编写的客户”是怎么得到"4个字节"这种信息的? : 我推测只能是让一份1.0版的.h参与编译的结果吧? : 而这已经假设了客户需要一份新的.h重做编译,而不是简单地保留旧版的客户程序,去 : 透明地调用新版的DLL了。
|
|
|
d******i 发帖数: 7160 | 41 FT。作者就是说:
"只换dll不改h的理想境界在引入com之前做不到"?
这个有什么说头呢?
我老可是抱着读圣书的态度细读的,看来不能希望太高:(
【在 t****t 的大作中提到】 : 他唧唧歪歪的说了半天就是说一件事: 如果把类放到DLL里并且准备把DLL做成可替换的 : , 那么不能改.h. 如果改了.h, 那DLL就不是可替换的. 其实是一句废话, 但是考虑到 : COM就是解决这类问题, 废话的程度还不算太高. : : 的?
|
t****t 发帖数: 6806 | 42 现在看这个有什么用? 浪费时间.
【在 d******i 的大作中提到】 : FT。作者就是说: : "只换dll不改h的理想境界在引入com之前做不到"? : 这个有什么说头呢? : 我老可是抱着读圣书的态度细读的,看来不能希望太高:(
|
d******i 发帖数: 7160 | 43 haha,看啥有用?
与其乱跟风,不如静下心看点说原理的东西。
不过老了点是真的。
【在 t****t 的大作中提到】 : 现在看这个有什么用? 浪费时间.
|
k**********g 发帖数: 989 | |
s***o 发帖数: 2191 | 45 现在研究COM颇有点隐入深山苦练秘笈的感觉
【在 d******i 的大作中提到】 : haha,看啥有用? : 与其乱跟风,不如静下心看点说原理的东西。 : 不过老了点是真的。
|
b***i 发帖数: 3043 | 46 然后出来和人单挑,被人一枪干掉.
【在 s***o 的大作中提到】 : 现在研究COM颇有点隐入深山苦练秘笈的感觉
|
d**********x 发帖数: 4083 | 47 haha
re
【在 b***i 的大作中提到】 : 然后出来和人单挑,被人一枪干掉.
|
x****u 发帖数: 44466 | 48 研究.NET或者Windows Runtime,如果不懂COM的话,基本就是扯淡。
【在 s***o 的大作中提到】 : 现在研究COM颇有点隐入深山苦练秘笈的感觉
|
x****u 发帖数: 44466 | 49 简单点说,就是由于C++的天然缺陷,大多数语言特性在跨编译器时行为都不可预测。
COM就是为了在不破坏C++语法的基础上将尽可能多的现代语言特性引入。没有必要机械
的理解任何COM的特性,从需求出发即可。
的?
【在 d******i 的大作中提到】 : 近日细读,发现认识差得太远,还请大大们解惑。 : 第9页开始: : 从“针对1.0版本类定义编写的客户分配4个字节的内存,并传给类的构造函数...” : 到段末。 : 背景在前几页交待了,大意是把fastString类做成DLL便于独立更新。客户程序运行时 : 才从DLL里面load方法。 : 我不明白的地方是“针对1.0版本类定义编写的客户”是怎么得到"4个字节"这种信息的? : 我推测只能是让一份1.0版的.h参与编译的结果吧? : 而这已经假设了客户需要一份新的.h重做编译,而不是简单地保留旧版的客户程序,去 : 透明地调用新版的DLL了。
|
x****u 发帖数: 44466 | 50 关于COM比MSDN写的好的书,似乎真没有。很多所谓经典也在胡说八道。
【在 d******i 的大作中提到】 : FT。作者就是说: : "只换dll不改h的理想境界在引入com之前做不到"? : 这个有什么说头呢? : 我老可是抱着读圣书的态度细读的,看来不能希望太高:(
|
|
|
p*a 发帖数: 592 | 51 Windows RT别名COM3
【在 x****u 的大作中提到】 : 研究.NET或者Windows Runtime,如果不懂COM的话,基本就是扯淡。
|
x****u 发帖数: 44466 | 52 现在看什么不浪费时间呢?
觉得COM浪费时间的,还是C++基础学的不够好。把Inside the C++ Object Model仔细
读几遍后,理解ATL/MFC/COM轻而易举。厚书瞬间变成几页纸。
【在 t****t 的大作中提到】 : 现在看这个有什么用? 浪费时间.
|
s***o 发帖数: 2191 | 53 不同意。照你这说法,研究COM不懂汇编还有机器码的话,也成扯淡了
【在 x****u 的大作中提到】 : 研究.NET或者Windows Runtime,如果不懂COM的话,基本就是扯淡。
|
x****u 发帖数: 44466 | 54 还真没关系。COM这一套搬到什么指令集上都能用,这不ARM上面的Windows RT也是基于
COM的。
【在 s***o 的大作中提到】 : 不同意。照你这说法,研究COM不懂汇编还有机器码的话,也成扯淡了
|
t****t 发帖数: 6806 | 55 说白了COM就是微软搞的一套framework, 这种东西用的时候翻翻手册就好了, 没必要专
门花时间学.
作者写了这么多本来就都是给C++不熟的人看的, C++熟的人不就是我说的那一句话么?
我没学过COM也总结得出来.
【在 x****u 的大作中提到】 : 现在看什么不浪费时间呢? : 觉得COM浪费时间的,还是C++基础学的不够好。把Inside the C++ Object Model仔细 : 读几遍后,理解ATL/MFC/COM轻而易举。厚书瞬间变成几页纸。
|
x****u 发帖数: 44466 | 56 你前面的话也有问题。设计COM的原因是因为C++本身有缺陷,即使不改.h,DLL还是相
当的不可靠。
比方说这个DLL A被DLL B和C调用,如果B和C都有不同的配置,那么就可能有麻烦。
?
【在 t****t 的大作中提到】 : 说白了COM就是微软搞的一套framework, 这种东西用的时候翻翻手册就好了, 没必要专 : 门花时间学. : 作者写了这么多本来就都是给C++不熟的人看的, C++熟的人不就是我说的那一句话么? : 我没学过COM也总结得出来.
|
t****t 发帖数: 6806 | 57 举个例子来看看不改.h还需要重新编译的?
【在 x****u 的大作中提到】 : 你前面的话也有问题。设计COM的原因是因为C++本身有缺陷,即使不改.h,DLL还是相 : 当的不可靠。 : 比方说这个DLL A被DLL B和C调用,如果B和C都有不同的配置,那么就可能有麻烦。 : : ?
|
x****u 发帖数: 44466 | 58 简单例子,B里面new一个对象传给A后不管,让A释放掉。
是相
【在 t****t 的大作中提到】 : 举个例子来看看不改.h还需要重新编译的?
|
t****t 发帖数: 6806 | 59 为什么这个会有问题呢?
【在 x****u 的大作中提到】 : 简单例子,B里面new一个对象传给A后不管,让A释放掉。 : : 是相
|
x****u 发帖数: 44466 | 60 因为DLL B里面创建的对象,DLL A也许无法正确释放。
【在 t****t 的大作中提到】 : 为什么这个会有问题呢?
|
|
|
t****t 发帖数: 6806 | 61 这个跟C++无关, 是windows的问题. 据我所知unix上没有这样的问题, 至少如果双方用
同样的libc(比如动态链接的libc)的话.
【在 x****u 的大作中提到】 : 因为DLL B里面创建的对象,DLL A也许无法正确释放。
|
x****u 发帖数: 44466 | 62 这个问题没那么容易解决,就算是同样的libc,具体怎么分配内存还是可以配置,也是
问题的源泉。
而且对于私有代码大多数时候不可能要求使用同样的C库。
【在 t****t 的大作中提到】 : 这个跟C++无关, 是windows的问题. 据我所知unix上没有这样的问题, 至少如果双方用 : 同样的libc(比如动态链接的libc)的话.
|
t****t 发帖数: 6806 | 63 如果你使用私有的C库, 本来就不应该要求别人来释放, 这属于智商的问题. 而且这个
问题跟DLL替换也没有关系, 就算只用一个版本的DLL, 还是有同样的问题, 跟改没改.h
无关.
【在 x****u 的大作中提到】 : 这个问题没那么容易解决,就算是同样的libc,具体怎么分配内存还是可以配置,也是 : 问题的源泉。 : 而且对于私有代码大多数时候不可能要求使用同样的C库。
|
b***i 发帖数: 3043 | 64 you have to understand how to write a correct code.. Then there will be no
problem
【在 x****u 的大作中提到】 : 这个问题没那么容易解决,就算是同样的libc,具体怎么分配内存还是可以配置,也是 : 问题的源泉。 : 而且对于私有代码大多数时候不可能要求使用同样的C库。
|
x****u 发帖数: 44466 | 65 这事和私有不私有没半点关系,关键问题是C++没对语法特性跨模块给出个规范来。所
以只要不能随意rebuild world的平台,类似技术就必不可少。
COM的基础就是把一切特性都包含到函数指针表里面,然后进一步重新通过这个指针表
实现对象的各种特性。即使在Linux下的很多子系统内,类似的实现也很多。
.h
【在 t****t 的大作中提到】 : 如果你使用私有的C库, 本来就不应该要求别人来释放, 这属于智商的问题. 而且这个 : 问题跟DLL替换也没有关系, 就算只用一个版本的DLL, 还是有同样的问题, 跟改没改.h : 无关.
|
x****u 发帖数: 44466 | 66 你和另一位同学一样,把事情想简单了。M$不是SB,这种实现是迫不得已的。
【在 b***i 的大作中提到】 : you have to understand how to write a correct code.. Then there will be no : problem
|
t****t 发帖数: 6806 | 67 两个不同来源的程序(DLL或者随便什么)通信, 本来就需要协议. 说.h不变就不需重新
编译当然是有一定common ground的. 你举的例子(cross dll boundary allocation)就
算是第一版也不会work, 跟我说的是两回事.
这就好象我说人要吃饭才能活下去, 你非要说人还得喝水才能, 那不是抬杠么.
【在 x****u 的大作中提到】 : 这事和私有不私有没半点关系,关键问题是C++没对语法特性跨模块给出个规范来。所 : 以只要不能随意rebuild world的平台,类似技术就必不可少。 : COM的基础就是把一切特性都包含到函数指针表里面,然后进一步重新通过这个指针表 : 实现对象的各种特性。即使在Linux下的很多子系统内,类似的实现也很多。 : : .h
|
b***i 发帖数: 3043 | 68 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 (可爱的龙猫) 的大作中提到: 】 |
L***n 发帖数: 6727 | 69 what Hero?
to
【在 b***i 的大作中提到】 : 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 | 70 你说到这里,差不多就是COM的意义了。
任何二进制调用都需要协议,模块内这些细节隐藏在编译选项里了,不等于不存在。当
多模块同时存在时,此问题开始突出。COM就是为了解决标准C++中缺少二进制规范的问
题的。
就算全都不理解,真遇到了cross dll boundary allocation问题,解决方案还是COM实
现的一个子集。
【在 t****t 的大作中提到】 : 两个不同来源的程序(DLL或者随便什么)通信, 本来就需要协议. 说.h不变就不需重新 : 编译当然是有一定common ground的. 你举的例子(cross dll boundary allocation)就 : 算是第一版也不会work, 跟我说的是两回事. : 这就好象我说人要吃饭才能活下去, 你非要说人还得喝水才能, 那不是抬杠么.
|
|
|
b***i 发帖数: 3043 | 71 这不是谈天之功据为己有吗?解决cross dll boundary allocatio问题,靠的是正确的
逻辑,和对系统的正确理解。解决这些 问题其实也很简单,首先靠的是要有需求,然
后写代码,然后发现问题,调试,然后自然而然就解决了。
就象某人提出C比java慢,然后里面加入了一个循环。这能赖C语言吗?这得赖愚蠢的程
序员。聪明的程序员,是可以自己想明白COM要做的事情的。这就是我说的英雄所见略
同。
难道COM的实现跟长方形圆角一样独特?
【在 x****u 的大作中提到】 : 你说到这里,差不多就是COM的意义了。 : 任何二进制调用都需要协议,模块内这些细节隐藏在编译选项里了,不等于不存在。当 : 多模块同时存在时,此问题开始突出。COM就是为了解决标准C++中缺少二进制规范的问 : 题的。 : 就算全都不理解,真遇到了cross dll boundary allocation问题,解决方案还是COM实 : 现的一个子集。
|
k**********g 发帖数: 989 | 72 COM本质论
C++初级阶段的矛盾论
Windows实践论
you need to read the other two too. |
m*******l 发帖数: 12782 | 73 还有"论编程的持久战"
【在 k**********g 的大作中提到】 : COM本质论 : C++初级阶段的矛盾论 : Windows实践论 : you need to read the other two too.
|
a****n 发帖数: 1887 | 74 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 基础上支持跨语
言。
记得.NET 本质论中DON BOX, 有一句经典的话COM和Design Pattern 讲述的其实是同一
个东西,就是interface programming
的?
【在 d******i 的大作中提到】 : 近日细读,发现认识差得太远,还请大大们解惑。 : 第9页开始: : 从“针对1.0版本类定义编写的客户分配4个字节的内存,并传给类的构造函数...” : 到段末。 : 背景在前几页交待了,大意是把fastString类做成DLL便于独立更新。客户程序运行时 : 才从DLL里面load方法。 : 我不明白的地方是“针对1.0版本类定义编写的客户”是怎么得到"4个字节"这种信息的? : 我推测只能是让一份1.0版的.h参与编译的结果吧? : 而这已经假设了客户需要一份新的.h重做编译,而不是简单地保留旧版的客户程序,去 : 透明地调用新版的DLL了。
|
d******i 发帖数: 7160 | 75 说的好!
编译
【在 a****n 的大作中提到】 : 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的基础上更进了一步,提供接口二进制布局规范,这样多语言设计
|
d******i 发帖数: 7160 | 76 放狗又搜了推荐的这三本。
只有矛盾论和持久战match到了老毛的著作。
所以说全没找到。
给个英文名或link?
【在 m*******l 的大作中提到】 : 还有"论编程的持久战"
|
b*******s 发帖数: 5216 | 77 COM is dead,别在这个上面花精力了
的?
【在 d******i 的大作中提到】 : 近日细读,发现认识差得太远,还请大大们解惑。 : 第9页开始: : 从“针对1.0版本类定义编写的客户分配4个字节的内存,并传给类的构造函数...” : 到段末。 : 背景在前几页交待了,大意是把fastString类做成DLL便于独立更新。客户程序运行时 : 才从DLL里面load方法。 : 我不明白的地方是“针对1.0版本类定义编写的客户”是怎么得到"4个字节"这种信息的? : 我推测只能是让一份1.0版的.h参与编译的结果吧? : 而这已经假设了客户需要一份新的.h重做编译,而不是简单地保留旧版的客户程序,去 : 透明地调用新版的DLL了。
|
S**I 发帖数: 15689 | 78 也不能说是死了,微软为驱动开发搞的WDF本质上就是COM。
【在 b*******s 的大作中提到】 : COM is dead,别在这个上面花精力了 : : 的?
|