如何认识COM及其应用研究

如何认识COM及其应用研究如何认识COM及其应用研究:未知摘要:本文开拓性的讨论了如何准确的认识COM,重新给COM进行定义和解释,针对COM的新理解,指出了如何创建、使用和销毁COM对象,并对IUnknown的基本接口与方法和在COM代码中如何处理串做了研究,由此引出了COM的新应用。关键词:COM;概念;应用:TP3文献标识码:A:1009-0118(2012)-02-0-03一、COM到底是什么?从表层的意思看,COM是ComponentObjectModel取前三个字母的缩写,即组件对象模型,这三个字母在Windows的世界中随处可见。随时涌现出来的众多新技术都以COM为基础,各种文档中也充斥着诸如COM对象、接口、服务器之类的术语。从另一个角度讲,COM是一种跨应用和语言共享二进制代码的方法。与C++不同的是,它提倡源代码重用,其中ATL便是一个很好的例证。从定义可以看出,COM通过定义二进制标准解决了源代码重用和代码使用受限等问题,即COM明确指出二进制模块(DLLs和EXE)必须被编译成与指定的结构匹配。这个标准也确切规定了在内存中如何组织COM对象。COM定义的二进制标准还必须独立于任何编程语言(如C++中的命名修饰)。一旦满足了这些条件,就可以轻松地从任何编程语言中存取这些模块。由编译器负责所产生的二进制代码与标准兼容。这样使后人就能更容易地使用这些二进制代码。在内存中,COM对象的这种标准形式在C++虚函数中偶尔用到,所以这就是为什么许多COM代码使用C++的原因。但是,编写模块所用的语言是无关的,因为在结果里二进制代码为所有语言可用。二、COM的基本元素定义从下往上看,接口只不过是一组函数,这些函数被称为方法。接口名字以大写的I开头,例如C++中的IShellLink,接口被设计成一个抽象基类,其中只有纯粹的虚拟函数。接口可以从其它接口继承,这里所说的继承的原理就类似C++中的单继承(接口是不允许多继承的)。coclass(简称组件对象类――componentobjectclass)被包含在DLL或EXE中,并且包含着一个或者多个接口的代码。组件对象类(coclasss)实现这些接口。COM对象在内存中表现为组件对象类(coclasss)的一个实例。当然COM“类”和C++“类”是不相同的,尽管常常称COM类实现的就是一个C++类。COM服务器是包含了一个或多个coclass的二进制(DLL或EXE)。注册(Registration)是创建注册表入口的一个过程,告诉操作系统COM服务器放在什么位置。取消注册(Unregistration)则相反,是从注册表删除这些注册入口。GUID(全球唯一标识符globallyuniqueidentifier)是个128位的数字,它是一种独立于COM编程语言的标识方法。每一个接口和coclass有一个GUID。因为每一个GUID都是全球唯一的,所以只要我们用COMAPI创建它们,就避免了名字冲突。类ID或者CLSID是命名coclass的GUID。接口ID或者IID是命名接口的GUID。在COM中广泛地使用GUID有两个理由:一是GUID只是简单的数字,任何编程语言都可以对之进行处理。二是GUID可以在任何机器上被任何人创建,一旦完成创建,它就是唯一的。因此,COM开发人员可以创建自己特有的GUID而不会与其它开发人员所创建的GUID有冲突。这样就消除了集中授权发布GUID的必要。三、创建和销毁COM对象(一)创建COM对象:为了创建COM对象并从这个对象获得接口,必须调用COM库的API函数,CoCreateInstance()。其原型为:HRESULTCoCreateInstance(REFCLSIDrclsid,//rclsid:coclass的CLSID,例如,可以传递CLSID_ShellLink创建一个COM对象来建立快捷方式LPUNKNOWNpUnkOuter,//pUnkOuter:这个参数只用于COM对象的聚合,利用它向现有的coclass添加新方法。参数值为null表示不使用聚合DWORDdwClsContext,//dwClsContext:表示所使用COM服务器的种类。在使用的是最简单的COM服务器时,如一个进程内(in-process)DLL,传递的参数值为CLSCTX_INPROC_SERVERREFIIDriid,//riid:请求接口的IID。例如,可以传递IID_IShellLink获得IShellLink接口指针LPVOID*ppv);//ppv:接口指针的地址。COM库通过这个参数返回请求的接口当我们调用CoCreateInstance()时,它负责在注册表中查找COM服务器的位置,将服务器加载到内存,并创建我们所请求的coclass实例。以下是一个创建CLSID_Sh...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

文秘专家
机构认证
内容提供者

1

确认删除?