.Net调用Office Com组件的原理及问题检索com类工厂组件检索 COM 类工厂中 CLSID 为 {XXX} 的组件失败
我是在本地32位操作系统+vs2010+office2007做创建并下载Excel,ppt文件的操作没有问题,发布到64位系统的服务器上报错,最开始报错::
1:Retrieving the COM class factory for component with CLSID {91493441-5A91-11CF-8700-00AA0060263B} failed due to the following error: 80040154 没有注册类 (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
最开始想到的原因,我的服务器有好几个虚机,其中有好使的,这个不好使难道是因为Excel和ppt是单独安装的,office装的不全,组件没注册上?
在网上(http://support.microsoft.com/kb/828550/zh-cn)查到CLSID 为{91493441-5A91-11CF-8700-00AA0060263B}的组件是office的这个服务owerPoint.Application ,我想既然报错没注册,那就注册吧,在网上找的资料都说要通过C:WindowsSysWOW64 regsvr32注册组件,费了很大的劲也没弄明白要注册哪个dll,最后卸载office,重新安装,报错
(2):Retrieving the COM class factory for component with CLSID {91493441-5A91-11CF-8700-00AA0060263B} failed due to the following error: 80070005 拒绝访问。 (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)).
再接着在网上查资料,说卸载的不干净,要把注册表也删除,好吧,再接再厉重新安装,还是报(2)错,想着是拒绝访问,那是缺少权限啊,根据网上的各种配置权限,还是报错,改变方向,网上(http://edu.cnzz.cn/200810/6270283a.shtml)找到原因可能是在Windows Server 2008 X64中通过.NET程序调用32位com组件的问题,按照其说的,在Visual Studio中,将编译的目标平台(Platform target)设置为:X86,然后重新统计发布项目,错误依旧。
最后终于发现问题,DCOM配置中一直配置的是【Microsoft Office PowerPoint 预览器】 原来一直都配置错地方了,可是DCOM中也没有【Microsoft Office PowerPoint 幻灯片】啊,原来服务器是64位了,没有加载32位的组件,运行中敲入mmc -32,在控制台中‘文件’‘添加/删除管理单元’选择‘组件服务’添加,就会出现【Microsoft Office PowerPoint 幻灯片】,再把一些权限配置上就搞定了。
总结如下:.net调用office组件进行Excel、Word、ppt的一些操作,需要做一下操作:
1、正确全面的安装office
2、DCOM配置权限(64位系统要添加32位组件【mmc -32】)
(1.) 开始-运行-dcomcnfg,启动组件服务。
(2.) 找到Microsoft Excel Application、Microsoft Office PowerPoint 幻灯片、Microsoft Office Word 97 - 2003 文档,-属性 -安全-中所有配置都选择“自定义”,添加用户(SYSTEM、INTERACTIVE、Everyone、Administrators、Administrator、IIS-IUSRS()、Network Services、Network 、USERS),添加“启动和激活权限”、“访问权限”,并赋予本地启动和激活;-标识,交互式用户(不能选择启动用户,会无法结束进程)
下面是一些网上的解决办法:
1、以下引自:http://edu.cnzz.cn/200810/6270283a.shtml
在开发短信接口时,需要调用一个com组件,在本机测试成功。可是部署到Windows Server 2008 X64的服务器上却出现下面的错误:
Retrieving the COM class factory for component with CLSID {79AD7B73-C515-40B4-8B02-CB0F5FA5A1A} failed due to the following error: 80070005
部署时,直接在命令行中通过regsvr32注册com组件。
被这个问题折腾了几个小时,终于找到原因和解决方法。
服务器用的是64-bit的系统,而.NET程序在本机编译时,目标平始选的是Any CPU,这样.NET程序在服务器上会运行于64位环境。
在相关资料中查到, 在64bit的环境中无法访问32位的com组件。
所以只要让.NET程序以32位的方式运行,就能解决问题。
解决方法:
1、通过C:WindowsSysWOW64regsvr32注册组件。
2、在Visual Studio中,将编译的目标平台(Platform target)设置为:X86,然后重新统计项目
2、以下引自:http://www.cnblogs.com/anshangcun/archive/2007/10/24/908101.html
最近因为项目的需要写了一个应用,目的是在B/S架构下实现数据从Excel文档中载入到数据库。在本地开发的时候一切正常,当部署到测试环境下运行的时候出现如下的错误:“检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005”。
这是最简单的一种问题,我一看这个错误就知道是属于组件配置的范畴,可是我没有想到这个问题解决了以后更让我郁闷的事情还在后面。
”怎么解决(前提是Office2007必须正确安装),解决的办法很简单,就是改配置,在命令行中输入dcomcnfg.exe,在“组件服务-我的电脑-找到Microsoft Excel应用程序(在某些版本下会显示Microsoft Excel Application)这一项对其进行配置,步骤如下:
1. 以管理员身份登录到计算机,并使用完整安装来安装(或重新安装)Office。为了实现系统的可靠性,建议您将 Office CD-ROM 中的内容复制到本地驱动器并从此位置安装 Office。
2. 启动要自动运行的 Office 应用程序。这会强制该应用程序进行自我注册。
3. 单击安全选项卡。验证使用默认的访问权限和使用默认的启动权限已选中。
4. 单击确定,关闭属性对话框并返回主应用程序列表对话框。
5. 在 DCOM 配置对话框中,单击默认安全性选项卡。
6. 单击访问权限的编辑默认值。验证访问权限中是否列出下列用户,如果没有列出,则添加这些用户:
SYSTEM
INTERACTIVE
Everyone
Administrators
IUSR_<machinename>*
IWAM_<machinename>*
Network Services
ASPNET
* 这些帐户仅在计算机上安装了 Internet Information Server (IIS) 的情况下才存在。
7. 确保允许每个用户访问,然后单击确定。
8. 单击启动权限的编辑默认值。验证启动权限中是否列出下列用户,如果没有列出,则添加这些用户:
SYSTEM
INTERACTIVE
Everyone
Administrators
IUSR_<machinename>*
IWAM_<machinename>*
Network Services
ASPNET
* 这些帐户仅在计算机上安装有 IIS 的情况下才存在。
9. 确保允许每个用户访问,然后单击确定。
10. 单击确定关闭 DCOMCNFG。
这样配置一番以后再运行OK,于是我的心情很晴朗(我行,我不是一般人)。可是过了一段时候,产品组又说Excel的数据载入功能又不能用了,我运行一番竟然还是这个错误“检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005”。我打开DCOM配置查看,发现和我上一回的配置是完全一样的没有做任何改动,可是运行还是会出现这个错误,我就郁闷了。于是我到网上遍查资料,结果没有一个可以用的,他们出现的问题,都是我曾经解决过的。
于是在DCOM中我打开Microsoft Excel Application重新进行设置,在“标识”标签里选择“下列用户”进行运行。因为我听说这台服务器已经加入域,并且域名是Nanjing.com.cn,于是我就尝试使用nanjing"administrator来运行。
关机,重启,重新运行程序,80070005这个错误终于不出现了,可是出现了一个更要命的错误。“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Excel._Application”。此操作失败的原因是对 IID 为“{000208D5-0000-0000-C000-000000000046}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 加载类型库/DLL 时出错。 (异常来自HRESULT:0x80029C4A (TYPE_E_CANTLOADLIBRARY))。
如果是出现这种错误就很可能是我的组件有问题,要知道那是一个超级复杂的组件,类图就用了很多篇幅。我打开代码仔细的检查,在别人的环境上运行,还是没有问题,我把代码全部屏蔽,只留了一条调用Excel组件的语句,又运行还是报这个错误。
最后只能重新安装Office组件,再试成功了。
当出现类似问题的时候,
1,检查Office组件安装成功否。
2,如果是在B/S构架下进行访问请先给Office组件分配合理的权限(Network Services),如果在域环境下还要考虑域权限。
3,要有自信,找出问题的原因,如果怀疑是自己的代码,可以只留几条调用Excel组件的语句,如果还是报错那肯定就是环境问题。
4,我使用的名字空间是Microsoft.Office.Interop.Excel;
3、以下引自:http://www.cnblogs.com/Tiffany_2008/archive/2010/12/22/1914160.html
今日用到WordToHtml的方法,需要添加对office组件的引用(Microsoft.Office.Interop.Word)
程序集Microsoft.Office.Interop.Word
D:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Word.dll
调用代码如下
using Microsoft.Office.Interop.Word;
ApplicationClass word = new ApplicationClass();
Type wordType = word.GetType();
Documents docs = word.Documents;
//打开文件
Type docsType = docs.GetType();
Document doc = (Document)docsType.InvokeMember("Open",
System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] { wordFilePath, true, true });
//转换格式,另存为
Type docType = doc.GetType();
docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod,
null, doc, new object[] { htmlFileUrl, WdSaveFormat.wdFormatFilteredHTML });
docType.InvokeMember("Close", System.Reflection.BindingFlags.InvokeMethod,
null, doc, null);
//退出 Word
wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod,
null, word, null);
原理显而易见:通过程序启动Word.exe程序,将本地文件打开,做另存为html操作,关闭word文档,退出word程序
程序执行完成后存在两个文件,原有word文件和html文件
本地调试没有任何问题,Windows2003+Vs2008+IIS6.0+Office2007
发布网站,在本机IIS上配置好网站后(读取写入的权限都打钩),登陆上传word文件转换出错,错误异常消息如下:
检索 COM 类工厂中 CLSID 为{00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。
从网上搜帖子答案大致相同:登陆网站的用户没有操作word.exe的权限
好,运行"中输入dcomcnfg.exe启动"组件服务",也可以从管理工具里面进,
"组件服务"- >"计算机"- >"我的电脑"- >"DCOM配置"->找到word->属性->"标识"标签,选择"交互式用户"
->安全"标签"->在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加 一个"NETWORK SERVICE"用户(注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限.
->"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"NETWORK SERVICE"用户,然后赋予"本地访问"权限. 这样,我们便配置好了相应的Excel的DCOM权限.
重启本地机器上的IIS,未重启机器,打开网站测试,OK了,顺便提一下,操作的word文件和html文件夹要有读写的权限才行,右键--安全--Everyone或网络服务用户-->读写权限打钩
接下来,发布到服务器上,外网登陆测试,抛黄页,提示运行时错误 由于不是本地机器的登录用户所以不提示具体的错误信息。
得,从服务器的IIS里面浏览测试,抛出与我机器上同样的错误,吼吼太好了,这下我可以练练手配置一下Dcom权限了,打开组件服务傻眼了
服务器上Windows2008+IIS7.0,在Dcom配置里面没有找到word,看看安装了Office没有,结果是安装了,Office2007,再搜搜帖子windows2008 的,
找了几个帖子无果,看到了xp的组件服务配置,跟winserver2008的差不多,就这个吧
"组件服务"- >"计算机"- >"我的电脑"- >属性-->Com组件->启动和激活权限设置同上->访问权限编辑同上->都添加了Network service用户给用户赋予相应的读写权限
重启IIS了,盼望着盼望着,测试仍然是相同的错误 ,重启服务器,the same result! 我靠
难道用户添加错了吗?难道是AspNet用户吗,可是帖子上说window2000操作系统是这个用户,IIS5.0是添加这个用户,可是服务器上是windows2008+iis7.0 ,哎,试试吧
继续修改重启,仍然无果
网上仍然有招:尽管我还没有试,先贴上再说
在web.config中使用身份模拟,在<system.web>节中加入 <identity impersonate="true" userName="你的用户名" password="密码"/></system.web>
我一直在想,为什么在服务器上DCom配置里面,没有找到Office word 以及Office家族,是不是安装的Vs2008是框架版的没有自动注册Office的一系列组件呢
研究了一些com组件的注册和office的注册,理解了为什么之前说 *.dll(动态类库)和*.exe 都是可执行文件了,网上也有解决的办法是Excel的,贴出来:
注册方法执行 开始----运行----输入excel2003的安装路径,例如 "C:\Program Files\Microsoft Office\OFFICE11\excel.exe" /regserver 注意/符号前面有一个空格,其中"C:\Program Files\Microsoft Office\OFFICE11\excel.exe" 是excel2003的安装程序的路径,参数regserver表示注册的意思!
运行后,会启动Office 2003的安装程序,进行修复,重新注册。
excel2007为默认的启动程序的方法类同,可以执行 开始----运行----"D:\Program Files\Microsoft Office\Office12\excel.exe" /regserver
综上所述,再遇到Excel导出、导入问题时,先考虑权限问题,再考虑office的版本环境!如此基本能够解决这些问题了。
Good!Tomorrow I will have a try!
<--顺便贴出某个帖子的楼主经验:我也遇到过应用以上方法还是报错的情况,我的环境是windows2003 + office2003+office2007,在测试服务器上都可以导出无任何问题!但是更新了正式环境就是报错,权限都设置了还是报错,因为我的测试服务器是默认office启动的,所以我怀疑是office版本环境问题!于是我卸载了office2007,马上测试ok了,但是重启服务器后就产生了have not been Pre-compiled错误,导出页面都无法打开了,于是我又重新安装了office2007,页面可以打开了,但是导出excel时又开始报错!我又把所有的权限重新设置一遍,问题依旧!后来发现两个服务器默认打开excel的程序不一样,测试环境是默认office2003打开,正式环境是office2007打开,于是我在正式环境重新注册office2003,使其同样也是默认office2003打开程序,靠!问题终于解决了---->
.Net调用Office Com组件的原理及问题检索com类工厂组件检索 COM 类工厂中 CLSID 为 {XXX} 的组件失败的更多相关文章
- 解决Office互操作错误"检索COML类工厂中 CLSID为 {xxx}的组件时失败,原因是出现以下错误: 80070005"
Excel为例(其他如Word也适用)文件数据导入时报出以下错误: 检索COML类工厂中 CLSID为 {00024500-0000-0000-C000-000000000046}的组件时失败,原因是 ...
- Office——检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败
检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 8000401a 1.运行dcomcnfg.e ...
- 在IIS上Office Word下载失败,检索 COM 类工厂中 CLSID 为000209FF的组件失败,80070005 拒绝访问。
最近在做一个网站时,有一个下载word文档功能,在本地直接调试是可以下载的,但部署到IIS上就出现问题了. 出现问题如下:Error:下载简历方法出错:检索 COM 类工厂中 CLSID 为 {000 ...
- "检索COM类工厂中 CLSID为 {00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005" 问题的解决
一.故障环境 Windows 2008 .net 3.0 二.故障描述 调用excel组件生成excel文档时页面报错.报错内容一大串,核心是"检索COM类工厂中 CLSID为 {000 ...
- 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败
.NET导出Excel遇到的80070005错误的解决方法: 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败,原因是出 ...
- 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问
检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问 已重装office2 ...
- 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。
错误描述:当在ASP.NET应用程序中引用Microsoft Excel组件,并在程序中调用时,部署到服务器上经常会遇到以下的错误:检索 COM 类工厂中 CLSID 为{00024500-0000- ...
- 检索COML类工厂中 CLSID为 {00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005" 《终结篇》
可以看到报出的异常类型为:UnauthorizedAccessException,没有权限访问,表明我们需要配置执行操作账户的COM访问权限. 由于系统是Windows Server 2008 64位 ...
- 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败解决方案
第一种方法测试过可用:地址:http://download.csdn.net/detail/itjjfamily/8853509 下面是第二种: .NET导出Excel遇到的80070005错误的解决 ...
随机推荐
- sqlite--代码操作
1.创建数据库 NSString * docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainM ...
- angularjs使用ng-messages的注册表单实例
<!DOCTYPE html> <html lang="zh-CN" ng-app="app"> <head> <me ...
- poj3252 组合数学
题目大意:给两个数字a,b求出[a,b]中转化成二进制后0的个数大于等于1的个数的数 例如1100转化成10-11,100-111,1000-1011,1100.保证每个区段都有1打头,然后有一段数字 ...
- TCP/IP 要点备忘
1. 3次握手/4次挥手过程,以及状态变化: 2. RTT,TTL,TOS(8位服务类型,最小延时.最大吞吐.最高可用.最小费用). 3. TimeWait(2msl)状态,防止最后一个ack丢失 4 ...
- MFC 点击改变文本 加法计时器 伸缩窗体
1.添加所需控件,设置ID:labNum1,txtNum1.txtNum2.txtNum3.btnAdd,并将labNum1的属性Notify->true(控件在被单击或双击时可以发送消息) 2 ...
- 【课上OJ】掉入陷阱的数
对任意一个自然数N0,先将其各位数字相加求和,再将其和乘以3后加上1,变成一个新自然数N1,然后对N1重复这种操作,可以产生新自然数N2,多次重复这种操作运算,运算结果最终会得到一个固定不变的数Nk, ...
- Window Ghosting(仍可拖动失去响应的窗口,因为我们真正的窗口已经让系统用Ghosting窗口替代了。使用IsHungAppWindow 探测)
最近工作中遇到Window Ghosting这个问题, 感觉挺有意思,这里简单记录下. 在XP时代我们的程序没有响应后只能通过任务管理器强制杀掉,但是Vista之后情况变了, 我们仍然可以拖动 ...
- authbind start tomcat services as user with less that 1024 ports. linux常规用户使用tomcat的80端口
Start tomcat services using authbind this will allow user to start ports less than 1024 we do not ne ...
- 【 Failed to create the Java Virtual Machine】的2种解决方式
初学Android,下载并安装好了eclipse,ADT和SDK之后,打开Eclipse时,出现: Failed to create the Java Virtual Machine 点击确定,ecl ...
- bzoj3629[JLOI2014]聪明的燕姿
http://www.lydsy.com/JudgeOnline/problem.php?id=3629 搜索. 我们知道: 如果$N=\prod\limits_{i=1}^{m}p_{i}^{k_{ ...