COM 类工厂有必要存在吗

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

1. IClassFactory 的用途

http://www.80diy.com/home/20041120/19/3572410.html 看到几段关于COM 的类厂的话,

"""
类厂用来抽象组件的create过程,客户不需要知道组件的详细情况,也不需要知道类厂的详细情况,只要知道CoCreateInstance可以创建组件即可。而CoCreateInstance内部调用DllGetClassObject来生成该组件的类厂,由于类厂有组件的作者撰写,所以对组件类可谓知根知底,由类厂来生成组件完全行得通,这样客户和组件就进一步划分,客户只能查询该组件是否支持某借口,而对组件的其他情况一无所知,这样的划分可以使组件和客户间的耦合更小。
"""

"""
组件如果将某接口的全部方法都实现了,就称该组件支持某接口,com并没有规定组件和接口之间是虚函数继承的关系,只是在c++中以这种方法来实现最好而已。  
IClassFactory说穿了就是专门构造组件的类,这样做是为了抽象,因为客户没有必要知道组件是什么,如果由客户直接构造组件,客户势必要知道组件的信息,com就失去了它的意义了,所以,规定了一个类厂(支持IClassFactory接口),每个组件的类厂都很清楚并且也只清楚该组件的信息,而客户只需要调用com库函数CoCreateInstance就可以了。  
下面是流程图:  
  CoCreateInstance -> CoGetClassObject -> DllGetClassObject -> new ClassFactory -> IClassFactory::CreateInstance() -> new Component
"""

并且在 http://www.codeproject.com/com/comintro2.asp 也看到几段话

"""
每次实现组件对象类的时候,都要写一个旁类负责创建第一个组件对象类的实例。这个旁类就叫这个组件对象类的类工厂(class factory),其唯一目的是创建COM对象。之所以要一个类工厂,是因为语言无关的缘故。COM本身并不创建对象,因为它不是独立于语言的也不是独立于实现的。
当某个客户端想要创建一个COM对象时,COM库就从COM服务器请求类工厂。然后类工厂创建COM对象并将它返回客户端。它们的通讯机制由函数DllGetClassObject()来提供。
"""

在<COM 技术内幕> 中, 对类厂的引入也有描述.
主要是:
a. 在面向对象系统中, 对象创建是非常重要的, 因为要使用它必须先创建它. 所以尽可能灵活的创建对象(component)
b. 在CoCreateInstance 创建对象过程是: 传给一共CLSID, 然后创建成相应组件, 并返回所请求的指针. 其弊端在于无法提供给客户一种控制对象创建过程的方法. (问题关键不在初始化, 而是控制创建对象过程)
c. IClassFactory2 成批的调用接口.


2.
参考CoCreateInstance 的实现过程:
CoCreateInstance -> CoGetClassObject -[系统|组件代码]-> DllGetClassObject -> new ClassFactory -> IClassFactory::CreateInstance() -> new Component

因为 DllGetClassObject -> new ClassFactory -> IClassFactory::CreateInstance() -> new Component 都是组件所来实现的, 而系统调用 CoCreateInstance 所提供的参数, 和通过自己使用IClassFactory 来创建Component 的参数是没有变化的, 所以如果省略 ClassFactory 应该也可以.

CoCreateInstance -> CoGetClassObject -[系统|组件代码]-> DllGetClassObject -> new Component

DllGetClassObject 完全可以完成<COM 技术内幕说的> a. 灵活创建对象, b. 控制创建过程, c. IClassFactory2 , 而且这样子的实现也与语言无关. 
所以感觉没有必要一定要用到IClassFactory 这个接口


3.
因此在实现的时候, 完全可以这样子的实现组件
CCoClass : public IA, public IB, public IClassFactory
{
......
}

DllGetClassObject()
{
new CCoClass
}

而不需要额外的用一个类单独的去实现IClassFactory . 好像ATL 默认的就是这么干的, 提供了一个CComCoClass<CCoClass, &CLSID_CCoClass)  实现类.

这个是我的对COM 的IClassFactory 的理解, 感觉没必要多一个这个东西.

不知道大家是如何看待这个东西的:)

在IIS7.0中出现检索COM工厂中CLSID为{}解决方案 检索 COM工厂中 CLSID 为{00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005 1.在服务器上安装office的Excel软件. 2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" 3:依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置" 4:在"DCOM配置"中找 阅读详情

相关推荐

检索 COM 工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046}

最近用.net写了一个相关word的B/S的程序,部署到2003企业版的服务器上遇到这个错误:检索 COM 工厂中 CLSID 为{00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。在网上搜索一下,找到解决方案 1.对于上面提到的报错,属于用户权限不够,所以需要设置用户相应的权限。 .NET导出Excel、Wo

涵涵的专栏 1824

OCP认证考试心得

本人OCP认证考试亲身经历,分享给大家,仅供参考。 祝好运

chenchen86712的专栏 4万+

COM厂的作用和创建

介绍了怎么样用动态链接库去实现COM,但组件对我们来说仍是不透明的,我们需要知道实现组件DLL的位置,必须自己来加载组件的CreateInstance函数来获得组件的指针.在书中第一篇就曾经提到过:COM组件可以透明地在网络上(或本地)被重新分配位置,而不会影响本地客户程序.所以,由客户端来调用DLL并不是什么好主意.必须有一种更好的办法让组件的实现更透明,更灵活!    于是,就引入了厂的概念

tomorrowsprogress的专栏 3635

Delphi COM编程技术二(COM接口和COM组件)

一、厂(Class Factory) 1、厂的含义:     厂是一种组件或者对象,它就是用于创建其他对象的。COM对象不是由程序直接实例的,COM使用厂来创建对象。每一个COM都有一个相关的厂,负责创建在服务器中实现的COM对象;厂把COM从实际构造一个对象的过

xiongmao000738 5177

解决检索COM工厂中CLSID为{ }组件失败

检索 COM 工厂中 CLSID 为 {XXXX-XXXX-XXX-XXXXX-XXX} 的组件时失败,原因是出现以下错误: 80040154。   如以上问题出现,多半是因为COM控件未在目标机器上面注册造成的   解决方法:   Resvr32 .net中引用控件的名称   如果注册成功,问题不在出现   但是如果是在x64位的系统中,即使控件注册成功,错误依照提示,是因为大多数...

yanzhibo的专栏IlgawME)Y*Ml 4707

com本质论笔记

com本质论 第四章:4.1 这几个术语很有趣:qureyInterface的性质是:对称,自反,可传递的。课堂上学到的这几个术语,用在这里,很恰当。这些理论也总算是有点用了。不负平生所学,哈哈。。。由这三个性质,可以把相关的和接口看成一个图。这个图具有一些有趣的性质。一个对象对同一个接口的qureyInterface,要返回同一个指针。4.2 多重接口名字冲突的解决:第

捉刀人 606

COM系列3】工厂和完整COM

COM组件开发的核心机制包括三个基本接口:IUnknown(提供引用计数和接口查询)、IClassFactory(负责组件实例化)和IDispatch(支持脚本语言调用)。COM通过引用计数管理组件生命周期,工厂模式实现组件创建,注册表存储组件信息。开发时需遵循特定规范,包括接口继承、GUID标识和注册表操作。典型调用流程涉及CoCreateInstance获取接口指针,内部通过工厂创建实例并维护引用计数。跨语言支持通过IDispatch接口实现,为脚本语言提供调用途径。完整的COM组件需要在注册表中注

业精于勤,荒于嬉 875

excel导出(检索com工厂中)8007005

 检索 COM 工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问 1. NET导出Excel遇到的80070005错误的解决方法: 检索 COM 工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败,

我笔记 2161

COM编程入门

文章目录1. COM组件介绍2. COM组件开发2.1 创建COM组件接口2.2 创建COM组件实现2.3 COM组件创建工厂2.4 COM组件的注册3. COM组件使用4.0 COM组件运行机制 1. COM组件介绍 COM组件是什么?COM是一种规范,而不是实现。但是当使用C++来实现时,COM组件就是一个C++,而COM接口就是继承至IUnknown的纯虚COM组件就是实现相应C...

David 3万+

检索 COM 工厂中 CLSID 为

 检索 COM 工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005 症状:oWordApplic = New Word.Application当程序运行到这句时出现下面的错误:检索 COM 工厂中 CLSID 为 {000209FF-0000-0000-C000-

Greenfoliage的专栏 2347

检索com工厂中clsid为的组件失败8007007e_COM编程攻略(十八 组件别)

在上一篇文章Froser:COM编程攻略(十七 型库与型信息)​zhuanlan.zhihu.com中谈到,在ATL dll的注册流程中,去执行AtlComModuleRegisterServer方法,它又会调用AtlRegisterClassCategoriesHelper方法,注册自己的组件别。首先,我们来介绍一下,什么叫作组件别。一、组件别(Component Categories...

weixin_39621456的博客 2673

检索 COM 工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败

uipath操作excel提示: 检索 COM 工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误:80040154 没有注册。 猜测这是由于升级.net (或多个版本)导致的第三方程序未注册。 傻瓜式解决: 卸载office,重装其他版本office。装WPS。 检索 COM 工厂中 CLSID 为...

风铃下的铁塔 4751

检索com工厂中clsid为的组件失败_一个创建Bean对象的工厂

大致流程1.弄个工厂2.把名跟全名放进properties文件里3.去遍历properties文件上的key=value4.再创建一个hashmap,把key,value放进map集合里面5.接着每次都去map集合里面,接着每次拿key就找到对应的全名,并且是单例的AccountDaoImplpackage com.itheima.dao.impl; import com.itheima....

weixin_40003512的博客 577

COM学习:创建、注册与

本文算是对《COM技术内幕》前七章内容的一些总结,当然还有一些疑惑之处,也留作探讨。 (一)COM的注册            按照COM库的实现,注册方式有:            (1)In-process  DllRegisterServer  DllUnRegisterServer            (2)out-process  组件必须实现命令 /regserver /un

xingfu0539的专栏 1154

.Net调用Office Com组件的原理及问题:检索com工厂组件检索 COM 工厂中 CLSID 为 {XXX} 的组件失败

.Net调用Office Com组件的原理及问题:检索com工厂组件检索 COM 工厂中 CLSID 为 {XXX} 的组件失败 Net调用Office Com组件的原理及问题检索com工厂组件检索 COM 工厂中 CLSID 为 XXX 的组件失败 现将文章整理如下 最开始报错 总结如下 我的主页 www.csxiaoyao.com最近在本地64位win10操作系统+vs2015+offi

禅林阆苑 6887

检索 COM 工厂中的组件时失败,原因是出现以下错误: 8007007e

检索 COM 工厂0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC 中的组件时失败,原因是出现以下错误: 8007007e 组件msscript.ocx有错,重新注册一下就好了。 Regsvr32 msscript.ocx 转载于:https://www.cnblogs.com/seamusic/archive/2009/07/12/1521780....

anzuo1006的专栏 1089

解决导出Excel报COM工厂错误的办法--修改版

解决导出Excel报COM工厂错误的办法 1、问题现象 (1)第一种:销售模板的一些报表(如日报、月报等)导出时提示如下信息 (2)第二种:有些模块的一些报表导出时,没有反应,前后台也没报错 如成本管理----动态成本菜单下的报表导出就没反应 2、原因分析 (1)代码问题,目前开发还没解决 (2)服务器配置的权限问题,一般是使用IIS 由于 NETWORK SERVICE 没有权限引起的。 而NETWORK SERVICE 隶属于 Users 这个用户组,所以也需要设...

weixin_41833670的博客 1003

检索com工厂中clsid为的组件失败_向 COM 公开 .NET Core 组件

在 .NET Core 中,与 .NET Framework 相比,向 COM 公开 .NET 对象的过程已明显简化。 下面的过程将引导你如何向 COM 公开。 本教程介绍了如何:从 .NET Core 向 COM 公开。生成 COM 服务器作为构建 .NET Core 库的一部分。自动为无注册表 COM 生成并行服务器清单。先决条件安装 .NET Core 3.0 SDK 或更高版本。创建库...

weixin_39617470的博客 959
下一篇: vs 工程 修改 building前行为(提示用户选择,不保存,保存)
notebook2001a
博客等级 码龄19年 11粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值