vista:写得非常好,贴主是真正的高手!
(发表于2006-1-11 21:02:00)
vista:写得非常好,贴主是真正的高手!
(发表于2006-1-11 21:03:00)
junguo:不好意思.在 "二、套间所要解决的问题 "中的例子写错了.应该是在main中将pTest传进去.ThreadProc应该是这样
DWORD WINAPI ThreadProc(LPVOID lpv)
{
ITestInterface1 *pTest = (ITestInterface1*)lpv;
pTest->TestFunc1();
return 0;
}
(发表于2006-1-13 12:57:00)
抗议斑竹乱堵人嘴:有些东西要经历过才有感悟,从底层才能理解上层,我学习C语言的时候经历以下大家认为疯狂的过程:
1.整个程序没有一个自己写的函数,仅依赖跳来跳去和复杂的循环来完成,终于有一天发现这样做程序不能写得太大:) -- 由此感悟写成函数的必要性,至此开始把不同功能放在一起写成函数。
2.整个程序只写在一个文件里,看上去还真不错,头文件都没有,真是携带方便啊,终于有一天发现要作修改真是头大了,几千句代码找起来真是@#%@#% -- 由此感悟分割文件的重要性,并且彻底弄懂头文件的重要和会发生的冲突。
3.完全没有类,只使用结构和相关函数,完全不用C++的特性,这段时间比前面2个过程要长得多,写的程序也大得多,起码是几万行代码,直到有一天觉得我已经能够非常熟练的运用这些知识,并且知道其中“麻烦”的地方,我才开始翻开C++... -- 我很吃惊,因为当时我突然发现类非常容易理解,只是仔细的看了2遍,就明白了。确实很简单,类的出现正是解决了以前的那些“麻烦”。我并不对它提出的虚拟理念感兴趣。但我知道,它的出现其实是编译器帮我们做了些原本要我们自己来完成的工作。
我觉得现在有很多虚拟的概念确实让编写者觉得简单,以至于他们放弃了对其实质的了解。这样是有害的,因为我们不是编程机器,我们要思考,要想象!我的另一个观点:其实,很多“高手”无非是知道一些你不知道的规则,你一旦知道也能成为那种“高手”。而我心中的高手是 -- 独辟蹊径,富含创意。
(发表于2006-1-14 18:04:00)
抗议斑竹乱堵人嘴:抱歉借你的地方说了些和文章主题无关的话。不过我觉得你的探索精神值得大家学习。切不可“书云亦云”
(发表于2006-1-14 18:11:00)
hanjackcyw:写的好! 希望学COM的人看看, 也不知道现在还有多少人有兴趣?
想说几点:
1.有好几个地方,CloseHandle(hThreads)应该是CloseHandle(hThreads[0]).
2.提示:修改COM对象的套间模型,可以直接将.RGS文件中的val ThreadingModel = s 'Apartment'改为想要的套间模型就可以了, 再右键点工程, 选择Build(selection Only).
3.我在运行的时候, 可能是机器太快, 没有看到线程冲突, 这时可以将COM对象中的cout语句多写几句.
4.对于初学者来说, 你只要知道你的COM对象在各种套间模型中, 各种客户端线程调用下,会不会有多个线程来访问你的COM对象就可以了.
5.最后, 想提一下效率的问题, 大家只有在了解了你的COM对象是怎样被调用的, 才能更好地写出高效率的COM来.我认为文章的最大价值就在这里.
非常感谢作者写的文章!
(发表于2006-1-15 21:31:00)
yj_3000:好啊,一直不太理解,现在好多了
谢谢楼主!!!!
(发表于2006-1-16 11:43:00)
zyl910:进程只是操作系统对调入内存执行的exe的称呼。具体进程的作用、拥有那些资源,那是由操作系统决定的。
由于我们所学的教材都是70、80年代撰写的经典教材,那时操作系统概念刚刚形成(主要是Unix操作系统概念),进程概念与我们现在的Windows操作系统的进程概念有了很大的出入。
32位Windows操作系统为了实现地址空间保护,规定每个进程独自拥有2G的虚拟内存空间。同时为了实现进程内多工,提出了多线程概念。
一般程序的执行,需要的是通用寄存器、状态寄存器(及浮点寄存器等),所以切换这些寄存器就可实现线程切换。即在Win32中,线程的意义是指一段正在执行的代码,线程拥有通用寄存器、状态寄存器(及浮点寄存器等)。
而实现进程虚拟内存空间保护、代码权限管理,需要的是控制寄存器。控制寄存器指令都是特权指令,只有操作系统才有权限调用(谁叫操作系统是一开机便启动,抢到了最高权限)。操作系统在进程创建时填充好控制寄存器,然后在进程执行时根据需要修改控制寄存器。每当进程切换时(另一个进程的线程激活),操作系统会将控制寄存器保存到原进程的描述块(操作系统管理进程的一种数据结构,教科书上一般将其称为PCB)中,然后装载另一进程描述块中存储的控制寄存器,再切换线程。也就是说,进程拥有控制寄存器(虽然它没有权限修改)。
虽然段寄存器是归线程拥有,但是一般应用程序无法修改描述符表,根本没法生成有效的描述子来修改段寄存器。所以Win32程序的段寄存器都是线程创建时操作系统的预设值。
(发表于2006-1-17 17:13:00)
zyl910:我现在发现,编写一个操作系统并不难,只要有最内核的进程管理功能就可叫操作系统了(没看到现在嵌入式Linux多么红火)。编写操作系统最难的是如何面对广大用户提出的众多专业需求,而且要保证这些新功能要与原有功能和谐相处。
比如COM最开始是为么满足程序员可以面向对象的方式调用不同编程工具编译的dll。后来为了跨进程,提出列集散列。为了支持多线程,提出套间概念。再到DCOM跨机器,ActiveX直接在网页上运行,COM+事务处理,直至.Net的大整合。COM随着人的欲望不断的膨胀。
我不记得在哪本书上看到,当年Windows 3.1为了支持OLE 2.0(微软就是在设计OLE 2.0的时候发明了COM的),代码量几乎增长了一倍(源代码是Windows 3.0的两倍)。想一想现在Windows系统提供的众多功能,其代码量绝对超过我心脏的承受能力(据说Windows 2000是靠2000多个顶尖程序员写了三年才完成的,更别说微软有多年的操作系统开发经验,有许多成熟的代码可以直接拿来用)。
(发表于2006-1-17 17:40:00)
laidz:文章写得不错,一看就知道著者是有一定的功底的,编码很规范。不过本人对第一例子(single)中的“WaitForSingleObject会破坏程序中的消息机制”有异议,程序就停止了是因为COM组件所在的STA线程缺少消息循环。因为其它Apartment如要调用STA中的组件,是通过发消息给组件所在apartment的线程,线程当然要有消息分派机制才能执行调用,就是少PeekMessage,DispatchMessage...,才使得调用一直没有返回。就象我们排对打饭似的,要是前面的没人给他打饭走人,后面的只能永远等下去。所以,跨套间调用STA类型套间时,STA类型套间一定要有消息分派机制,不然肯定调用是不会返回的。
(发表于2006-1-19 23:48:00)
mousebaby8080:呵呵,其实技术这东西本身就是这样,但我倒不觉得COM这东西值得费很大精神去研究。
COM只是组件模型的一种实现,其实和COBAL的思想是基本一致的,COBAL没有很多固化在操作系统上的特性,使得它的易用性很差,但COBAL却比COM轻量级,更适合分布式开发。
Java的EJB,.net的Remote和流行的Web Service才是更好的提供分布式的方式,它们的通讯协议更简洁,效率也更高,具有反射机制的语言本身就是为远程调用量身定做的。
贴主说得对,基础是最重要的,但基础并不仅仅限于对计算机和操作系统的理解上。在我认为,软件工程学,数据结构和算法学和计算机信息学才是计算机知识至高无上的绝对知识,学习诸如编程语言,组件模型什么的只不过是为了做工程的需要才会去学习的,没有专门学习的必要,用的时候查查资料就可以了。根据经验,这些玩意是越发的简单的,花一两年时间玩命的学COM,后来.net出来了,肯定会有种被耍了的感觉,还不如用这些时间学点固态的知识呢。
而且做工程的深入和广泛,会让你对语言层面上的东西有着更高一级的理解,一开始我的模型就是TCP/IP,序列化传递参数,后来觉得消息也不错,开始组建消息体系,支持了远程回调,然后觉得写起来很麻烦,于是改用C++,建了整套类库,后来知道有个COM,于是尝试使用,经过几次失败和异常之后,也就大概知道这东西究竟是怎么回事儿了,倒也没看过什么正经八百的讲COM的教材,MSDN就足够了。感谢我的老师,没有让我把时间浪费在多余的东西上面,每次我都是能建立起来比较完整的模型,然后再考虑怎么去实现,程序不会写的时候居多,模型建不起来的时候还没有过。
程序写不出来我们可以抄别人写的,或者请别人写,看别人写一遍,如果能有点注释的,那也就学的差不多了,
如果觉得写COM很难,那可以改用VB写,或者用Delphi写,总有解决的办法嘛。
(发表于2006-2-1 18:56:00)
Crossover:同意laidz关于WaitForSingleObject的评论!!
套间线程中对组件对象的访问直接运行,套间线程外的访问需要入消息队列等候同步,一开始用WaitForSingleOjbect的时候相当于这个线程没有消息泵,当然套间外的访问得不到处理啦。
(发表于2006-2-21 13:48:00)
klmun:对于这些自己不了解的东西,看到时总有点想顶礼膜拜的感觉...汗..我是路过的....
(发表于2006-3-9 16:15:00)
yizhiqiang918:第一例子(single)中的“WaitForSingleObject会破坏程序中的消息机制”. 我的看法是:
1.main函数本来就没有消息机制.
2.main 中CreateThread产生的是工作线程,也没有消息机制.
3.因为是single模式的COM对象,在工作线程中::CoCreateInstance被挂起.
4.ApartMentMsgWaitForMultipleObject加入后,main函数有了消息机制.
所以,不是破坏了(本来就没有),而是要加入消息机制才行.
(发表于2006-3-29 13:05:00)
chinani:写得非常好!
(发表于2006-5-8 14:04:00)
__天外来客:写的真好!茅舍顿开!
(发表于2006-5-29 16:03:00)
aishao0:写的真好!
这么优秀的人,前途一片光明。
放弃你是那个女孩子的损失哦
(发表于2006-6-20 16:56:00)
doojoo:mousebaby8080:
你说的cobal是什么东西?我只听说过corba和cobol,
也许你是想说corba吧?连名字都拼错可见你对这种技术的理解程度。我不同意你所说的"学习诸如编程语言,组件模型什么的只不过是为了做工程的需要才会去学习的,没有专门学习的必要,用的时候查查资料就可以了",
你这是典型的人浮于事,这些技术真的如你所说的,用的时候查查就可以做出合格的东西么?既然用到,就要深入。汇编,com,是系统级开发人员所必需精通的知识。
不懂就不要装懂,不会就不要不屑。
(发表于2007-11-22 11:42:00)
booxiong:写的真好,很同意yizhiqiang918的看法,main函数确实没有消息循环.
(发表于2008-3-8 21:09:00)
andy65007:才看了开头几句,我已经认定它就是一直以来我寻找的能让我完整读完的那片文章。
(发表于2008-5-31 23:00:00)
ycr40:老大,C功底不扎实啊
代码中错漏很多
hThreads 和 hThreads[0]不分
好好补习一下
(发表于2008-9-29 23:28:00)
..........................................................................
--------------------next---------------------