企业网站建设

建站知识

今日已发布信息: 166291
累计注册用户: 82304641

90%的站长都愿意听Baidu的话

妈妈的话 我们听了 完全可以 搜索引擎

概述: 您是无私的吗?如果您是无私的,完全可以骂我们是自私的。   如果,连您自己都是自私的,再返回来说我们自私,那这个问题就显得很无聊、很无理甚至很无耻……人不自私——天诛地灭!人只自私——还是天诛地灭!你百度这纯粹是转移注意力,这个话题太大,几乎是关系人类本性的问题。   远的不扯

  是的,只要百度说话,最少90%的站长都愿意听。
这一点儿都不奇怪,因为从小父母就教导我们在家要听妈妈的话,在学校要听老师的话,工作后要听老板的话,现在,好不容易整了个网站,肯定要听你百度的话!

  可是,唯独百度的话是最不好听的。
为什么?

  小时候我们之所以听妈妈的话是因为我们听得懂妈妈的话,妈妈吩咐出去不能跟小伙伴们打架,我们听了,妈妈夸我们是乖孩子;上学后,老师教我们要按时完成作业,我们听了,老师夸我们是好学生;工作后,老板安排我们要妥善完成任务,我们听了,老板奖励我们很不错!现在做了个网站,百度一直鞭策我们要为用户服务,我们听了,听完后,傻了!

  因为我们听不懂也听不大明白,可能大多数站长都跟小欧一样,站长们不是参惮悟道的和尚!

  当然,你完全可以说我们站长是站在自己的利益角度来提出这些不伦不类的问题。
咋听上去颇有几分道理,但,经不起推敲。
没错!站长是自私嘀,思考问题也只是站在自己的自私面上,可是小欧想请问百度大人,您是无私的吗?如果您是无私的,完全可以骂我们是自私的。

  如果,连您自己都是自私的,再返回来说我们自私,那这个问题就显得很无聊、很无理甚至很无耻……人不自私——天诛地灭!人只自私——还是天诛地灭!你百度这纯粹是转移注意力,这个话题太大,几乎是关系人类本性的问题。

 

  无锡定制手机网站制作  网络营销外包   今日推荐免费建站   分类信息   舒兰网站建设公司

 

  远的不扯,连毛爷爷都不止一次地说过,革命斗争没有对错,只有双方所站的阶级立场不同。
这点道理,百度大人不会想不明白。

  是嘀,是有些站长(包括小欧在内),是爱发一些牢骚,是爱抱怨百度这个不行那个不爽,动不动拔毛,动不动降名。
如果这是一些极个别现象百度你完全可以置之不理,小欧曾建议过百度高层,没事上国内各大SEO论坛转悠转悠,看看你在他们的眼里是什么样子。
谷歌在他们眼里又是什么样子。

  特别是在谷歌走了以后,你做为我们国家的顶梁柱,但丝毫没有看到你这根顶粱柱的大家风范。
小欧废寝忘食的到处奔走呼豪为了什么?看看人家国外SEO的发展状态,再瞧瞧咱们,甚至有些企业老板说你们这帮搞SEO的就是骗子。
人家老板也说的在理,国内确实有这么一帮流寇把SEO搞的乌烟瘴气,因为在他们心中也没有明确的标准和规范!

  这也正是我们对你一次次提建议,提想法的根本所在!

  同时请你百度不要自视甚高,我们做的是搜索引擎优化。
百度是搜索引擎没错,但搜索引擎不是百度。

  现在国内的搜索老大暂时可能是你,以后是谁还很难说。
看看搜狗,搜搜,必应他们虎视眈眈,都狠不得一口把你活吞了。

  不过这次你们的确是进步了,放下了架子,总算是给了我们站长能够和你交流的小窗口,相信大家都是为了一个目的,那就是跟我们站长一道健康可持续发展。
这也是小欧文中一开头就说明我们站长很愿意听话的原因所在,我们非常愿意和搜索引擎一道健康发展下去。

  这个世界上本来是没有搜索引擎的,只是做网站的人多了,也就有了搜索引擎。

  网站、用户、搜索引擎这三者是我们SEOer服务的终极目标,三者的关系记得小欧以前写过一篇“搜索引擎优化的最终三成”有兴趣的不妨百度一下。

  文中的结论处就是点明了三方的共同利益所在,还是希望我们这一产业链都能够和谐的发展下去。
至于你片面强调我们站长很少站在用户的利益去横加鞭笞搜索引擎的说法是值得商榷的。

  综述,小欧就是替站长们表明一观点:我们是要跟百度健康发展下去的。
要想健康发展,那就必须建立规范,出台标准。
作为国内老大的百度,大家都看着你,如何能为搜索营销这一系列产业链制订标准是需要明明白白地写清楚,讲明白的。
不是左口一个“一切为了用户”,右口一个“站在用户的角度你们自己看着办吧”。

  这样的口号人人都会喊,而且喊起来都比你响,但真的一点指导意义都没有!

  最后,小欧想留一个问题:请问百度,成熟的搜索引擎应该怎样跟站长打交道?

  好了,既然扬眉剑出鞘,那就要剑指雄峰,指的就是你,代号Lee。

 

不要与搜索引擎抢流量

  做站这么久了,大家都知道,我们网站大部分流量设计来自搜索引擎的。也就是说,我们的收益与搜索引擎有着很大的关系,是他们给了我们发展的希望和机会。

  前期,我们网站没有老用户,除了自己的推广引来的用户外,剩余的大部分都是靠搜索引擎来的,它给我们带来一批又一批的新用户,信任我们站的成了忠实用户,我们应该对他们表示感谢。

  前一天从统计中发现从百度知道里来了不少流量,沿着连接反查发现是一个用户回答的问题里推荐了我的网站,说是他经常去的网站,我感到很欣慰,原来我的网站在不知不觉中也产生了社会影响力,我们的得到了别人的肯定是一件很幸福的事情。

  再说一点就是不要与搜索引擎抢流量,上一周做了个测试,从百度知道和百度空间里找了一些与名人有关的文章发表在了我的名人传记网(www.kvov.com)(网站现在每天百度都更新和收录),同步发布的文章都被收录了,而唯独这几篇却迟迟没有收录。从这个测试,可以明白与搜索引擎旗下网站有冲突和雷同的文章是不被搜索引擎看重和收录的。更别说直接复制粘贴他们的文章了,侵犯了他们利益的事情他们是肯定不会做了。而我们要做的就是尽量不要与搜索引擎产生冲突,不要与他们抢流量。只有与他们和谐的发展,我们才会又更好的前途和未来。否则,我们可能会收到意想不到的结果。

  最后,我想说的是要学会感恩。虽然,我们不能给我们的用户带去什么物质的回报,但也要学会感恩,比如说,做好内容给他们提供想要的东西,只有他们需要的才是最好的。网站的广告位设置尽量不要影响他们的阅读和浏览的。广告要让用户觉得舒服,看过后不觉得恶心和反感,这就够了!

  感谢您的阅读和指正,感谢支持我的用户!谢谢!

教大家怎样去设置BOLG的站内优化

  教大家如何去设置博客的站内优化,优化一个博客是在SEO优化中是最简单,比起那些企业站比较容易,一般网站优化都分为两个部分,一个是站内优化,另一个是站外优化,现在梓轩教大家如何去优化一个博客的站内优化,这里的博客我是以WordPress博客为主。

  一.博客title优化

  在WordPress博客中是没有网站优化的三要素(标题,关键词和描述),一般后台都是有这些功能 的,但这个博客默认的只有标题的设置,没有关键词和描述的设置,这个要通过插件来实现,要 去下载一个SEO插件(All in One SEO Pack),在插件里选择--安装插件---搜索插件(All in One SEO Pack)进行安装

  二.博客模板优化

  在选择模板的时候最好选择利于优化的模板,选择代码精简的模板,不要有过多的JS代码和框架 代码的模板,网站主题最好不要有过多的动画和图片,这样不利于优化,一般博客网站是以文章 形式的,要检查一下模板有没有插入一些广告和一些垃圾代码。

  三.博客路径优化

  WordPress博客在默认的情况下是采用动态路径,动态路径不利于优化,影响搜索引擎抓取搜索引擎抓取,要采用静态路径,博客里面默认有几种静态路径的方式。

  四.文章内容优化

  主要的就是文章的相关性,搜索引擎对网站的相关性是很重视的,不要去更新 一些与你网站主题不相关的内容,比方说:你的博客是做地区的SEO,那么你网站的主题就是SEO 那么你只能更新一些SEO方面的内容,不要去更新与SEO无关的内容。

  五.搜素引擎抓取设置

  在设置里面有一个阅读设置,里面可以屏蔽搜索引擎的抓取,在网站上线之后要检查一下你网站有没有对搜索引擎进行屏蔽,要让搜索引擎能够抓取到你的网站。

门户通专访SEO专家康轶文:网站SEO技术

  嘉宾介绍:康轶文,上海易闻营销公司的创始人,www.SEOtest.cn的博主。中国搜索营销行业后起之秀,为中国SEO划分等级。2007年创办上海易闻搜索营销公司并担任CEO。擅长以实验的方式研究搜索引擎营销及网站优化技术,愿意分享经验,写作风格通俗易懂。

  SEO专家康轶文(门户通配图)

  一滴水:您当初是如何选择做中国搜索营销的呢?跟大家讲讲!

  SEO专家康轶文:我2006年,和朋友一起做了一个聚餐交友的网站,叫“请客吃饭网” 当时前期策划、开发做了几个月,当上线后,我发现访问流量非常小,面临一个宣传的问题。在寻找宣传的过程中,发现了SEO。当时朋友告诉我有方法可以让网站排名靠前,我就眼睛一亮的感觉,意识到SEO的价值了。

  一滴水:呵呵,那根据您从事SEO研究这么久以来的经验,有什么窍门跟各位站长分享一下!

  SEO专家康轶文:SEO学习初期,主要靠实践,实践过程中,不断的大量阅读,而且阅读已经度过的文章,会对技术提升很有帮助。现在很多SEO初学者,他们读文章的时候,只理解表明意思,只记关键词密度、加粗、URL怎么弄,但没有理解搜索引擎把这些纳为排名算法中。学SEO的敲门就是:大量阅读,从搜索引擎角度思考,学起来就很快了。

  一滴水:您觉得站长在做SEO优化的时候容易走入什么误区?给站长朋友们一个提醒!

  SEO专家康轶文:说说我当初学习时候遇到的瓶颈吧。

  一滴水:好的!

  SEO专家康轶文:在我接触SEO后1个月,我建了自己的第一个正规网站,当时站内各方面都按照教程调整,把能用的方法都用上了,自我感觉在结构上已经优化到无懈可击,然后就是慢慢的维护。 2个月后,关键词排到第二页,但是怎么也上不去了,这时候就遇到了瓶颈,不知道要怎么办,感觉已经把能做的都做了。

  SEO专家康轶文:相信所有SEO学习者,一定一定会遇到同样的问题。

  一滴水:恩,我想会的!

  SEO专家康轶文:这时候,其实要做的事情很简单,只需要保持更新、逐步加外链就行。

  一滴水:这样就可以突破这个瓶颈吗?

  SEO专家康轶文:是的,在遇到这个瓶颈的时候,不是不知道怎么做,而是做的量不够。我建议刚学SEO的朋友,挑选简单的关键词开始操作,这样容易见效,瓶颈也容易突破。有些站长一上来就做难的关键词,打击会很大。另外一个误区就是“只要有外链,就能有排名”其实 好的内容加上好的站内链接结构,对排名的作用也非常大。这只有操作过高难度的关键词,才能有的经验,当大家的外链情况都差不多时,就很容易感觉到,内容好、结构好的网站,排名相比就是高一筹。

  一滴水:那您可以在这里简单跟大家讲解下关键词的难/易如何区分吗?我相信很多新手站长都比较迷惑!

  SEO专家康轶文:关键词竞争程度,主要是分析排名靠前的网站情况。我是这样操作的:

  我会制作一个竞争分析表格,内容包括:

  1. 排名前20的网上URL和标题;

  2. 各网站的百度、GG收录情况;

  3. 各网站的YAHOO反链查看数量;

  4. 该网站与关键词相关的页面数量

  这样就比较容易知道,如果要做某个关键词,需要做到什么程度就能到首页。

  一滴水:那这些数据是会变动的,做的时候需要注意些什么!

  SEO专家康轶文:数据是会变动,但变动不会非常大。实际操作时,都会有增量。比如前十名平均外链100个,我会按130个操作。当然,这里面还有一些外链质量问题等等。

  一滴水:恩,好的。谢谢分享!那您能否跟大家讲解下页面的设计对SEO优化的影响,以及应该如何去避免!怎样可以做到最好!

  SEO专家康轶文:页面设计方面,其实代码简单就好。使用DIV+CSS,搜索框、广告、CSS等都做成独立外部文件,导航条如果一定要是FLASH或图片的,就想办法在其他地方弥补。排版和代码,和网页设计师的水平很有关系。

  一滴水:网站改版对SEO有非常大的影响,你觉得这方面有方法可以避免或者把影响降到最低吗?

  SEO专家康轶文:这个我要说个案例。 我一个朋友,做FLASH网站的,改版前2万IP/天,他当时信心满满,感觉改版后访问会更多,结果改版后,流量只剩下4000IP/天了。他并没有对URL进行改动,只是把模板做了调整,但流量就回不来了。

  改版的时候,我会考虑这么几个方面:

  1. 目前流量重要?如果不重要,就彻底改版,别考虑流量流失。

  2. 如果感觉目前的流量很重要,不想流失,那就保留旧版网站的所有页面,新建一个目录,把新版本放在新目录里。这样流量就不会流失。当然每个页面需要增加一个“版本转换”按钮。

  我对自己网站的改版,都是逐步执行的,一点点的调整,而不是一下子整个都翻过来。 这样对搜索引擎非常好。搜索引擎因为分析过很多老版本页面,会留下一个模型,通过这个模型搜索引擎就能知道这个网站的核心内容在哪段代码内。如果某天晚上一下次大改版,就把搜索引擎弄蒙了,呵呵。另外,改版,我建议先首页、再列表页、再内页、就是首页改版先上线,然后列表页上线,最后内页上线。

  一滴水:好的,多谢您跟站长分享如此多的宝贵经验!

  一滴水:有的网站页面很花哨,就拿典型的图片站来说吧!您认为这样类型的网站应该如何去做SEO?

  SEO专家康轶文:图片类型的网站,学新浪图片就行。适当的文字,每个图片一个页面,然后互相链接,并且有一个专题页面。 这样排名容易很多。

  一滴水:访谈到了尾声,谈谈跟SEO无关的,呵呵!我知道您有一个理想就是拥有100家希望小学。能跟大家讲讲,您的这个理想么?

  SEO专家康轶文:这个理想,是我真实见到贫困地区的学习环境后萌发的。

  我是这么想的,100家希望小学,每年接受希望小学教育的人数在15000多人。30年,50年后,只要有万分之一的人和我一样,再去建立希望小学,那这样中国教育就能发展起来,虽然可能按我这个思路,发展会慢点,但相比目前贫困地区的教育环境,那会好很多。我算过,建立100家希望小学,然后维护,需要几千万多万。

  一滴水:是不是正向这个理想去努力呢?

  SEO专家康轶文: 算把,这个想法在脑子里时间越长,感觉退休后就越是应该做这件事情。人身为社会多做点事情,死后有人会把你的事迹告诉别人,那活的才有点价值。

  一滴水:祝福您梦想早日实现!

浅析企业SEO中最容易忽视的事

  在网络营销越来越重要的今天,已经成为了企业营销中必不可少的一部分,而有网站的各位企业网站想要做优化的话,更加离不开seo这一关,因为现在如果有的企业想要采购的话,搜索引擎提供信息的比重也越来越大,所以才有了搜索引擎营销,竞价排名的出现,从而突出seo越来越重要的地位。随着越来越多的企业做seo,那么久简单说下在优化中最容易面对的事情,和最容易忽视的事情。

  一:seo优化过程需要淡定和稳定

  稳定性:每一个人的优化过程都有不同,如果频繁的换岗位的话,对企业的发展会很不利,现在seo行业跳槽现象很严重,有着这个现象一个原因就是因为一个企业觉得几个月我的网站还没有上去,就是seoer的责任,所以就直接开之,其实是企业自己对seo行业不是很了解,只顾着限制时间而不想着这个关键字怎么样,难易程度如何,还有的一点就是我让你来上网,就行了,你只要给我这样的结果就可以了,导致了营销seo部门的不稳定,做不上去就换人,然后网站就一直处于流动状态,这样的情况,也是不容忽视的。

  淡定心:seo,淡定的心态,没错吧,seo并非是百度竞价,可以短时间之内排名上去了,但是花掉的钱也是哗哗的,有的竟然认为和竞价差不多,seo是和关键字的难以成都相关的,有的词不是短时间之内可以上去的,有的词需要花费大量的时间和精力,不要轻易的忽视seo的努力,淡定的心态,这个时候就很重要,如果不是挺懂seo的老板,请一定要多和seo沟通,多沟通才能时时感觉到自己网站的变化。对seo的工作要赋予肯定,都是为了提高网站的排名而努力。

  二:seo优化人员也是需要培训的

  可能每一家公司,seo人员就只有一位,独独的一个,有的老总认为seo很简单啊,我就看见他没事的时候写写文章,然后发很多博客,然后就是发发帖子就可以了呢,可是相信每一位seoer都说,seo哪有那么简单啊,seo要学习的,要每天都看se的最新是变化,一年前的seo是什么样子的,现在的seo又是什么样子的,这些都是在进步,seo,需要的也是前进,每一位职工都需要进行一些培训,比如说软文培训啊,还有参加一下seo的大会啊,站长大会,等等,都是可以去学习交流的,网络营销会成为一家公司独有的特色,将会更加促进公司的发展很进步。培训,也能够提高员工的忠诚度,更加能为优化打下基础。

用VC进行COM编程所必须掌握的理论知识

在即将阅读本文下面的内容时,让我们一起致敬于编者的无私奉献精神和技术的发明者的伟大创作。

本文来自:http://www.365128.com


一、为什么要用COM 

  软件工程发展到今天,从一开始的结构化编程,到面向对象编程,再到现在的COM编程,目标只有一个,就是希望软件能象积方块一样是累起来的,是组装起来的,而不是一点点编出来的。结构化编程是函数块的形式,通过把一个软件划分成许多模块,每个模块完成各自不同的功能,尽量做到高内聚低藕合,这已经是一个很好的开始,我们可以把不同的模块分给不同的人去做,然后合到一块,这已经有了组装的概念了。软件工程的核心就是要模块化,最理想的情况就是100%内聚0%藕合。整个软件的发展也都是朝着这个方向走的。结构化编程方式只是一个开始。下一步就出现了面向对象编程,它相对于面向功能的结构化方式是一个巨大的进步。我们知道整个自然界都是由各种各样不同的事物组成的,事物之间存在着复杂的千丝万缕的关系,而正是靠着事物之间的联系、交互作用,我们的世界才是有生命力的才是活动的。我们可以认为在自然界中事物做为一个概念,它是稳定的不变的,而事物之间的联系是多变的、运动的。事物应该是这个世界的本质所在。面向对象的着眼点就是事物,就是这种稳定的概念。每个事物都有其固有的属性,都有其固有的行为,这些都是事物本身所固有的东西,而面向对象的方法就是描述出这种稳定的东西。而面向功能的模块化方法它的着眼点是事物之间的联系,它眼中看不到事物的概念它只注重功能,我们平常在划分模块的时侯有没有想过这个函数与哪些对象有关呢?很少有人这么想,一个函数它实现一种功能,这个功能必定与某些事物想联系,我们没有去掌握事物本身而只考虑事物之间是怎么相互作用而完成一个功能的。说白了,这叫本末倒置,也叫急功近利,因为不是我们智慧不够,只是因为我们没有多想一步。面向功能的结构化方法因为它注意的只是事物之间的联系,而联系是多变的,事物本身可能不会发生大的变化,而联系则是很有可能发生改变的,联系一变,那就是另一个世界了,那就是另一种功能了。如果我们用面向对象的方法,我们就可以以不变应万变,只要事先把事物用类描述好,我们要改变的只是把这些类联系起来的方法,只是重新使用我们的类库,而面向过程的方法因为它构造的是一个不稳定的世界,所以一点小小的变化也可能导致整个系统都要改变。然而面向对象方法仍然有问题,问题在于重用的方法。搭积木式的软件构造方法的基础是有许许多多各种各样的可重用的部件、模块。我们首先想到的是类库,因为我们用面向对象的方法产生的直接结果就是许多的类。但类库的重用是基于源码的方式,这是它的重大缺陷。首先它限制了编程语言,你的类库总是用一种语言写的吧,那你就不能拿到别的语言里用了。其次你每次都必须重新编译,只有编译了才能与你自己的代码结合在一起生成可执行文件。在开发时这倒没什么,关键在于开发完成后,你的EXE都已经生成好了,如果这时侯你的类库提供厂商告诉你他们又做好了一个新的类库,功能更强大速度更快,而你为之心动又想把这新版的类库用到你自己的程序中,那你就必须重新编译、重新调试!这离我们理想的积木式软件构造方法还有一定差距,在我们的设想里希望把一个模块拿出来再换一个新的模块是非常方便的事,可是现在不但要重新编译,还要冒着很大的风险,因为你可能要重新改变你自己的代码。另一种重用方式很自然地就想到了是DLL的方式。Windows里到处是DLL,它是Windows 的基础,但DLL也有它自己的缺点。总结一下它至少有四点不足。(1)函数重名问题。DLL里是一个一个的函数,我们通过函数名来调用函数,那如果两个DLL里有重名的函数怎么办?(2)各编译器对C++函数的名称修饰不兼容问题。对于C++函数,编译器要根据函数的参数信息为它生成修饰名,DLL库里存的就是这个修饰名,但是不同的编译器产生修饰的方法不一样,所以你在VC 里编写的DLL在BC里就可以用不了。不过也可以用extern "C";来强调使用标准的C函数特性,关闭修饰功能,但这样也丧失了C++的重载多态性功能。(3)路径问题。放在自己的目录下面,别人的程序就找不到,放在系统目录下,就可能有重名的问题。而真正的组件应该可以放在任何地方甚至可以不在本机,用户根本不需考虑这个问题。(4)DLL与EXE的依赖问题。我们一般都是用隐式连接的方式,就是编程的时侯指明用什么DLL,这种方式很简单,它在编译时就把EXE与DLL绑在一起了。如果DLL发行了一个新版本,我们很有必要重新链接一次,因为DLL里面函数的地址可能已经发生了改变。DLL的缺点就是COM的优点。首先我们要先把握住一点,COM和DLL一样都是基于二进制的代码重用,所以它不存在类库重用时的问题。另一个关键点是,COM本身也是DLL,既使是ActiveX控件.ocx它实际上也是DLL,所以说DLL在还是有重用上有很大的优势,只不过我们通过制订复杂的COM协议,通COM本身的机制改变了重用的方法,以一种新的方法来利用DLL,来克服DLL本身所固有的缺陷,从而实现更高一级的重用方法。COM没有重名问题,因为根本不是通过函数名来调用函数,而是通过虚函数表,自然也不会有函数名修饰的问题。路径问题也不复存在,因为是通过查注册表来找组件的,放在什么地方都可以,即使在别的机器上也可以。也不用考虑和EXE的依赖关系了,它们二者之间是松散的结合在一起,可以轻松的换上组件的一个新版本,而应用程序混然不觉。 


二、用VC进行COM编程,必须要掌握哪些COM理论知识 
  我见过很多人学COM,看完一本书后觉得对COM的原理比较了解了,COM也不过如此,可是就是不知道该怎么编程序,我自己也有这种情况,我也是经历了这样的阶段走过来的。要学COM的基本原理,我推荐的书是《COM技术内幕》。但仅看这样的书是远远不够的,我们最终的目的是要学会怎么用COM去编程序,而不是拼命的研究COM本身的机制。所以我个人觉得对COM的基本原理不需要花大量的时间去追根问底,没有必要,是吃力不讨好的事。其实我们只需要掌握几个关键概念就够了。这里我列出了一些我自己认为是用VC编程所必需掌握的几个关键概念。(这里所说的均是用C++语言条件下的COM编程方式) 

  (1) COM组件实际上是一个C++类,而接口都是纯虚类。组件从接口派生而来。我们可以简单的用纯粹的C++的语法形式来描述COM是个什么东西: 

  class IObject
  {
  public:
    virtual Function1(...) = 0;
    virtual Function2(...) = 0;
    ....
  };
  class MyObject : public IObject
  {
  public:
    virtual Function1(...){...}
    virtual Function2(...){...}
....
  };



  看清楚了吗?IObject就是我们常说的接口,MyObject就是所谓的COM组件。切记切记接口都是纯虚类,它所包含的函数都是纯虚函数,而且它没有成员变量。而COM组件就是从这些纯虚类继承下来的派生类,它实现了这些虚函数,仅此而已。从上面也可以看出,COM组件是以 C++为基础的,特别重要的是虚函数和多态性的概念,COM中所有函数都是虚函数,都必须通过虚函数表VTable来调用,这一点是无比重要的,必需时刻牢记在心。为了让大家确切了解一下虚函数表是什么样子,从《COM+技术内幕》中COPY了下面这个示例图:

  (2) COM组件有三个最基本的接口类,分别是IUnknown、IClassFactory、IDispatch。 

  COM规范规定任何组件、任何接口都必须从IUnknown继承,IUnknown包含三个函数,分别是 QueryInterface、AddRef、Release。这三个函数是无比重要的,而且它们的排列顺序也是不可改变的。QueryInterface用于查询组件实现的其它接口,说白了也就是看看这个组件的父类中还有哪些接口类,AddRef用于增加引用计数,Release用于减少引用计数。引用计数也是COM中的一个非常重要的概念。大体上简单的说来可以这么理解,COM组件是个DLL,当客户程序要用它时就要把它装到内存里。另一方面,一个组件也不是只给你一个人用的,可能会有很多个程序同时都要用到它。但实际上DLL只装载了一次,即内存中只有一个COM组件,那COM组件由谁来释放?由客户程序吗?不可能,因为如果你释放了组件,那别人怎么用,所以只能由COM组件自己来负责。所以出现了引用计数的概念,COM维持一个计数,记录当前有多少人在用它,每多一次调用计数就加一,少一个客户用它就减一,当最后一个客户释放它的时侯,COM知道已经没有人用它了,它的使用已经结束了,那它就把它自己给释放了。引用计数是COM编程里非常容易出错的一个地方,但所幸VC的各种各样的类库里已经基本上把AddRef的调用给隐含了,在我的印象里,我编程的时侯还从来没有调用过AddRef,我们只需在适当的时侯调用Release。至少有两个时侯要记住调用Release,第一个是调用了 QueryInterface以后,第二个是调用了任何得到一个接口的指针的函数以后,记住多查MSDN 以确定某个函数内部是否调用了AddRef,如果是的话那调用Release的责任就要归你了。 IUnknown的这三个函数的实现非常规范但也非常烦琐,容易出错,所幸的事我们可能永远也不需要自己来实现它们。 

  IClassFactory的作用是创建COM组件。我们已经知道COM组件实际上就是一个类,那我们平常是怎么实例化一个类对象的?是用‘new’命令!很简单吧,COM组件也一样如此。但是谁来new它呢?不可能是客户程序,因为客户程序不可能知道组件的类名字,如果客户知道组件的类名字那组件的可重用性就要打个大大的折扣了,事实上客户程序只不过知道一个代表着组件的128位的数字串而已,这个等会再介绍。所以客户无法自己创建组件,而且考虑一下,如果组件是在远程的机器上,你还能new出一个对象吗?所以创建组件的责任交给了一个单独的对象,这个对象就是类厂。每个组件都必须有一个与之相关的类厂,这个类厂知道怎么样创建组件,当客户请求一个组件对象的实例时,实际上这个请求交给了类厂,由类厂创建组件实例,然后把实例指针交给客户程序。这个过程在跨进程及远程创建组件时特别有用,因为这时就不是一个简单的new操作就可以的了,它必须要经过调度,而这些复杂的操作都交给类厂对象去做了。IClassFactory最重要的一个函数就是CreateInstance,顾名思议就是创建组件实例,一般情况下我们不会直接调用它,API函数都为我们封装好它了,只有某些特殊情况下才会由我们自己来调用它,这也是VC编写COM组件的好处,使我们有了更多的控制机会,而VB给我们这样的机会则是太少太少了。 

  IDispatch叫做调度接口。它的作用何在呢?这个世上除了C++还有很多别的语言,比如VB、 VJ、VBScript、JavaScript等等。可以这么说,如果这世上没有这么多乱七八糟的语言,那就不会有IDispatch。:-) 我们知道COM组件是C++类,是靠虚函数表来调用函数的,对于VC来说毫无问题,这本来就是针对C++而设计的,以前VB不行,现在VB也可以用指针了,也可以通过VTable来调用函数了,VJ也可以,但还是有些语言不行,那就是脚本语言,典型的如 VBScript、JavaScript。不行的原因在于它们并不支持指针,连指针都不能用还怎么用多态性啊,还怎么调这些虚函数啊。唉,没办法,也不能置这些脚本语言于不顾吧,现在网页上用的都是这些脚本语言,而分布式应用也是COM组件的一个主要市场,它不得不被这些脚本语言所调用,既然虚函数表的方式行不通,我们只能另寻他法了。时势造英雄,IDispatch应运而生。:-) 调度接口把每一个函数每一个属性都编上号,客户程序要调用这些函数属性的时侯就把这些编号传给IDispatch接口就行了,IDispatch再根据这些编号调用相应的函数,仅此而已。当然实际的过程远比这复杂,仅给一个编号就能让别人知道怎么调用一个函数那不是天方夜潭吗,你总得让别人知道你要调用的函数要带什么参数,参数类型什么以及返回什么东西吧,而要以一种统一的方式来处理这些问题是件很头疼的事。IDispatch接口的主要函数是Invoke,客户程序都调用它,然后Invoke再调用相应的函数,如果看一看MS的类库里实现 Invoke的代码就会惊叹它实现的复杂了,因为你必须考虑各种参数类型的情况,所幸我们不需要自己来做这件事,而且可能永远也没这样的机会。:-) 

  (3) dispinterface接口、Dual接口以及Custom接口 

  这一小节放在这里似乎不太合适,因为这是在ATL编程时用到的术语。我在这里主要是想谈一下自动化接口的好处及缺点,用这三个术语来解释可能会更好一些,而且以后迟早会遇上它们,我将以一种通俗的方式来解释它们,可能并非那么精确,就好象用伪代码来描述算法一样。-:) 

  所谓的自动化接口就是用IDispatch实现的接口。我们已经讲解过IDispatch的作用了,它的好处就是脚本语言象VBScript、 JavaScript也能用COM组件了,从而基本上做到了与语言无关它的缺点主要有两个,第一个就是速度慢效率低。这是显而易见的,通过虚函数表一下子就可以调用函数了,而通过Invoke则等于中间转了道手续,尤其是需要把函数参数转换成一种规范的格式才去调用函数,耽误了很多时间。所以一般若非是迫不得已我们都想用VTable的方式调用函数以获得高效率。第二个缺点就是只能使用规定好的所谓的自动化数据类型。如果不用IDispatch我们可以想用什么数据类型就用什么类型,VC会自动给我们生成相应的调度代码。而用自动化接口就不行了,因为Invoke的实现代码是VC事先写好的,而它不能事先预料到我们要用到的所有类型,它只能根据一些常用的数据类型来写它的处理代码,而且它也要考虑不同语言之间的数据类型转换问题。所以VC自动化接口生成的调度代码只适用于它所规定好的那些数据类型,当然这些数据类型已经足够丰富了,但不能满足自定义数据结构的要求。你也可以自己写调度代码来处理你的自定义数据结构,但这并不是一件容易的事。考虑到IDispatch的种种缺点(它还有一个缺点,就是使用麻烦,:-) )现在一般都推荐写双接口组件,称为dual接口,实际上就是从IDispatch继承的接口。我们知道任何接口都必须从 IUnknown继承,IDispatch接口也不例外。那从IDispatch继承的接口实际上就等于有两个基类,一个是IUnknown,一个是IDispatch,所以它可以以两种方式来调用组件,可以通过 IUnknown用虚函数表的方式调用接口方法,也可以通过IDispatch::Invoke自动化调度来调用。这就有了很大的灵活性,这个组件既可以用于C++的环境也可以用于脚本语言中,同时满足了各方面的需要。 

  相对比的,dispinterface是一种纯粹的自动化接口,可以简单的就把它看作是IDispatch接口 (虽然它实际上不是的),这种接口就只能通过自动化的方式来调用,COM组件的事件一般都用的是这种形式的接口。 

  Custom接口就是从IUnknown接口派生的类,显然它就只能用虚函数表的方式来调用接口了 

  (4) COM组件有三种,进程内、本地、远程。对于后两者情况必须调度接口指针及函数参数。 

  COM是一个DLL,它有三种运行模式。它可以是进程内的,即和调用者在同一个进程内,也可以和调用者在同一个机器上但在不同的进程内,还可以根本就和调用者在两台机器上。这里有一个根本点需要牢记,就是COM组件它只是一个DLL,它自己是运行不起来的,必须有一个进程象父亲般照顾它才行,即COM组件必须在一个进程内.那谁充当看护人的责任呢?先说说调度的问题。调度是个复杂的问题,以我的知识还讲不清楚这个问题,我只是一般性的谈谈几个最基本的概念。我们知道对于WIN32程序,每个进程都拥有4GB的虚拟地址空间,每个进程都有其各自的编址,同一个数据块在不同的进程里的编址很可能就是不一样的,所以存在着进程间的地址转换问题。这就是调度问题。对于本地和远程进程来说,DLL 和客户程序在不同的编址空间,所以要传递接口指针到客户程序必须要经过调度。Windows 已经提供了现成的调度函数,就不需要我们自己来做这个复杂的事情了。对远程组件来说函数的参数传递是另外一种调度。DCOM是以RPC为基础的,要在网络间传递数据必须遵守标准的网上数据传输协议,数据传递前要先打包,传递到目的地后要解包,这个过程就是调度,这个过程很复杂,不过Windows已经把一切都给我们做好了,一般情况下我们不需要自己来编写调度DLL。 

  我们刚说过一个COM组件必须在一个进程内。对于本地模式的组件一般是以EXE的形式出现,所以它本身就已经是一个进程。对于远程DLL,我们必须找一个进程,这个进程必须包含了调度代码以实现基本的调度。这个进程就是dllhost.exe。这是COM默认的DLL代理。实际上在分布式应用中,我们应该用MTS来作为DLL代理,因为MTS有着很强大的功能,是专门的用于管理分布式DLL组件的工具。 

  调度离我们很近又似乎很远,我们编程时很少关注到它,这也是COM的一个优点之一,既平台无关性,无论你是远程的、本地的还是进程内的,编程是一样的,一切细节都由COM自己处理好了,所以我们也不用深究这个问题,只要有个概念就可以了,当然如果你对调度有自己特殊的要求就需要深入了解调度的整个过程了,这里推荐一本《COM+技术内幕》,这绝对是一本讲调度的好书。 

  (5) COM组件的核心是IDL。 

  我们希望软件是一块块拼装出来的,但不可能是没有规定的胡乱拼接,总是要遵守一定的标准,各个模块之间如何才能亲密无间的合作,必须要事先共同制订好它们之间交互的规范,这个规范就是接口。我们知道接口实际上都是纯虚类,它里面定义好了很多的纯虚函数,等着某个组件去实现它,这个接口就是两个完全不相关的模块能够组合在一起的关键试想一下如果我们是一个应用软件厂商,我们的软件中需要用到某个模块,我们没有时间自己开发,所以我们想到市场上找一找看有没有这样的模块,我们怎么去找呢?也许我们需要的这个模块在业界已经有了标准,已经有人制订好了标准的接口,有很多组件工具厂商已经在自己的组件中实现了这个接口,那我们寻找的目标就是这些已经实现了接口的组件,我们不关心组件从哪来,它有什么其它的功能,我们只关心它是否很好的实现了我们制订好的接口。这种接口可能是业界的标准,也可能只是你和几个厂商之间内部制订的协议,但总之它是一个标准,是你的软件和别人的模块能够组合在一起的基础,是COM组件通信的标准。 

  COM具有语言无关性,它可以用任何语言编写,也可以在任何语言平台上被调用。但至今为止我们一直是以C++的环境中谈COM,那它的语言无关性是怎么体现出来的呢?或者换句话说,我们怎样才能以语言无关的方式来定义接口呢?前面我们是直接用纯虚类的方式定义的,但显然是不行的,除了C++谁还认它呢?正是出于这种考虑,微软决定采用IDL来定义接口。说白了,IDL实际上就是一种大家都认识的语言,用它来定义接口,不论放到哪个语言平台上都认识它。我们可以想象一下理想的标准的组件模式,我们总是从IDL开始,先用IDL制订好各

http://www.kvov.com.cn/jzxx28120.html