标题：com
相关简介
简要概述com为commercial简称，表示商业性质的，com结尾的域名为最早通用的顶级域名。历史上第一个com域名的诞生是在1985年，当时个人电脑操作系统主要还是使用MS-DOS3.0操作系统，而当时刚成立的“戴尔”的公司正准备发布它的第一款个人电脑“TurboPC”。[1]基本读音com 读音一般与中文 【卡木】 同音。
company 的读音：英音['kʌmpəni]，美音['kʌmpənɪ]相关发展截至2012年，com域名是国际最广泛流行的通用域名格式，全球用户超过1.015亿个，所有国际化公司都会注册.com域名，当然也可以选择.net/.org域名，个人注册只能注sb册3位-63位，其他的为系统保留需要申请才能注册，不过价格昂贵。[1]
注册规则
1、在查询框中可填入的字符仅包括英文字母，汉字，阿拉伯数字和减号。
.net（一般为网络公司注册此种域名）、.org（非赢利组织或协会用此种域名）。
国际域名及IP地址管理权威机构ICANN认证的域名注册服务商（称为Registrar）可以提供.com（商业机构）、 .net（网络服务机构）、.org（非赢利性组织）下的二级域名注册服务，截至2012年全球通过ICANN认证的Registrar有120多家，其中只有60家是正式投入运营的Registrar。
2、"-"（减号）不能出现在字符串的最前sb或最后。
3、在查询框中填入的字符串最长不能超过63个字符。
4、个人也可以注册国际域名，填写注册单位名称一栏时使用个人的姓名即可。[1]

com和exe文件的区别
以COM为扩展名的文件的特点如下：
1.程序只能设置一个段，且不建立堆栈段；
2.程序的长度必须少于64K字节；
3.程序必须预留100H空间，开始处是一条可执行指令；
4.程序被装入的起始标号必须由END语句说明开始地址；
5.程序中的子程序必须具有进程属性(NEAR)；
6.如果COM文件是由几个不同的目标模块链接生成的，要求所有目标模块具有同一代码段名和类别名(CLASS)，且赋予公共属性(PUBLIC)，而主模块应具有100H的入口指针并优先连接。
EXE文件的结构特点如下：
1.程序允许建立若干不同名的代码段、数据段、堆栈段或附加段。
2.程序的长度仅受当前内存可用空间的限制。
3.程序的入口随应用而定，只需起始标号与END语句说明的起始地址一致。
4.程序中的各个子程序的属性随段内或段间调用而定为NEAR或FAR。
5.连接生成EXE文件的各个不同的目标模块内的代码段，数据段或附加段可取同名或独立命名。但要求只有主模块的END语句指出程序入口的起始标号，并至少有一个具有STACK属性的堆栈段
com文件概要
.COM文件包含程序的一个绝对映象----就是说,为了运行程序准确的处理器指令和内存中的数据,MS-DOS通过直接把该映象从文件拷贝到内存而加载.COM程序;它不作任何改变. 为加载一个.COM程序,MS-DOS首先试图分配内存,因为.COM程序必须位于一个64K的段中,所以.COM文件的大小不能超过65,024(64K减去用于PSP的256字节和用于一个起始堆栈的至少256字节).如果MS-DOS不能为程序,一个PSP,一个起始堆栈分配足够内存,则分配尝试失败.否则,MS-DOS分配尽可能多的内存(直至所有保留内存),即使.COM程序本身不能大于64K.在试图运行另一个程序或分配另外的内存之前,大部分.COM程序释放任何不需要的内存.分配内存后,MS-DOS在该内存的头256字节建立一个PSP,如果PSP中的第一个FCB含有一个有效驱动器标识符,则置AL为00h,否则为0FFh. MS-DOS 还置AH为00h或0FFh,这依赖于第二个FCB是否含有一个有效驱动器标识符. 建造PSP后,MS-DOS在PSP后立即开始(偏移100h)加载.COM文件,它置SS,DS和ES为PSP的段地址,接着创建一个堆栈.为创建一个堆栈,MS-DOS置SP为0000h,若已分配了至少64K内存;否则,它置寄存器为比所分配的字节总数大2的值.最后,它把0000h推进栈,这是为了保证与在早期MS-DOS版本上设计的程序的兼容性. MS-DOS通过把控制传递偏移100h处的指令而启动程序.程序设计者必须保证.COM文件的第一条指令是程序的入口点. 注意,因为程序是在偏移100h处加载,因此所有代码和数据偏移也必须相对于100h.汇编语言程序设计者可通过置程序的初值为100h而保证这一点(例如通过在原程序的开始使用语句org 100h).

简介
什么是COM组件
COM是Component Object Model （组件对象模型）的缩写。
用户需要什么样的软件产品？这是一个多选题，但高效，健壮是肯定会被选中的。作为一名软件开发人员如何做才能满足用户的需要呢？必须要保证升级应用时不破坏与以前版本的向后兼容性。必须做到扩展系统服务时不依赖特定的操作系统。面向对象的程序设计显然是一次革命性的改变。采用面向对象的设计方法我们可以很容易的把要解决的问题事物抽象成各种类，并将内部动作封装隐藏起来，只提供一些接口。但这并没有完全解决我们的问题。
技术内幕
雷神刚刚读完《COM技术内幕》一书，整理了一个FAQ，供大家在学习此书时参考。
这是第一部分，包含前3章的内容。
FAQ1：什么是COM组件？〖第一章〗
FAQ2：组件不是……？〖第一章〗
FAQ3：什么是接口？〖第二章〗
FAQ4：接口的作用是什么？〖第二章〗
FAQ5：什么是IUnKnown? 〖第三章〗
FAQ6：QueryInterface函数的作用是什么？〖第三章〗
FAQ7：QueryInterface函数的实现规则是什么？〖第三章〗
FAQ8：QueryInterface的样子？〖第三章〗
FAQ9：QueryInterface函数的参数IID是什么？〖第三章〗
FAQ10：何时需要建立一个新的COM组件版本？〖第三章〗
Question：
什么是COM组件？
Answer:
COM组件是以WIN32动态链接库（DLL）或可执行文件（EXE）形式发布的可执行代码组成。
COM组件是遵循COM规范编写的
COM组件是一些小的二进制可执行文件
COM组件可以给应用程序、操作系统以及其他组件提供服务
自定义的COM组件可以在运行时刻同其他组件连接起来构成某个应用程序
COM组件可以动态的插入或卸出应用
COM组件必须是动态链接的
COM组件必须隐藏（封装）其内部实现细节
COM组件必须将其实现的语言隐藏
COM组件必须以二进制的形式发布
COM组件必须可以在不妨碍已有用户的情况下被升级
COM组件可以透明的在网络上被重新分配位置
COM组件按照一种标准的方式来宣布它们的存在
Question：
组件不是……？
Answer:
COM组件不是一种计算机语言
COM组件不是DLL，只是利用DLL来给组件提供动态链接的能力
COM组件不是一个API函数集。
COM组件不是类
Question：
什么是接口？
Answer:
接口就是提供两个不同对象间的一种连接。
计算机程序是通过一组函数而进行连接的，这组函数就是定义了程序中不同部分的接口。
DLL的接口就是它所输出的那些函数。
C++类的接口就是该类的成员函数集。
COM中的接口是一组由组件实现的提供给客户使用的函数。
在COM中接口是一个包含函数指针数组的内存结构，数组元素是一个由组件实现的函数地址。
Question：
接口的作用是什么？
Answer:
有了组件如何将它们连接起来构成某个应用程序，需要用接口。
在COM中接口就是一切，对客户说组件就是接口集，客户只能通过接口和组件打交道。
说明接口可以保护系统免受外界变化的影响。这是封装的体现。
接口实现了使用户使用同样的方式来处理不同的组件。这是多态的体现。
Question：
接口的如何实现？
Answer:
COM接口在C++中是用纯抽象基类实现。
一个COM组件可以支持多个接口。
一个C++类可以使用多重继承来实现一个支持多个接口的组件。
组件可以支持任意数目的接口。
接口应该具有不变性。在组件升级时应该不修改原来的接口，而是添加新的接口。
要精心设计实现接口，以使之能够支持各种不同的实现。
Question：
什么是IUnKnown?
Answer:
IUnKnown是一个接口。
所有COM接口都继承IUnKnown。
IUnKnown的定义在WIN32 SDK中的UNKNWN头文件中。
///IUnKnown的定义
interface IUnKnown
{
virtual HRESULT __stdcall QueryInterface(const IID& iid,void **ppv)=0;
virtual ULONG __stdcall AddRef()=0;
virtual ULONG __stdcall Release()=0;
}
Question：
QueryInterface函数的作用是什么？
Answer:
QueryInterface是IUnKnown的成员函数，客户可以通过此函数来查询组件是否支持某个特定的接口。
QueryInterface函数返回一个指向组件支持的接口的指针。
如果QueryInterface函数没有找到组件支持的接口则返回指针是NULL。
QueryInterface函数可以使用if…then…else语句、数组、散列表、树来实现。
QueryInterface函数不能使用case语句，因为QueryInterface函数返回的是一个HRESULT结构而不是一个数。
QueryInterface也是一种无封装处理组件版本的机制。这种机制使得组件的新旧不同的版本可以互操作。
Question：
QueryInterface函数的实现规则是什么？
Answer:
QueryInterface返回的IUnKnown指针总是相同。
若客户获得了某个接口，那么它总能获得此接口。
客户可以再次获得已经拥有的接口。
客户可以返回到起始接口。
若能够在某个接口获得某个特定接口，那么从任意接口都将可以获得此接口。
Question：
QueryInterface函数的参数IID是什么？
Answer:
它是一个结构，接口标识符结构。
IID标识了客户所需的接口。
每一个接口都有一个唯一的接口标识符。所以某个与IID相对应的接口绝对不会发生变化。
接口IID决定了COM组件的版本。
不同的接口具有不同的ID，包括不同版本的接口。
Question：
何时需要建立一个新的COM组件版本？
Answer:
当为已有接口指定新的ID时应该是下面的条件至少有一个成立。
接口中函数的数目发生改变时。
接口中函数的顺序发生改变。
接口中某个函数的参数发生改变
接口中某个函数的参数的顺序发生改变
接口中某个函数的参数的类型发生改变
接口中函数的返回值发生改变
接口中函数的返回值类型发生改变
接口中函数的参数的含义发生改变
接口中函数的含义发生改变
COM与C++区别
简单地说，COM是一种跨应用和语言共享二进制代码的方法。与C++不同，它提倡源代码重用。ATL便是一个很好的例证。源码级重用虽然好，但只能用于C++。它还带来了名字冲突的可能性，更不用说不断拷贝重用代码而导致工程膨胀和臃肿。
Windows使用DLLs在二进制级共享代码。这也是Windows程序运行的关键——重用kernel32.dll, user32.dll等。但DLLs是针对C接口而写的，它们只能被C或理解C调用规范的语言使用。由编程语言来负责实现共享代码，而不是由DLLs本身。这样的话DLLs的使用受到限制。
MFC引入了另外一种MFC扩展DLLs二进制共享机制。但它的使用仍受限制——只能在MFC程序中使用。
COM通过定义二进制标准解决了这些问题，即COM明确指出二进制模块（DLLs和EXEs）必须被编译成与指定的结构匹配。这个标准也确切规定了在内存中如何组织COM对象。COM定义的二进制标准还必须独立于任何编程语言（如C++中的命名修饰）。一旦满足了这些条件，就可以轻松地从任何编程语言中存取这些模块。由编译器负责所产生的二进制代码与标准兼容。这样使后来的人就能更容易地使用这些二进制代码。
在内存中，COM对象的这种标准形式在C++虚函数中偶尔用到，所以这就是为什么许多COM代码使用C++的原因。但是记住，编写模块所用的语言是无关的，因为结果二进制代码为所有语言可用。
此外，COM不是Win32特有的。从理论上讲，它可以被移植到Unix或其它操作系统。但是我好像还从来没有在Windows以外的地方听说过COM。
COM+特性
与COM一样，COM+基于二进制组件和基于接口的编程。通过使用透明RPC层，可以跨越进程和计算机边界进行远程方法调用。正如COM组件那样，COM+组件可以在成品中升级和扩展，而不会对使用它们的客户端应用程序造成负面影响。
与MTS一样，COM+支持分布式事务和基于角色的安全性。它提供内置线程池方案，该方案与MTS的线程池方案一样透明。COM+编程模型同样利用侦听通过声明性属性向开发人员公开平台服务。但是，COM+比MTS更进一步地利用了基于属性的编程。除了事务性服务和集成安全性外，COM+还公开自定义对象构造、同步、对象池等服务。COM+的其他新功能（如排队组件和COM+事件）也通过可配置的属性公开。
COM+并不是COM的新版本，我们可以把它理解为COM的新发展，或者为COM更高层次上的应用。COM+的底层结构仍然以COM为基础，它几乎包容了COM的所有内容。有一种说法这样认为，COM+是COM、DCOM和MTS(MicrosoftTransactionServer)的集成，这种说法有一定的道理，因为COM+确实综合了这些技术要素。但更重要的一点是，COM+倡导了一种新的概念，它把COM组件软件提升到应用层而不再是底层的软件结构，它通过操作系统的各种支持，使组件对象模型建立在应用层上，把所有组件的底层细节留给操作系统。
COM是个开放的组件标准
COM是个开放的组件标准，它有很强的扩充和扩展能力，从COM到DCOM，再到MTS的发展过程也充分说明了这一点。对COM有使用经验的读者一定可以感觉到，虽然COM已经改变了Windows程序员的应用开发模式，把组件的概念融入到Windows应用中，但是由于种种原因，DCOM和MTS的许多优越性还没有为广大的Windows程序员所认识。MTS针对企业应用和Web应用的特点，在COM/DCOM的基础上又添加了许多功能和特性，包括事务特性、安全模型、管理和配置等，MTS使COM成为一个完整的组件体系结构。由于历史的原因，COM、DCOM和MTS相互之间并不很融洽，难以形成统一的整体，不过，这种状况很快就要结束，因为COM+将把这三者有效地统一起来，形成一个全新的、功能强大的组件体系结构，并且把DCOM和MTS的各种优势以更为简捷的方式带给Windows2000程序员和用户。
COM+不再局限于COM的组件技术，它更加注重于分布式网络应用的设计和实现，已经成为Microsoft系统平台策略和软件发展策略的一部分。COM+继承了COM几乎全部的优势，同时又避免了COM实现方面的一些不足。COM+紧紧地与操作系统结合起来，通过系统服务为应用程序提供全面的服务。
COM组件类型
进程内组件：组件是在主调应用程序的进程范围内运行，是以DLL方式实现的。组件的实现是快速的，但由于和应用程序公用一个进程，导致了不安全的因素。
进程外组件：它又可分为两类。本地服务器进程组件，它是组件与调用组件者在同一机器上；远程服务器进程组件，它是组件使用远程过程调用RPCs和客户应用程序进行通信。

描述
COM 类提供了一个将 (D)COM 组件整合到 PHP 脚本中的框架。
方法
string COM::COM( string module_name [, string server_name [, int codepage]] )
COM 类构造函数。参数： module_name 被请求组件的名字或 class-id。 
server_name DCOM 服务器的名字，组件在此服务器上被取用。如果是 NULL，则假定是 localhost。想要允许 DCOM，必须将 php.ini 中的 com.allow_dcom设为 TRUE。 
codepage 指定用于将 PHP 字符串（php-strings）转换成 UNICODE 字符串（unicode-strings）的代码页，反之亦然。可用的值为 CP_ACP、CP_MACCP、CP_OEMCP、CP_SYMBOL、CP_THREAD_ACP, CP_UTF7和 CP_UTF8。
COM 示例
// 启动 word
$word = new COM("word.application") or die("Unable to instanciate Word");
print "Loaded Word, version {$word->Version}\n";
//将其置前
$word->Visible = 1;
//打开一个空文档
$word->Documents->Add();
//随便做些事情
$word->Selection->TypeText("This is a test...");
$word->Documents[1]->SaveAs("Useless test.doc");
//关闭 word
$word->Quit();
//释放对象
$word->Release();
$word = null;

同级域名
.net（一般为网络公司注册此种域名）、.org（非赢利组织或协会用此种域名）。
国际域名及IP地址管理权威机构ICANN认证的域名注册服务商（称为Registrar）可以提供.com（商业机构）、 .net（网络服务机构）、.org（非赢利性组织）下的二级域名注册服务,现在全球通过ICANN认证的Registrar有120多家，其中只有60家是正式投入运营的Registrar。在中国，有八家企业被批准成为ICANN认证的域名注册服务商。
.com域名历史
历史上第一个.com域名的诞生是在1985年。当时个人电脑操作系统主要还是使用MS-DOS3.0操作系统，而刚刚成立的“戴尔”的公司正准备发布它的第一款个人电脑“TurboPC”。1985年3月15日，symbolics点com注册成为第一个.com域名。经营这个网站的公司是一家电脑制造商。Symbolics最初的所有者在90年代初宣布破产，后来的所有者继续运营着这个网站。这也就是说这个域名是目前互联网上最古老的运营中.com 域名，不过这个网站现在的界面还是非常简单，就像1985年刚创建的时候那样。
国际域名注册要求
1、在查询框中可填入的字符仅包括英文字母，阿拉伯数字和减号。
2、"-"（减号）不能出现在字符串的最前或最后。
3、在查询框中填入的字符串最长不能超过63个字符。
4、个人也可以注册国际域名，填写注册单位名称一栏时使用个人的姓名即可。
COM文件
操作系统中的二进制可执行文件。
可执行文件分两种一种是后辍名为“.com”，另一种就是“.exe” 了，.“.com”一般用于DOS，而“.exe”一般用于Windows。