由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - COM本质论调用DLL里面构造函数的一点不解
相关主题
为什么我的visual C++ 找不到 "Stdafx.h" ?问一下,DLL里面怎么调用外部类啊?
visual C++链接不同的第三方library的问题FORTRAN读文件时这样的错误怎么办?
求助:一个Visual C++ 9.0下编译OpenGL code的问题JFreeChart一编译错误 (转载)
一个面试题question: C#,python,C interfacing
c++设计一问:如何动态地调用不同的算法的dll ?问个DLL调用问题
要写 Visual C 下的 DLL 东西一个C++ DLL 在VBA中调用的问题
Question about COM问个C#调用unmanaged C++ DLL的问题
OpenMP能编译产生DLL吗?调用win32 DLL的问题
相关话题的讨论汇总
话题: com话题: dll话题: c++话题: 编译话题: interface
进入Programming版参与讨论
1 (共1页)
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
6
Try this first:
http://stackoverflow.com/search?q=com
If you need more help, try:
http://www.neworiental.org/
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颇有点隐入深山苦练秘笈的感觉
相关主题
要写 Visual C 下的 DLL 东西问一下,DLL里面怎么调用外部类啊?
Question about COMFORTRAN读文件时这样的错误怎么办?
OpenMP能编译产生DLL吗?JFreeChart一编译错误 (转载)
进入Programming版参与讨论
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还需要重新编译的?
相关主题
question: C#,python,C interfacing问个C#调用unmanaged C++ DLL的问题
问个DLL调用问题调用win32 DLL的问题
一个C++ DLL 在VBA中调用的问题C#程序调用Windows C++ DLL的问题
进入Programming版参与讨论
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 (可爱的龙猫) 的大作中提到: 】
相关主题
How to run existing C files using Visual C++visual C++链接不同的第三方library的问题
如何提取一个executable的所有dependency?求助:一个Visual C++ 9.0下编译OpenGL code的问题
为什么我的visual C++ 找不到 "Stdafx.h" ?一个面试题
进入Programming版参与讨论
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了。

相关主题
一个面试题Question about COM
c++设计一问:如何动态地调用不同的算法的dll ?OpenMP能编译产生DLL吗?
要写 Visual C 下的 DLL 东西问一下,DLL里面怎么调用外部类啊?
进入Programming版参与讨论
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
44
Try this first:
http://stackoverflow.com/search?q=com
If you need more help, try:
http://www.neworiental.org/
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之前做不到"?
: 这个有什么说头呢?
: 我老可是抱着读圣书的态度细读的,看来不能希望太高:(

相关主题
FORTRAN读文件时这样的错误怎么办?问个DLL调用问题
JFreeChart一编译错误 (转载)一个C++ DLL 在VBA中调用的问题
question: C#,python,C interfacing问个C#调用unmanaged C++ DLL的问题
进入Programming版参与讨论
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 的大作中提到】
: 为什么这个会有问题呢?
相关主题
调用win32 DLL的问题如何提取一个executable的所有dependency?
C#程序调用Windows C++ DLL的问题为什么我的visual C++ 找不到 "Stdafx.h" ?
How to run existing C files using Visual C++visual C++链接不同的第三方library的问题
进入Programming版参与讨论
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, 跟我说的是两回事.
: 这就好象我说人要吃饭才能活下去, 你非要说人还得喝水才能, 那不是抬杠么.

相关主题
visual C++链接不同的第三方library的问题c++设计一问:如何动态地调用不同的算法的dll ?
求助:一个Visual C++ 9.0下编译OpenGL code的问题要写 Visual C 下的 DLL 东西
一个面试题Question about COM
进入Programming版参与讨论
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,别在这个上面花精力了
:
: 的?

1 (共1页)
进入Programming版参与讨论
相关主题
调用win32 DLL的问题c++设计一问:如何动态地调用不同的算法的dll ?
C#程序调用Windows C++ DLL的问题要写 Visual C 下的 DLL 东西
How to run existing C files using Visual C++Question about COM
如何提取一个executable的所有dependency?OpenMP能编译产生DLL吗?
为什么我的visual C++ 找不到 "Stdafx.h" ?问一下,DLL里面怎么调用外部类啊?
visual C++链接不同的第三方library的问题FORTRAN读文件时这样的错误怎么办?
求助:一个Visual C++ 9.0下编译OpenGL code的问题JFreeChart一编译错误 (转载)
一个面试题question: C#,python,C interfacing
相关话题的讨论汇总
话题: com话题: dll话题: c++话题: 编译话题: interface