.Net調用Office Com組件的原理及問題檢索com類工廠組件檢索 COM 類工廠中 CLSID 爲 {XXX} 的組件失敗

我是在本地32位操做系統+vs2010+office2007作建立並下載Excel,ppt文件的操做沒有問題,發佈到64位系統的服務器上報錯,最開始報錯::html

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)).web

最開始想到的緣由,個人服務器有好幾個虛機,其中有好使的,這個很差使難道是由於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,從新安裝,報錯windows

(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的一些操做,須要作一下操做:架構

一、正確全面的安裝office 框架

二、DCOM配置權限(64位系統要添加32位組件【mmc -32】)ide

(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),添加「啓動和激活權限」、「訪問權限」,並賦予本地啓動和激活;-標識,交互式用戶(不能選擇啓動用戶,會沒法結束進程)

下面是一些網上的解決辦法:

 一、如下引自: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位的方式運行,就能解決問題。

  解決方法:

  一、經過C:WindowsSysWOW64regsvr32註冊組件。

  二、在Visual Studio中,將編譯的目標平臺(Platform target)設置爲:X86,而後從新統計項目

 

二、如下引自:http://www.cnblogs.com/anshangcun/archive/2007/10/24/908101.html

最近由於項目的須要寫了一個應用,目的是在B/S架構下實現數據從Excel文檔中載入到數據庫。在本地開發的時候一切正常,當部署到測試環境下運行的時候出現以下的錯誤:「檢索 COM 類工廠中 CLSID  {00024500-0000-0000-C000-000000000046} 的組件時失敗,緣由是出現如下錯誤: 80070005」。

這是最簡單的一種問題,我一看這個錯誤就知道是屬於組件配置的範疇,但是我沒有想到這個問題解決了之後更讓我鬱悶的事情還在後面

         先說一下「錯誤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;

 

三、如下引自: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打開程序,靠!問題終於解決了---->

相關文章
相關標籤/搜索