`
chinamming
  • 浏览: 140768 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

COM思想的背后

 
阅读更多
最近看公司的一些新产品和框架 , 发现清一色的“COM思想架构 ”, 这里说的“COM思想架构”是指不完全是标准COM组件的方式,而是指在设计上用到了COM思想。

COM组件技术大概在1993年产生, 20年了, 为什么还有这么多人使用?

我们先来看看标准COM组件:
标准COM组件(DLL方式)需要实现如下4个导出函数:
DllRegisterServer 将组件信息写入注册表
DllUnregisterServer 取消注册
DllCanUnloadNow判断组件是否可以从内存中卸载
DllGetClassObject返回IClassFactory指针,然后我们就可以通过该接口的CreateInstance方法创建对象并取得所需的接口。

采用标准COM组件,有很多好处:
面向接口和对象编程
语言无关性, 采用二进制标准,可以实现跨语言调用
版本升级方便,增加新接口, 组件升级后老客户程序不用重新编译
位置透明, 客户程序不用关心组件的位置
重用方便, 通过包容和聚合可以快速重用已有组件

我们可以看到标准COM组件非常强大, 但是很多时候我们并不需要标准COM组件的所有特性,比如我们不希望引入注册表, 也不希望引入COM运行库,我们希望我们的程序是完全“绿色”的。这时我们就会采用“COM思想架构“开发非标准的COM组件。

实际上微软本身已经有很多API采用这种设计方案了,我们来看一些例子:

XmlLite
继msxml之后微软提供的另 一款高效的XML解析器, 它本身只有一个绿色DLL XmlLite.dll, 关于它的接口和使用方法可以参考XmlLite Introduction用于本机 C++ 的小巧快捷的 XML 分析器
我们可以用depends.exe看看该DLL的导出函数:


调用这些导出的CreateXXX函数返回返回一个继承于IUnknown的接口, 然后我们就可以调用接口提供的方法了, 可以看下IXmlReader的方法:
分享到:
评论

相关推荐

    impress.js:这是一个演示框架,基于现代浏览器中CSS3转换和转换的功能,并受到prezi.com背后思想的启发

    这是一个展示框架,基于现代浏览器中CSS3转换和转换的功能,并受到prezi.com背后思想的启发。 警告 如果您无话可说,那么impress.js可能对您没有帮助;) 如何使用它 签出并初始化git仓库 git clone --recursive ...

    前端项目-impress.js.zip

    前端项目-impress.js,它是一个基于CSS3在现代浏览器中的转换和转换能力的演示框架,灵感来自prezi.com背后的思想。

    hosts-list_web_malwaredomainlist.com:http测试

    关于hosts-list_web_malwaredomainlist.com # MalwareDomainList.com Hosts List ## http://www.malwaredomainlist.com/hostslist/hosts.txt #关于死神替代了背后的原始思想。 确实,这个想法是在PyFunceble和...

    实现模式@www.java1234.com.pdf.zip

    而具有丰富经验的资深工程师则可以通过这些模式进行反思,探究成功实践背后的意义。把价值观、原则和开发实践结合之后,日常开发工作便会以崭新迷人的形式呈现在我们面前。 作者简介 · · · · · · Kent Beck,...

    PRML马春鹏

    包涵大量理论知识和数学推导(尤其是习题),有助于了解Machine Learning方法背后的本质和思想。Machine Learning学习的过程,就是一个 what -> how -> why 的过程。而PRML,或者说同类的ESL等书籍,最大的作用就是...

    rizzo:lonelyplanet.com的UI层

    上有Rizzo背后的思想过程的。 安装并获取依赖项 $ git clone git@github.com:lonelyplanet/rizzo.git && cd rizzo $ cp .ruby-version.example .ruby-version $ cp .ruby-gemset.example .ruby-gemset $ cd . $ ...

    faunadb-zeit-sample-app

    curl https://codeload.github.com/zeit/next.js/tar.gz/canary | tar -xz --strip=2 next.js-canary/examples/hello-worldcd hello-world 安装并运行:npm installnpm run dev# oryarnyarn dev 它部署到云()now...

    blacklist_git_anudeepND:https的测试

    https://github.com/anudeepND/blacklistLicence: https://github.com/anudeepND/blacklist/blob/master/LICENSETitle: Anudeep's BlacklistHosts contributed by Anudeep <anudeep>关于死神替代了背后的原始思想。...

    Potential changes for GitHub-crx插件

    上面的大多数限制仅是因为我想节省时间并专注于解决此扩展背后的核心思想。 GitHub上提供了此扩展程序背后的源代码(https://github.com/dzhavat/potential-changes-for-github)。 如果您想关注开发,提出问题或...

    just-domains_web_malwaredomains.com:http测试

    关于死神替代了背后的原始思想。 确实,这个想法是在PyFunceble和Travis CI的帮助下测试主机文件,域列表甚至Bocklist,以仅包含活动域或IP的列表。 今天,我们为任何需要的人提供我们的基础设施。 !关于PyFunceble...

    Barrons333WordApp

    精简的代码库,包含遵循规范和API...这个怎么运作此应用程序背后的基本思想是为Thinkster团队制作的Conduit网站提供后端Web服务。 它被设计为处理请求并返回JSON响应的api。 tl; dr命令git clone https://github.com/al

    easyprivacy_web_easylist.to:https的测试

    关于easyprivacy_web_easylist.to ! Title: EasyPrivacy ! Last modified: 11 Sep 2019 12:42 UTC ! Expires: 4 days (update frequency) ...替代了背后的原始思想。 确实,这个想法是在PyFunceble和Trav

    xfiles_siteblock_git_gioxx:https的测试

    关于xfiles_siteblock_git_gioxx !...替代了背后的原始思想。 确实,这个想法是在PyFunceble和Travis CI的帮助下测试主机文件,域列表甚至Bocklist,以仅包含活动域或IP的列表。 今天,我们为任何

    composer_local_downloader_demo

    本地存储库背后的基本思想不是,您可以在本地系统上存储依赖项,而是将多个项目/包存储在一个巨大的存储库中。 尤其是在包含大量包的项目中,管理所有这些依赖项可能需要花费大量时间。 请看一下和。 想法是一样的...

    noser-kotlin-edays2018

    这是一个展示框架,基于现代浏览器中CSS3转换和转换的功能,并受到prezi.com背后思想的启发。 警告 如果您无话可说,那么impress.js可能对您没有帮助;) 如何使用它 签出并初始化git仓库 git clone --recursive ...

    Mindful Internet Use-crx插件

    miu将重点关注问题背后的原因,用户倾向于浏览网络的思想。通过反复鼓励更具意图和思想的互联网使用,此扩展将帮助用户退出不良互联网使用。此扩展的目标是为其用户提供一个帮助他们避免无意识浏览和无意互联网使用...

    为 MPT 光伏馈电 DC-AC 转换器设计 MPC:该项目分享了如何设计和开发用于光伏馈电 DC-AC 转换器的 MPC 的想法-matlab开发

    该项目背后的主要思想是开发一种基于 MPC 的方法,用于对馈送 DC-AC 转换器的一系列光伏进行最大功率跟踪。 转换器连接到电网并控制如何在电网交替的情况下提供所需的参考电流。 进一步的 FFT 分析证明产生的交流...

    xfiles_filtri_git_gioxx:https的测试

    Hosting lista: GitHub.com关于死神替代了背后的原始思想。 确实,这个想法是在PyFunceble和Travis CI的帮助下测试主机文件,域列表甚至Bocklist,以仅包含活动域或IP的列表。 今天,我们为任何需要的人提供我们的...

    xfiles_facebook_git_gioxx:https的测试

    替代了背后的原始思想。 确实,这个想法是在PyFunceble和Travis CI的帮助下进行测试的,是将主机文件,域列表甚至是Bocklist托管为仅包含活动域或IP的列表。 今天,我们为任何需要的人提供我们的基础设施。 ! 关于...

    blackguard::crossed_swords:实时,协作冒险游戏

    该研讨会背后的中心思想之一是,该项目及其相关项目仅应作为游戏的MVP,因此欢迎PR! 目录 入门 首先,克隆仓库: git clone https://github.com/activate-game/blackguard.git 现在跳入项目并安装其依赖项: npm...

Global site tag (gtag.js) - Google Analytics