﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Prayer-随笔分类-组件</title><link>http://www.cppblog.com/prayer/category/8256.html</link><description>在一般中寻求卓越</description><language>zh-cn</language><lastBuildDate>Fri, 12 Sep 2008 07:27:47 GMT</lastBuildDate><pubDate>Fri, 12 Sep 2008 07:27:47 GMT</pubDate><ttl>60</ttl><item><title>COM组件与dll</title><link>http://www.cppblog.com/prayer/archive/2008/09/12/61671.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Fri, 12 Sep 2008 04:54:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2008/09/12/61671.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/61671.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2008/09/12/61671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/61671.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/61671.html</trackback:ping><description><![CDATA[首先介绍什么是com组件，com组件是一种二进制规范，在这里我们要特别注意二进制规范这个词，com组件为了在同一种平台下不同语言间的可重用性，微软专门定义了一组规范，但是这种规范是得到各大厂家支持的，所以他是一种标准不是微软自己的产品，所以其他的语言的编译器支持这个二进制规范也就是说实现了这个规范，那么com组件就可以在很多语言中横行。
<p>&nbsp; 　至于com组件的跨平台问题，我先谈谈我对平台的理解。平台我认为应该分为两种，一种是机器本身的指令系统，也就是硬件。另一种是操作系统。语言在不同平台上要跨越的是硬件的指令系统和操作系统的系统本地函数例如最常见的是winAPI函数。所以在WINDOWS下编译成的com组件，只要不包含WINAPI函数，理论上，在相同的硬件基础上也是可以执行的。
<p>在这种意义上，这种跨平台有些牵强。所以我认为com组件可以在很多平台上使用，但是真正做到跨平台是不可能的。
<p>&nbsp;&nbsp;&nbsp;&nbsp; DLL是一种程序动态调用以及连接的技术，他和组件是完全两种不同的概念，很多组件都采用这种技术作为自身的连接方式。说道DLL我们就要提一下普通的DLL和COM组件的区别，现在windows下使用的都是c语言接口的，因为windows系统函数基本上都是c接口的（能够被c语言理解的），所以现在的DLL很多也是完成这种接口的（在COM组件为成为主流之前），所以一种非com组件的DLL被另一种语言调用，前提是该语言支持对C接口的解释。例如：我用delphi写了一个DLL，在java中调用，java就会用JNI（java native interface）进行重写。作为对c接口的解释。至于对API函数的引用需不需要使用JNI，都有道理，如果用了，说明java内部没有替开发人员实现，如果没有使用JNI则说明java已经代替开发人员实现了。因为现有的API函数是一定的，可以事先实现。</p>
<img src ="http://www.cppblog.com/prayer/aggbug/61671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2008-09-12 12:54 <a href="http://www.cppblog.com/prayer/archive/2008/09/12/61671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>COM与DLL</title><link>http://www.cppblog.com/prayer/archive/2008/09/12/61670.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Fri, 12 Sep 2008 04:52:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2008/09/12/61670.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/61670.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2008/09/12/61670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/61670.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/61670.html</trackback:ping><description><![CDATA[<pre><font face=幼圆 size=3>com英文为Component Object Model（组件对象模型），是微软生产软件组件的标准。</font></pre>
<pre><font face=幼圆 size=3>它是构造二进制兼容软件组件的规范，不管组件应用何种语言编写只要遵循com规范就可以</font></pre>
<pre><font face=幼圆 size=3>相互直接通信。提出com规范主要是为了满足： </font></pre>
<pre><font face=幼圆 size=3>1.程序的快速开发，可以将一个大型的工程分成若干个com组件同时开发。 </font></pre>
<pre><font face=幼圆 size=3>2.可以动态的插入或卸载com组件。 </font></pre>
<pre><font face=幼圆 size=3>3.可以隐藏或封装com组件内部的实现细节。</font></pre>
<pre><strong><font face=幼圆 size=3>com组件可以由不同的语言进行编写，</font><font face=幼圆 size=3>但com组件之间的通信是通过组件的接口来实现的，</font></strong></pre>
<pre><strong><font face=幼圆 size=3>com组件接口的实现是统一的，</font><font face=幼圆 size=3>它采用的是虚拟函数表（VTBL）形式。</font><font face=幼圆 size=3>虚拟函数表中包含了</font></strong></pre>
<pre><font face=幼圆 size=3><strong>组件函数的一组指针，</strong></font><font face=幼圆 size=3><strong>我们可以通过这组指针来获取我们想要通信的组件函数的内存地址。</strong> </font></pre>
<pre><font face=幼圆 size=3><strong>dll（动态链接库）是包含函数和数据的模块的集合。它可以导出数据也可以导出函数以供</strong></font></pre>
<pre><font face=幼圆 size=3><strong>其它的dll调用。dll的加载可以通过静态链接和动态链接两种方式。</strong> </font></pre>
<pre><font face=幼圆 size=3>1.静态链接时将所要链接的dll模块以二进制的形式编译进其他模块。 </font></pre>
<pre><font face=幼圆 size=3>2.动态链接指调用模块在运行时加载DLL，使用LoadLibrary函数或LoadLibraryEx</font></pre>
<pre><font face=幼圆 size=3>函数将dll 加载到进程的地址空间，并调用GetProcAddress函数以获取导出的 DLL </font></pre>
<pre><font face=幼圆 size=3>函数的地址。 </font></pre>
<pre><font face=幼圆 size=3>动态加载dll的优点： </font></pre>
<pre><font face=幼圆 size=3>1.DLL可节省内存并减少交换。通过在内存中共享 DLL 的单个副本，多个进程可以同时</font></pre>
<pre><font face=幼圆 size=3>使用一个DLL。相比之下，对于使用静态链接库构建的每一个应用程序，Windows 都要</font></pre>
<pre><font face=幼圆 size=3>在内存中为其加载库代码的一个副本。 </font></pre>
<pre><font face=幼圆 size=3>2.DLL 可节省磁盘空间。 多个应用程序可以共享磁盘上的一个 DLL 副本。相比之下，</font></pre>
<pre><font face=幼圆 size=3>使用静态 链接库构建的每一个应用程序都需要让链接到程序文件映像的库代码作为一个</font></pre>
<pre><font face=幼圆 size=3>单独的专用副本。 </font></pre>
<pre><font face=幼圆 size=3><strong>dll与com的关系：com是一种规范，按照是com规范实现的dll可以被视为com组件，</strong></font></pre>
<pre><font face=幼圆 size=3>例如我们用mfc建立的Active X控件工程其中的接口封装是靠idl描述的所以可以视为</font></pre>
<pre><font face=幼圆 size=3>com组件。而且从上面关于com和dll的说明可以看出com组件的接口是一组具有特定规范的</font></pre>
<pre><font face=幼圆 size=3>函数，所以com组件可以别视为dll但dll不一定是com组件。 </font></pre>
<pre><font face=幼圆 size=3><strong>com和DLL最大的区别就是: dll是以函数集合的方式来调用的是编程语言相关的</strong>象VC必须</font></pre>
<pre><font face=幼圆 size=3>加上extern "C"...而COM是以interface的方式提供给用户使用的是一种二进制的调用</font></pre>
<pre><font face=幼圆 size=3>规范,是与编程语言无关的,它使用idl接口定义语言来描述自己使用类继承来实现自己的功能</font></pre>
<pre><font face=幼圆 size=3>和方法.DLL只有DLL一种形势,里面可任意定义函数无限制,只能运行在本机上 而COM </font></pre>
<pre><font face=幼圆 size=3>有DLL和EXE两种存在形势: COM所在的DLL中必须导出四个函数: </font></pre>
<pre><font face=幼圆 size=3>dllgetobjectclass, dllregisterserver, dllunregisterserver, </font></pre>
<pre><font face=幼圆 size=3>dllunloadnow </font></pre>
<pre><font face=幼圆 size=3>这四个函数各有作用,有些是提供给COM管理器用的,通过CLSID和IID来使用,有些是提供</font></pre>
<pre><font face=幼圆 size=3>给注册机用的. </font></pre>
<pre><font face=幼圆 size=3>COM结合MTS,就是COM+, 是DCOM的高级版本,提供了更为强大和安全的分布式COM服务, </font></pre>
<pre><font face=幼圆 size=3>DCOM运行在不同的机器上 用proxy和stub来实现远程接口的本地映射 二者从执行速度来</font></pre>
<pre><font face=幼圆 size=3>说 二者相差无几 但是启动速度DLL要比COM快！</font></pre>
<pre> </pre>
<img src ="http://www.cppblog.com/prayer/aggbug/61670.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2008-09-12 12:52 <a href="http://www.cppblog.com/prayer/archive/2008/09/12/61670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>